diff --git a/modules/top-level/plugins/mk-plugin-pack.nix b/modules/top-level/plugins/mk-plugin-pack.nix index 6bb7adc2..e0f6e8b3 100644 --- a/modules/top-level/plugins/mk-plugin-pack.nix +++ b/modules/top-level/plugins/mk-plugin-pack.nix @@ -28,24 +28,38 @@ let (builtins.concatMap (f: f ps)) ]; - # Combined plugin - combinedPlugin = pkgs.vimUtils.toVimPlugin ( - pkgs.buildEnv { - name = "plugin-pack"; - paths = overriddenPlugins; - inherit pathsToLink; + # propagatedBuildInputs contain lua dependencies + propagatedBuildInputs = lib.pipe pluginsToCombine [ + (builtins.catAttrs "plugin") + (builtins.catAttrs "propagatedBuildInputs") + builtins.concatLists + lib.unique + ]; - # Remove empty directories and activate vimGenDocHook - # TODO: figure out why we are running the `preFixup` hook in `postBuild` - postBuild = '' - find $out -type d -empty -delete - runHook preFixup - ''; - passthru = { - inherit python3Dependencies; - }; - } - ); + # Combined plugin + combinedPlugin = + lib.pipe + { + name = "plugin-pack"; + paths = overriddenPlugins; + inherit pathsToLink; + + # buildEnv uses runCommand under the hood. runCommand doesn't run any build phases. + # To run custom commands buildEnv takes postBuild argument. + # fixupPhase is used for propagating build inputs and to trigger vimGenDocHook + postBuild = '' + find $out -type d -empty -delete + fixupPhase + ''; + passthru = { + inherit python3Dependencies; + }; + } + [ + pkgs.buildEnv + pkgs.vimUtils.toVimPlugin + (drv: drv.overrideAttrs { inherit propagatedBuildInputs; }) + ]; # Combined plugin configs combinedConfig = lib.pipe pluginsToCombine [ diff --git a/tests/test-sources/modules/performance/combine-plugins.nix b/tests/test-sources/modules/performance/combine-plugins.nix index ad8eb840..58024b3f 100644 --- a/tests/test-sources/modules/performance/combine-plugins.nix +++ b/tests/test-sources/modules/performance/combine-plugins.nix @@ -69,6 +69,17 @@ let pluginWithPyDeps3 = mkPlugin "plugin-with-py-deps-3" { passthru.python3Dependencies = ps: [ ps.requests ]; }; + # Plugins with Lua dependencies + ensureDep = + drv: dep: + drv.overrideAttrs (prev: { + propagatedBuildInputs = lib.unique ( + prev.propagatedBuildInputs or [ ] ++ [ prev.passthru.lua.pkgs.${dep} ] + ); + }); + pluginWithLuaDeps1 = ensureDep pkgs.vimPlugins.telescope-nvim "plenary-nvim"; + pluginWithLuaDeps2 = ensureDep pkgs.vimPlugins.nvim-cmp "plenary-nvim"; + pluginWithLuaDeps3 = ensureDep pkgs.vimPlugins.gitsigns-nvim "nui-nvim"; in { # Test basic functionality @@ -222,6 +233,35 @@ in ]; }; + # Test that plugin lua dependencies are handled + lua-dependencies = + { config, ... }: + { + performance.combinePlugins.enable = true; + extraPlugins = [ + simplePlugin1 + # Duplicated plenary-nvim dependency + pluginWithLuaDeps1 + pluginWithLuaDeps2 + # nui-nvim dependency + pluginWithLuaDeps3 + ]; + extraConfigLuaPost = '' + -- All packages and its dependencies are importable + require("telescope") + require("plenary") + require("cmp") + require("gitsigns") + require("nui.popup") + ''; + assertions = [ + { + assertion = pluginCount config.build.nvimPackage config.build.extraFiles "start" == 1; + message = "More than one plugin is defined in packpathDirs."; + } + ]; + }; + # Test that optional plugins are handled optional-plugins = { config, ... }: