Merge branch 'ad/commit-have-m-option' into maint
[git] / t / t7503-pre-commit-hook.sh
1 #!/bin/sh
2
3 test_description='pre-commit hook'
4
5 . ./test-lib.sh
6
7 test_expect_success 'with no hook' '
8
9         echo "foo" > file &&
10         git add file &&
11         git commit -m "first"
12
13 '
14
15 test_expect_success '--no-verify with no hook' '
16
17         echo "bar" > file &&
18         git add file &&
19         git commit --no-verify -m "bar"
20
21 '
22
23 # now install hook that always succeeds
24 HOOKDIR="$(git rev-parse --git-dir)/hooks"
25 HOOK="$HOOKDIR/pre-commit"
26 mkdir -p "$HOOKDIR"
27 cat > "$HOOK" <<EOF
28 #!/bin/sh
29 exit 0
30 EOF
31 chmod +x "$HOOK"
32
33 test_expect_success 'with succeeding hook' '
34
35         echo "more" >> file &&
36         git add file &&
37         git commit -m "more"
38
39 '
40
41 test_expect_success '--no-verify with succeeding hook' '
42
43         echo "even more" >> file &&
44         git add file &&
45         git commit --no-verify -m "even more"
46
47 '
48
49 # now a hook that fails
50 cat > "$HOOK" <<EOF
51 #!/bin/sh
52 exit 1
53 EOF
54
55 test_expect_success 'with failing hook' '
56
57         echo "another" >> file &&
58         git add file &&
59         test_must_fail git commit -m "another"
60
61 '
62
63 test_expect_success '--no-verify with failing hook' '
64
65         echo "stuff" >> file &&
66         git add file &&
67         git commit --no-verify -m "stuff"
68
69 '
70
71 chmod -x "$HOOK"
72 test_expect_success POSIXPERM 'with non-executable hook' '
73
74         echo "content" >> file &&
75         git add file &&
76         git commit -m "content"
77
78 '
79
80 test_expect_success POSIXPERM '--no-verify with non-executable hook' '
81
82         echo "more content" >> file &&
83         git add file &&
84         git commit --no-verify -m "more content"
85
86 '
87 chmod +x "$HOOK"
88
89 # a hook that checks $GIT_PREFIX and succeeds inside the
90 # success/ subdirectory only
91 cat > "$HOOK" <<EOF
92 #!/bin/sh
93 test \$GIT_PREFIX = success/
94 EOF
95
96 test_expect_success 'with hook requiring GIT_PREFIX' '
97
98         echo "more content" >> file &&
99         git add file &&
100         mkdir success &&
101         (
102                 cd success &&
103                 git commit -m "hook requires GIT_PREFIX = success/"
104         ) &&
105         rmdir success
106 '
107
108 test_expect_success 'with failing hook requiring GIT_PREFIX' '
109
110         echo "more content" >> file &&
111         git add file &&
112         mkdir fail &&
113         (
114                 cd fail &&
115                 test_must_fail git commit -m "hook must fail"
116         ) &&
117         rmdir fail &&
118         git checkout -- file
119 '
120
121 test_expect_success 'check the author in hook' '
122         write_script "$HOOK" <<-\EOF &&
123         test "$GIT_AUTHOR_NAME" = "New Author" &&
124         test "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"
125         EOF
126         test_must_fail git commit --allow-empty -m "by a.u.thor" &&
127         (
128                 GIT_AUTHOR_NAME="New Author" &&
129                 GIT_AUTHOR_EMAIL="newauthor@example.com" &&
130                 export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
131                 git commit --allow-empty -m "by new.author via env" &&
132                 git show -s
133         ) &&
134         git commit --author="New Author <newauthor@example.com>" \
135                 --allow-empty -m "by new.author via command line" &&
136         git show -s
137 '
138
139 test_done