From 26be35531b6528d5436477e6442bc2f76a871d0e Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Wed, 3 Jun 2026 09:48:54 -0500 Subject: [PATCH 1/3] neovim-require-check-hook: discover modules from output Automatic discovery previously scanned src, but install hooks can move Lua modules before neovimRequireCheckHook runs. Scan out instead so require checks cover the installed plugin layout. --- .../editors/vim/plugins/hooks/neovim-require-check-hook.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh b/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh index 60e6d6758198..bd3ea95e9470 100644 --- a/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh +++ b/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh @@ -4,7 +4,7 @@ echo "Sourcing neovim-require-check-hook.sh" # Discover modules automatically if nvimRequireCheck is not set discover_modules() { - echo "Running module discovery in source directory..." + echo "Running module discovery in output directory..." # Create unique lists so we can organize later modules=() @@ -30,7 +30,7 @@ discover_modules() { echo "$lua_file" modules+=("${BASH_REMATCH[1]}") fi - done < <(find "$src" -name '*.lua' | xargs -n 1 realpath --relative-to="$src") + done < <(find "$out" -name '*.lua' -exec realpath --relative-to="$out" {} +) nvimRequireCheck=("${modules[@]}") echo "Discovered modules: ${nvimRequireCheck[*]}" From 182051dd871a706879aee9a72cd227d3c87eddfa Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Wed, 3 Jun 2026 09:49:16 -0500 Subject: [PATCH 2/3] buildNeovimPlugin: test require checks Add regression coverage showing neovimRequireCheckHook runs for a luarocks-backed buildNeovimPlugin derivation after module discovery scans the installed output. --- .../editors/neovim/tests/default.nix | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/pkgs/applications/editors/neovim/tests/default.nix b/pkgs/applications/editors/neovim/tests/default.nix index 20045b23a10a..a7a31ea4e65e 100644 --- a/pkgs/applications/editors/neovim/tests/default.nix +++ b/pkgs/applications/editors/neovim/tests/default.nix @@ -9,6 +9,7 @@ */ { vimUtils, + neovimUtils, writeText, neovim, vimPlugins, @@ -491,4 +492,37 @@ pkgs.lib.recurseIntoAttrs rec { ''; passthru.requiredLuaModules = [ luassert ]; }; + + nvim_require_check_neovim_plugin = + let + luaPkg = neovim-unwrapped.lua.pkgs.buildLuarocksPackage { + pname = "neovim-require-check-fails"; + version = "0.0.1-1"; + src = runCommandLocal "neovim-require-check-fails-src" { } '' + mkdir -p "$out" + cat > "$out/neovim-require-check-fails-0.0.1-1.rockspec" <<'EOF' + package = "neovim-require-check-fails" + version = "0.0.1-1" + source = { + url = "." + } + build = { + type = "none" + } + EOF + ''; + }; + in + testers.testBuildFailure ( + neovimUtils.buildNeovimPlugin { + luaAttr = luaPkg; + doCheck = true; + postInstall = '' + mkdir -p "$out/lua" + cat > "$out/lua/require_check_fails.lua" <<'EOF' + error("neovimRequireCheckHook required installed module") + EOF + ''; + } + ); } From 1dd55d9d814df9ca0694af240085e98ebd841c09 Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Wed, 3 Jun 2026 09:50:06 -0500 Subject: [PATCH 3/3] neovim-require-check-hook: ignore test and metadata modules Installed plugin outputs can include test or metadata Lua files next to runtime modules. Skip common directory and filename patterns during automatic discovery so require checks stay focused on importable runtime modules. Add regression coverage for ignored directories and test/meta module filenames. --- .../editors/neovim/tests/default.nix | 33 +++++++++++++++++++ .../hooks/neovim-require-check-hook.sh | 18 +++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/pkgs/applications/editors/neovim/tests/default.nix b/pkgs/applications/editors/neovim/tests/default.nix index a7a31ea4e65e..de18a630cca4 100644 --- a/pkgs/applications/editors/neovim/tests/default.nix +++ b/pkgs/applications/editors/neovim/tests/default.nix @@ -525,4 +525,37 @@ pkgs.lib.recurseIntoAttrs rec { ''; } ); + + nvim_require_check_ignores_test_modules = vimUtils.buildVimPlugin { + pname = "neovim-require-check-ignores-test-modules"; + version = "0"; + src = runCommandLocal "neovim-require-check-ignores-test-modules-src" { } '' + mkdir -p \ + "$out/lua/require-check-ignores"/{debug,script,scripts,test,tests,spec,_meta} \ + "$out/lua/require-check-ignores" + cat > "$out/lua/require-check-ignores/init.lua" <<'EOF' + return {} + EOF + for dir in debug script scripts test tests spec _meta; do + cat > "$out/lua/require-check-ignores/$dir/failing.lua" < "$out/lua/require-check-ignores/failing_meta.lua" <<'EOF' + error("excluded _meta module was required") + EOF + cat > "$out/lua/require-check-ignores/failing_spec.lua" <<'EOF' + error("excluded _spec module was required") + EOF + cat > "$out/lua/require-check-ignores/failing.spec.lua" <<'EOF' + error("excluded .spec module was required") + EOF + cat > "$out/lua/require-check-ignores/failing.test.lua" <<'EOF' + error("excluded .test module was required") + EOF + cat > "$out/lua/require-check-ignores/meta.lua" <<'EOF' + error("excluded meta module was required") + EOF + ''; + }; } diff --git a/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh b/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh index bd3ea95e9470..5a309207cc53 100644 --- a/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh +++ b/pkgs/applications/editors/vim/plugins/hooks/neovim-require-check-hook.sh @@ -10,11 +10,21 @@ discover_modules() { modules=() while IFS= read -r lua_file; do - # Ignore certain infra directories - if [[ "$lua_file" =~ (^|/)(debug|script|scripts|test|tests|spec)(/|$) || "$lua_file" =~ .*\meta.lua ]]; then - continue + # Ignore infrastructure directories and non-runtime module files + case "/$lua_file/" in + */debug/* | */script/* | */scripts/* | */test/* | */tests/* | */spec/* | */_meta/*) + continue + ;; + esac + + case "${lua_file##*/}" in + *meta.lua | *_spec.lua | *.spec.lua | *.test.lua) + continue + ;; + esac + # Ignore optional telescope and lualine modules - elif [[ "$lua_file" =~ ^lua/telescope/_extensions/(.+)\.lua || "$lua_file" =~ ^lua/lualine/(.+)\.lua ]]; then + if [[ "$lua_file" =~ ^lua/telescope/_extensions/(.+)\.lua || "$lua_file" =~ ^lua/lualine/(.+)\.lua ]]; then continue # Grab main module names elif [[ "$lua_file" =~ ^lua/([^/]+)/init.lua$ ]]; then