Merge git://ozlabs.org/~paulus/gitk
[git] / t / t5407-post-rewrite-hook.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2010 Thomas Rast
4 #
5
6 test_description='Test the post-rewrite hook.'
7 . ./test-lib.sh
8
9 test_expect_success 'setup' '
10         test_commit A foo A &&
11         test_commit B foo B &&
12         test_commit C foo C &&
13         test_commit D foo D &&
14         git checkout A^0 &&
15         test_commit E bar E &&
16         test_commit F foo F &&
17         git checkout master
18 '
19
20 mkdir .git/hooks
21
22 cat >.git/hooks/post-rewrite <<EOF
23 #!/bin/sh
24 echo \$@ > "$TRASH_DIRECTORY"/post-rewrite.args
25 cat > "$TRASH_DIRECTORY"/post-rewrite.data
26 EOF
27 chmod u+x .git/hooks/post-rewrite
28
29 clear_hook_input () {
30         rm -f post-rewrite.args post-rewrite.data
31 }
32
33 verify_hook_input () {
34         test_cmp "$TRASH_DIRECTORY"/post-rewrite.args expected.args &&
35         test_cmp "$TRASH_DIRECTORY"/post-rewrite.data expected.data
36 }
37
38 test_expect_success 'git commit --amend' '
39         clear_hook_input &&
40         echo "D new message" > newmsg &&
41         oldsha=$(git rev-parse HEAD^0) &&
42         git commit -Fnewmsg --amend &&
43         echo amend > expected.args &&
44         echo $oldsha $(git rev-parse HEAD^0) > expected.data &&
45         verify_hook_input
46 '
47
48 test_expect_success 'git commit --amend --no-post-rewrite' '
49         clear_hook_input &&
50         echo "D new message again" > newmsg &&
51         git commit --no-post-rewrite -Fnewmsg --amend &&
52         test ! -f post-rewrite.args &&
53         test ! -f post-rewrite.data
54 '
55
56 test_expect_success 'git rebase' '
57         git reset --hard D &&
58         clear_hook_input &&
59         test_must_fail git rebase --onto A B &&
60         echo C > foo &&
61         git add foo &&
62         git rebase --continue &&
63         echo rebase >expected.args &&
64         cat >expected.data <<EOF &&
65 $(git rev-parse C) $(git rev-parse HEAD^)
66 $(git rev-parse D) $(git rev-parse HEAD)
67 EOF
68         verify_hook_input
69 '
70
71 test_expect_success 'git rebase --skip' '
72         git reset --hard D &&
73         clear_hook_input &&
74         test_must_fail git rebase --onto A B &&
75         test_must_fail git rebase --skip &&
76         echo D > foo &&
77         git add foo &&
78         git rebase --continue &&
79         echo rebase >expected.args &&
80         cat >expected.data <<EOF &&
81 $(git rev-parse D) $(git rev-parse HEAD)
82 EOF
83         verify_hook_input
84 '
85
86 test_expect_success 'git rebase --skip the last one' '
87         git reset --hard F &&
88         clear_hook_input &&
89         test_must_fail git rebase --onto D A &&
90         git rebase --skip &&
91         echo rebase >expected.args &&
92         cat >expected.data <<EOF &&
93 $(git rev-parse E) $(git rev-parse HEAD)
94 EOF
95         verify_hook_input
96 '
97
98 test_expect_success 'git rebase -m' '
99         git reset --hard D &&
100         clear_hook_input &&
101         test_must_fail git rebase -m --onto A B &&
102         echo C > foo &&
103         git add foo &&
104         git rebase --continue &&
105         echo rebase >expected.args &&
106         cat >expected.data <<EOF &&
107 $(git rev-parse C) $(git rev-parse HEAD^)
108 $(git rev-parse D) $(git rev-parse HEAD)
109 EOF
110         verify_hook_input
111 '
112
113 test_expect_success 'git rebase -m --skip' '
114         git reset --hard D &&
115         clear_hook_input &&
116         test_must_fail git rebase --onto A B &&
117         test_must_fail git rebase --skip &&
118         echo D > foo &&
119         git add foo &&
120         git rebase --continue &&
121         echo rebase >expected.args &&
122         cat >expected.data <<EOF &&
123 $(git rev-parse D) $(git rev-parse HEAD)
124 EOF
125         verify_hook_input
126 '
127
128 . "$TEST_DIRECTORY"/lib-rebase.sh
129
130 set_fake_editor
131
132 # Helper to work around the lack of one-shot exporting for
133 # test_must_fail (as it is a shell function)
134 test_fail_interactive_rebase () {
135         (
136                 FAKE_LINES="$1" &&
137                 shift &&
138                 export FAKE_LINES &&
139                 test_must_fail git rebase -i "$@"
140         )
141 }
142
143 test_expect_success 'git rebase -i (unchanged)' '
144         git reset --hard D &&
145         clear_hook_input &&
146         test_fail_interactive_rebase "1 2" --onto A B &&
147         echo C > foo &&
148         git add foo &&
149         git rebase --continue &&
150         echo rebase >expected.args &&
151         cat >expected.data <<EOF &&
152 $(git rev-parse C) $(git rev-parse HEAD^)
153 $(git rev-parse D) $(git rev-parse HEAD)
154 EOF
155         verify_hook_input
156 '
157
158 test_expect_success 'git rebase -i (skip)' '
159         git reset --hard D &&
160         clear_hook_input &&
161         test_fail_interactive_rebase "2" --onto A B &&
162         echo D > foo &&
163         git add foo &&
164         git rebase --continue &&
165         echo rebase >expected.args &&
166         cat >expected.data <<EOF &&
167 $(git rev-parse D) $(git rev-parse HEAD)
168 EOF
169         verify_hook_input
170 '
171
172 test_expect_success 'git rebase -i (squash)' '
173         git reset --hard D &&
174         clear_hook_input &&
175         test_fail_interactive_rebase "1 squash 2" --onto A B &&
176         echo C > foo &&
177         git add foo &&
178         git rebase --continue &&
179         echo rebase >expected.args &&
180         cat >expected.data <<EOF &&
181 $(git rev-parse C) $(git rev-parse HEAD)
182 $(git rev-parse D) $(git rev-parse HEAD)
183 EOF
184         verify_hook_input
185 '
186
187 test_expect_success 'git rebase -i (fixup without conflict)' '
188         git reset --hard D &&
189         clear_hook_input &&
190         FAKE_LINES="1 fixup 2" git rebase -i B &&
191         echo rebase >expected.args &&
192         cat >expected.data <<EOF &&
193 $(git rev-parse C) $(git rev-parse HEAD)
194 $(git rev-parse D) $(git rev-parse HEAD)
195 EOF
196         verify_hook_input
197 '
198
199 test_expect_success 'git rebase -i (double edit)' '
200         git reset --hard D &&
201         clear_hook_input &&
202         FAKE_LINES="edit 1 edit 2" git rebase -i B &&
203         git rebase --continue &&
204         echo something > foo &&
205         git add foo &&
206         git rebase --continue &&
207         echo rebase >expected.args &&
208         cat >expected.data <<EOF &&
209 $(git rev-parse C) $(git rev-parse HEAD^)
210 $(git rev-parse D) $(git rev-parse HEAD)
211 EOF
212         verify_hook_input
213 '
214
215 test_done