Files
registry/scripts/validate_set_u_order.sh
2025-11-27 12:00:04 +05:00

74 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eo pipefail
# Validates that shell scripts source external files BEFORE enabling 'set -u'
# This prevents failures when sourced files (like /etc/bashrc) reference undefined variables
#
# Background: When 'set -u' is active, any reference to undefined variables causes the script to exit.
# System files like /etc/bashrc may reference variables (like $EUID) that aren't set in the script context.
#
# Correct pattern:
# #!/bin/bash
# source "$HOME/.bashrc" # Source first
# set -euo pipefail # Then enable strict mode
#
# Incorrect pattern:
# #!/bin/bash
# set -euo pipefail # set -u enabled first
# source "$HOME/.bashrc" # This may fail if bashrc references undefined vars
echo "==> Validating 'set -u' usage order in shell scripts..."
# Track if we found any issues
found_issues=0
total_checked=0
# Find all shell scripts
while IFS= read -r file; do
# Skip if file doesn't exist (should not happen, but be safe)
[[ -f "$file" ]] || continue
# Check if file has both 'set -u' and 'source'/'.'
# Look for: set -u, set -eu, set -euo, set -uo, etc.
# Only check for sourcing common system/user files that might have undefined variables
if grep -q "^set -[a-z]*u" "$file" && grep -q -E "^\s*(source|\.)\s+.*(\\\$HOME/\.bashrc|/etc/bashrc|/etc/os-release)" "$file"; then
total_checked=$((total_checked + 1))
# Get the first occurrence of each pattern with line numbers
set_u_line=$(grep -n "^set -[a-z]*u" "$file" | head -1 | cut -d: -f1)
source_line=$(grep -n -E "^\s*(source|\.)\s+.*(\\\$HOME/\.bashrc|/etc/bashrc|/etc/os-release)" "$file" | head -1 | cut -d: -f1)
# Check if set -u comes before source (which is problematic)
if [[ "$set_u_line" -lt "$source_line" ]]; then
echo "ERROR: $file"
echo " 'set -u' at line $set_u_line comes before 'source' at line $source_line"
echo " This may cause failures when sourcing system files with undefined variables."
echo ""
found_issues=$((found_issues + 1))
fi
fi
done < <(find registry -name "*.sh" -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/.terraform/*" | sort)
# Report results
if [[ $found_issues -gt 0 ]]; then
echo "================================================================"
echo "FAILED: Found $found_issues script(s) with incorrect 'set -u' order"
echo ""
echo "Fix: Move 'source' statements BEFORE 'set -u' to prevent failures"
echo "Example:"
echo " #!/bin/bash"
echo " source \"\$HOME/.bashrc\" # Source first"
echo " set -euo pipefail # Then enable strict mode"
echo ""
echo "See: SHELLCHECK_RESEARCH_REPORT.md for detailed analysis"
echo "================================================================"
exit 1
fi
if [[ $total_checked -eq 0 ]]; then
echo "No scripts found with both 'set -u' and 'source' statements"
else
echo "All $total_checked script(s) have correct 'set -u' ordering"
fi