1#shellcheck shell=bash
2# Setup hook for checking whether Lua imports succeed
3echo "Sourcing neovim-require-check-hook.sh"
4
5# Discover modules automatically if nvimRequireCheck is not set
6discover_modules() {
7 echo "Running module discovery in source directory..."
8
9 # Create unique lists so we can organize later
10 modules=()
11
12 while IFS= read -r lua_file; do
13 # Ignore certain infra directories
14 if [[ "$lua_file" =~ (^|/)(debug|script|scripts|test|tests|spec)(/|$) || "$lua_file" =~ .*\meta.lua ]]; then
15 continue
16 # Ignore optional telescope and lualine modules
17 elif [[ "$lua_file" =~ ^lua/telescope/_extensions/(.+)\.lua || "$lua_file" =~ ^lua/lualine/(.+)\.lua ]]; then
18 continue
19 # Grab main module names
20 elif [[ "$lua_file" =~ ^lua/([^/]+)/init.lua$ ]]; then
21 echo "$lua_file"
22 modules+=("${BASH_REMATCH[1]}")
23 # Check other lua files
24 elif [[ "$lua_file" =~ ^lua/(.*)\.lua$ ]]; then
25 echo "$lua_file"
26 # Replace slashes with dots to form the module name
27 module_name="${BASH_REMATCH[1]//\//.}"
28 modules+=("$module_name")
29 elif [[ "$lua_file" =~ ^([^/.][^/]*)\.lua$ ]]; then
30 echo "$lua_file"
31 modules+=("${BASH_REMATCH[1]}")
32 fi
33 done < <(find "$src" -name '*.lua' | xargs -n 1 realpath --relative-to="$src")
34
35 nvimRequireCheck=("${modules[@]}")
36 echo "Discovered modules: ${nvimRequireCheck[*]}"
37
38 if [ "${#nvimRequireCheck[@]}" -eq 0 ]; then
39 echo "No valid Lua modules found; skipping check"
40 return 1
41 fi
42 return 0
43}
44
45# Run require checks on each module in nvimRequireCheck
46run_require_checks() {
47 echo "Starting require checks"
48 check_passed=false
49 failed_modules=()
50 successful_modules=()
51
52 export HOME="$TMPDIR"
53 local deps="${dependencies[*]}"
54 local nativeCheckInputs="${nativeBuildInputs[*]}"
55 local checkInputs="${buildInputs[*]}"
56 set +e
57
58 if [ -v 'nvimSkipModule' ]; then
59 nvimSkipModules=("${nvimSkipModule[@]}")
60 echo "WARNING: nvimSkipModule got renamed to nvimSkipModules, please update package $name"
61 fi
62
63 for name in "${nvimRequireCheck[@]}"; do
64 local skip=false
65 for module in "${nvimSkipModules[@]}"; do
66 if [[ "$module" == "$name" ]]; then
67 echo "$name is in list of modules to not check. Skipping..."
68 skip=true
69 break
70 fi
71 done
72
73 if [ "$skip" = false ]; then
74 echo "Attempting to require module: $name"
75 if @nvimBinary@ -es --headless -n -u NONE -i NONE --clean -V1 \
76 --cmd "set rtp+=$out,${deps// /,}" \
77 --cmd "set rtp+=$out,${nativeCheckInputs// /,}" \
78 --cmd "set rtp+=$out,${checkInputs// /,}" \
79 --cmd "lua require('$name')"; then
80 check_passed=true
81 successful_modules+=("$name")
82 echo "Successfully required module: $name"
83 else
84 echo "Failed to require module: $name"
85 failed_modules+=("$name")
86 fi
87 fi
88 done
89 set -e
90}
91
92# Define color codes
93GREEN="\033[0;32m"
94RED="\033[0;31m"
95NC="\033[0m" # No Color
96
97# Print summary of the require checks
98print_summary() {
99 echo -e "\n======================================================"
100 if [[ "$check_passed" == "true" ]]; then
101 echo -e "${GREEN}Require check succeeded for the following modules:${NC}"
102 for module in "${successful_modules[@]}"; do
103 echo -e " ${GREEN}- $module${NC}"
104 done
105 echo "All lua modules were checked."
106 else
107 echo -e "${RED}No successful require checks.${NC}"
108 fi
109
110 # Print any modules that failed with improved formatting and color
111 if [ "${#failed_modules[@]}" -gt 0 ]; then
112 echo -e "\n${RED}Require check failed for the following modules:${NC}"
113 for module in "${failed_modules[@]}"; do
114 echo -e " ${RED}- $module${NC}"
115 done
116 echo -e "\n${RED}Checkout https://nixos.org/manual/nixpkgs/unstable/#testing-neovim-plugins-neovim-require-check${NC}"
117 fi
118 echo "======================================================"
119
120 if [ "${#failed_modules[@]}" -gt 0 ]; then
121 return 1
122 fi
123}
124
125# Main entry point: orchestrates discovery, require checks, and summary
126neovimRequireCheckHook() {
127 echo "Executing neovimRequireCheckHook"
128
129 if [ "${nvimRequireCheck[*]}" = "" ]; then
130 echo "nvimRequireCheck is empty; entering discovery mode"
131 # Auto-discovery mode
132 if ! discover_modules; then
133 echo "No modules found during discovery; exiting hook"
134 return
135 fi
136 else
137 echo "nvimRequireCheck is pre-populated; entering manual check mode"
138 fi
139
140 run_require_checks
141 print_summary
142}
143
144echo "Using neovimRequireCheckHook"
145appendToVar preDistPhases neovimRequireCheckHook