1- # Configuration: Each entry is an array with [pattern, command, description]
2- # Format: "pattern" "command" "pattern description"
3- CHECKS=(
4- '^(package\.json|package-lock\.json)$' 'pnpm install --package-lock --ignore-scripts' 'package.json or package-lock.json – please run npm install to update dependencies'
1+ # Configuration: Define checks as functions for better maintainability
2+ # Each check function should:
3+ # - Define a PATTERN variable for file matching
4+ # - Define a COMMAND variable for the command to run
5+ # - Define a DESCRIPTION variable for user feedback
6+
7+ check_npm_files() {
8+ PATTERN='^(package\.json|package-lock\.json)$'
9+ COMMAND='npm install --package-lock-only --ignore-scripts'
10+ DESCRIPTION='package.json or package-lock.json – please run npm install to update dependencies'
11+ }
12+
13+ check_pnpm_files() {
14+ PATTERN='^(package\.json|pnpm-lock\.yaml)$'
15+ COMMAND='pnpm install --lockfile-only --ignore-scripts'
16+ DESCRIPTION='package.json or pnpm-lock.yaml – please run pnpm install to update dependencies'
17+ }
18+
19+ # List of all check functions
20+ # Detect the lock file to determine the package manager
21+ if [ -f "pnpm-lock.yaml" ]; then
22+ CHECK_FUNCTIONS=(
23+ "check_pnpm_files"
524)
25+ elif [ -f "package-lock.json" ]; then
26+ CHECK_FUNCTIONS=(
27+ "check_npm_files"
28+ )
29+ else
30+ echo "No lock file detected for pnpm or npm. Aborting pre-push checks."
31+ exit 1
32+ fi
633
734# Check for changes in specified files before pushing and run corresponding commands
835## Get the upstream branch
@@ -19,27 +46,32 @@ if [ -z "$UPSTREAM" ]; then
1946fi
2047
2148## Get the list of files changed between upstream and HEAD
22- FILES=$(git diff --name-only $UPSTREAM..HEAD)
49+ FILES=$(git diff --name-only " $UPSTREAM" ..HEAD)
2350
2451## Check each pattern and run corresponding command
25- for ((i=0; i<${#CHECKS[@]}; i+=3)); do
26- pattern="${CHECKS[i]}"
27- command="${CHECKS[i+1]}"
28- description="${CHECKS[i+2]}"
52+ for check_function in "${CHECK_FUNCTIONS[@]}"; do
53+ # Call the check function to set variables
54+ $check_function
2955
30- if echo "$FILES" | grep -qE "$pattern "; then
31- echo "Detected changes in $description "
56+ if echo "$FILES" | grep -qE "$PATTERN "; then
57+ echo "Detected changes in $DESCRIPTION "
3258
3359 ## Run the corresponding command
34- eval "$command"
60+ $COMMAND
3561
3662 if [ $? -ne 0 ]; then
37- echo "Command failed: $command . Aborting push."
63+ echo "Command failed: $COMMAND . Aborting push."
3864 exit 1
3965 fi
4066
41- # Exit after first match to avoid running multiple commands
42- exit 0
67+ # Check for file modifications after running the command
68+ MODIFIED_FILES=$(git diff --name-only)
69+ if [ -n "$MODIFIED_FILES" ]; then
70+ echo "Detected file modifications after running $COMMAND:"
71+ echo "$MODIFIED_FILES"
72+ echo "Please stage the changes before pushing."
73+ exit 1
74+ fi
4375 fi
4476done
4577
0 commit comments