Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at devShellTools-shell 145 lines 5.0 kB view raw
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