Skip to content

Commit 34a1480

Browse files
authored
refactor: pre-push hook resilience and push interrupting on files cha… (#3098)
* refactor: pre-push hook resilience and push interrupting on files changed * Update pre-push * Update pre-push
1 parent d777780 commit 34a1480

File tree

1 file changed

+47
-15
lines changed

1 file changed

+47
-15
lines changed

.husky/pre-push

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,35 @@
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
1946
fi
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
4476
done
4577

0 commit comments

Comments
 (0)