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"
5
24
)
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
6
33
7
34
# Check for changes in specified files before pushing and run corresponding commands
8
35
## Get the upstream branch
@@ -19,27 +46,32 @@ if [ -z "$UPSTREAM" ]; then
19
46
fi
20
47
21
48
## 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)
23
50
24
51
## 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
29
55
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 "
32
58
33
59
## Run the corresponding command
34
- eval "$command"
60
+ $COMMAND
35
61
36
62
if [ $? -ne 0 ]; then
37
- echo "Command failed: $command . Aborting push."
63
+ echo "Command failed: $COMMAND . Aborting push."
38
64
exit 1
39
65
fi
40
66
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
43
75
fi
44
76
done
45
77
0 commit comments