3 # Copyright (c) 2010 Thomas Rast
6 test_description='Test the post-rewrite hook.'
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 &&
15 test_commit E bar E &&
16 test_commit F foo F &&
22 cat >.git/hooks/post-rewrite <<EOF
24 echo \$@ > "$TRASH_DIRECTORY"/post-rewrite.args
25 cat > "$TRASH_DIRECTORY"/post-rewrite.data
27 chmod u+x .git/hooks/post-rewrite
30 rm -f post-rewrite.args post-rewrite.data
33 verify_hook_input () {
34 test_cmp expected.args "$TRASH_DIRECTORY"/post-rewrite.args &&
35 test_cmp expected.data "$TRASH_DIRECTORY"/post-rewrite.data
38 test_expect_success 'git commit --amend' '
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 &&
48 test_expect_success 'git commit --amend --no-post-rewrite' '
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
56 test_expect_success 'git cherry-pick' '
60 test_must_fail git cherry-pick B..D &&
63 git cherry-pick --continue &&
64 echo cherry-pick >expected.args &&
65 cat >expected.data <<EOF &&
66 $(git rev-parse C) $(git rev-parse HEAD^)
67 $(git rev-parse D) $(git rev-parse HEAD)
72 test_expect_success 'git rebase' '
75 test_must_fail git rebase --onto A B &&
78 git rebase --continue &&
79 echo rebase >expected.args &&
80 cat >expected.data <<-EOF &&
81 $(git rev-parse C) $(git rev-parse HEAD^)
82 $(git rev-parse D) $(git rev-parse HEAD)
87 test_expect_success 'git rebase --skip' '
90 test_must_fail git rebase --onto A B &&
91 test_must_fail git rebase --skip &&
94 git rebase --continue &&
95 echo rebase >expected.args &&
96 cat >expected.data <<-EOF &&
97 $(git rev-parse D) $(git rev-parse HEAD)
102 test_expect_success 'git rebase --skip the last one' '
103 git reset --hard F &&
105 test_must_fail git rebase --onto D A &&
107 echo rebase >expected.args &&
108 cat >expected.data <<-EOF &&
109 $(git rev-parse E) $(git rev-parse HEAD)
114 test_expect_success 'git rebase -m' '
115 git reset --hard D &&
117 test_must_fail git rebase -m --onto A B &&
120 git rebase --continue &&
121 echo rebase >expected.args &&
122 cat >expected.data <<-EOF &&
123 $(git rev-parse C) $(git rev-parse HEAD^)
124 $(git rev-parse D) $(git rev-parse HEAD)
129 test_expect_success 'git rebase -m --skip' '
130 git reset --hard D &&
132 test_must_fail git rebase --onto A B &&
133 test_must_fail git rebase --skip &&
136 git rebase --continue &&
137 echo rebase >expected.args &&
138 cat >expected.data <<-EOF &&
139 $(git rev-parse D) $(git rev-parse HEAD)
144 . "$TEST_DIRECTORY"/lib-rebase.sh
148 # Helper to work around the lack of one-shot exporting for
149 # test_must_fail (as it is a shell function)
150 test_fail_interactive_rebase () {
155 test_must_fail git rebase -i "$@"
159 test_expect_success 'git rebase -i (unchanged)' '
160 git reset --hard D &&
162 test_fail_interactive_rebase "1 2" --onto A B &&
165 git rebase --continue &&
166 echo rebase >expected.args &&
167 cat >expected.data <<-EOF &&
168 $(git rev-parse C) $(git rev-parse HEAD^)
169 $(git rev-parse D) $(git rev-parse HEAD)
174 test_expect_success 'git rebase -i (skip)' '
175 git reset --hard D &&
177 test_fail_interactive_rebase "2" --onto A B &&
180 git rebase --continue &&
181 echo rebase >expected.args &&
182 cat >expected.data <<-EOF &&
183 $(git rev-parse D) $(git rev-parse HEAD)
188 test_expect_success 'git rebase -i (squash)' '
189 git reset --hard D &&
191 test_fail_interactive_rebase "1 squash 2" --onto A B &&
194 git rebase --continue &&
195 echo rebase >expected.args &&
196 cat >expected.data <<-EOF &&
197 $(git rev-parse C) $(git rev-parse HEAD)
198 $(git rev-parse D) $(git rev-parse HEAD)
203 test_expect_success 'git rebase -i (fixup without conflict)' '
204 git reset --hard D &&
206 FAKE_LINES="1 fixup 2" git rebase -i B &&
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)
215 test_expect_success 'git rebase -i (double edit)' '
216 git reset --hard D &&
218 FAKE_LINES="edit 1 edit 2" git rebase -i B &&
219 git rebase --continue &&
220 echo something > foo &&
222 git rebase --continue &&
223 echo rebase >expected.args &&
224 cat >expected.data <<-EOF &&
225 $(git rev-parse C) $(git rev-parse HEAD^)
226 $(git rev-parse D) $(git rev-parse HEAD)
231 test_expect_success 'git rebase -i (exec)' '
232 git reset --hard D &&
234 FAKE_LINES="edit 1 exec_false 2" git rebase -i B &&
235 echo something >bar &&
237 # Fails because of exec false
238 test_must_fail git rebase --continue &&
239 git rebase --continue &&
240 echo rebase >expected.args &&
241 cat >expected.data <<-EOF &&
242 $(git rev-parse C) $(git rev-parse HEAD^)
243 $(git rev-parse D) $(git rev-parse HEAD)