-
Notifications
You must be signed in to change notification settings - Fork 5
/
pre-commit
109 lines (80 loc) · 2.56 KB
/
pre-commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/bin/bash
# Check for merge conflicts and PHP / JS errors
# Version 1.2
# By @dave1010
# Tested on Linux (and Windows with git-bash, a bit)
# Requires git, grep and php to be in $PATH
# If any commands aren't in the path then the check will be skipped
#
# Installation (per-project):
# 1) Copy this file to <project>/.git/hooks/pre-commit
# 2) (Unix only) make sure it's executable
# Installation (global):
# 1) Copy this file to
# Unix: /usr/share/git-core/templates/hooks/pre-commit
# Windows: C:\Program Files (x86)\Git\share\git-core\templates\hooks
# 2) (Unix only) make sure it's executable
# 3) Run "git init" in a project to automatically get the template
# Changelog
# 0.1 Merge conflict checking
# 0.2 Basic PHP linting
# 0.3 Clean up
# 0.4 JSHint
# 1.0 PHP short tags
# 1.1 Split PHP linting and short tag checking
# 1.2 Capatability for grep without "-P" option
# CONFIG
# Give options empty values to bypass checks ("OPTIONNAME=")
# whether to check ig git merge conflicts have been added
CONFLICTS=1
# whether to check for php short tags
PHPSHORTTAGS=1
# full path to your grep executable if not in $PATH
GREP=`which grep`
# full path to your PHP executable if not in $PATH
PHP=`which php`
# full path to your jshint executable if not in $PATH
JSHINT=`which jshint`
# Simple check for merge conflics
if [[ -n $CONFLICTS ]]; then
conflicts=`git diff --cached --name-only -S'<<<<<< HEAD'`
if [ -n "$conflicts" ]; then
echo "Unresolved merge conflicts in this commit:"
echo $conflicts
fi
fi
# Check PHP files for short tags
if [[ -n $PHPSHORTTAGS && -n $GREP ]]; then
for i in `git diff --cached --name-only | grep '.php'`; do
thisshortphptags=`grep -E '<\?' "$i" | grep -v '<\?php' | grep -v '<\?xml'`
if [ -n "$thisshortphptags" ]; then
echo "PHP short tags added in file: " $i
phpshorttags='true'
fi
done
fi
# Check PHP files for syntax errors
if [[ -n $PHP && -n $GREP ]]; then
for i in `git diff --cached --name-only | grep '.php'`; do
thisphperror=`$PHP -l "$i" | grep -v 'No syntax errors detected in'`
if [ -n "$thisphperror" ]; then
echo "PHP errors added in file: " $i
phperrors='true'
fi
done
fi
# Check JavaScript files for syntax errors and poor coding practices
if [[ -n $JSHINT && -n $GREP ]]; then
for i in `git diff --cached --name-only | grep '.js'`; do
$JSHINT "$i"
if [ $? -ne 0 ]; then
jshinterrors='true'
fi
done
fi
# Something went wrong
if [[ -n "$conflicts" || -n "$phperrors" || -n "$jshinterrors" || -n "$phpshorttags" ]]; then
echo
echo "Commit with '-n' to bypass checks"
exit 1
fi