add tests for rebasing merged history

Signed-off-by: Martin von Zweigbergk <martinvonz@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Martin von Zweigbergk committed Jun 6, 2013 at 23:11 UTC 3f213981e44a9109d053550855dc0ae91d0287c6
5 files changed +260 -137
t/t3400-rebase.sh
+1 -30
@@ -40,13 +40,6 @@ test_expect_success 'prepare repository with topic branches' '
40 echo Side >>C &&
41 git add C &&
42 git commit -m "Add C" &&
43 - git checkout -b nonlinear my-topic-branch &&
44 - echo Edit >>B &&
45 - git add B &&
46 - git commit -m "Modify B" &&
47 - git merge side &&
48 - git checkout -b upstream-merged-nonlinear &&
49 - git merge master &&
43 git checkout -f my-topic-branch &&
44 git tag topic
45 '
@@ -106,31 +99,9 @@ test_expect_success 'rebase from ambiguous branch name' '
99 git rebase master
100 '
101
109 -test_expect_success 'rebase after merge master' '
110 - git checkout --detach refs/tags/topic &&
111 - git branch -D topic &&
112 - git reset --hard topic &&
113 - git merge master &&
114 - git rebase master &&
115 - ! (git show | grep "^Merge:")
116 -'
117 -
118 -test_expect_success 'rebase of history with merges is linearized' '
119 - git checkout nonlinear &&
120 - test 4 = $(git rev-list master.. | wc -l) &&
121 - git rebase master &&
122 - test 3 = $(git rev-list master.. | wc -l)
123 -'
124 -
125 -test_expect_success 'rebase of history with merges after upstream merge is linearized' '
126 - git checkout upstream-merged-nonlinear &&
127 - test 5 = $(git rev-list master.. | wc -l) &&
128 - git rebase master &&
129 - test 3 = $(git rev-list master.. | wc -l)
130 -'
131 -
102 test_expect_success 'rebase a single mode change' '
103 git checkout master &&
104 + git branch -D topic &&
105 echo 1 >X &&
106 git add X &&
107 test_tick &&
t/t3401-rebase-partial.sh deleted
-45
@@ -1,45 +0,0 @@
1 -#!/bin/sh
2 -#
3 -# Copyright (c) 2006 Yann Dirson, based on t3400 by Amos Waterland
4 -#
5 -
6 -test_description='git rebase should detect patches integrated upstream
7 -
8 -This test cherry-picks one local change of two into master branch, and
9 -checks that git rebase succeeds with only the second patch in the
10 -local branch.
11 -'
12 -. ./test-lib.sh
13 -
14 -test_expect_success 'prepare repository with topic branch' '
15 - test_commit A &&
16 - git checkout -b my-topic-branch &&
17 - test_commit B &&
18 - test_commit C &&
19 - git checkout -f master &&
20 - test_commit A2 A.t
21 -'
22 -
23 -test_expect_success 'pick top patch from topic branch into master' '
24 - git cherry-pick C &&
25 - git checkout -f my-topic-branch
26 -'
27 -
28 -test_debug '
29 - git cherry master &&
30 - git format-patch -k --stdout --full-index master >/dev/null &&
31 - gitk --all & sleep 1
32 -'
33 -
34 -test_expect_success 'rebase topic branch against new master and check git am did not get halted' '
35 - git rebase master &&
36 - test_path_is_missing .git/rebase-apply
37 -'
38 -
39 -test_expect_success 'rebase --merge topic branch that was partially merged upstream' '
40 - git reset --hard C &&
41 - git rebase --merge master &&
42 - test_path_is_missing .git/rebase-merge
43 -'
44 -
45 -test_done
t/t3404-rebase-interactive.sh
+1 -9
@@ -477,19 +477,11 @@ test_expect_success 'interrupted squash works as expected (case 2)' '
477 test $one = $(git rev-parse HEAD~2)
478 '
479
480 -test_expect_success 'ignore patch if in upstream' '
481 - HEAD=$(git rev-parse HEAD) &&
482 - git checkout -b has-cherry-picked HEAD^ &&
480 +test_expect_success '--continue tries to commit, even for "edit"' '
481 echo unrelated > file7 &&
482 git add file7 &&
483 test_tick &&
484 git commit -m "unrelated change" &&
487 - git cherry-pick $HEAD &&
488 - EXPECT_COUNT=1 git rebase -i $HEAD &&
489 - test $HEAD = $(git rev-parse HEAD^)
490 -'
491 -
492 -test_expect_success '--continue tries to commit, even for "edit"' '
485 parent=$(git rev-parse HEAD^) &&
486 test_tick &&
487 FAKE_LINES="edit 1" git rebase -i HEAD^ &&
t/t3409-rebase-preserve-merges.sh
-53
@@ -11,14 +11,6 @@ Run "git rebase -p" and check that merges are properly carried along
11 GIT_AUTHOR_EMAIL=bogus_email_address
12 export GIT_AUTHOR_EMAIL
13
14 -# Clone 1 (trivial merge):
15 -#
16 -# A1--A2 <-- origin/master
17 -# \ \
18 -# B1--M <-- topic
19 -# \
20 -# B2 <-- origin/topic
21 -#
14 # Clone 2 (conflicting merge):
15 #
16 # A1--A2--B3 <-- origin/master
@@ -36,16 +28,6 @@ export GIT_AUTHOR_EMAIL
28 # \--A3 <-- topic2
29 # \
30 # B2 <-- origin/topic
39 -#
40 -# Clone 4 (merge using second parent as base):
41 -#
42 -# A1--A2--B3 <-- origin/master
43 -# \
44 -# B1--A3--M <-- topic
45 -# \ /
46 -# \--A4 <-- topic2
47 -# \
48 -# B2 <-- origin/topic
31
32 test_expect_success 'setup for merge-preserving rebase' \
33 'echo First > A &&
@@ -58,20 +40,6 @@ test_expect_success 'setup for merge-preserving rebase' \
40 git checkout -f master &&
41 echo Third >> A &&
42 git commit -a -m "Modify A2" &&
61 -
62 - git clone ./. clone1 &&
63 - (cd clone1 &&
64 - git checkout -b topic origin/topic &&
65 - git merge origin/master
66 - ) &&
67 -
68 - git clone ./. clone4 &&
69 - (
70 - cd clone4 &&
71 - git checkout -b topic origin/topic &&
72 - git merge origin/master
73 - ) &&
74 -
43 echo Fifth > B &&
44 git add B &&
45 git commit -m "Add different B" &&
@@ -101,16 +69,6 @@ test_expect_success 'setup for merge-preserving rebase' \
69 git commit -a -m "Modify B2"
70 '
71
104 -test_expect_success 'rebase -p fakes interactive rebase' '
105 - (
106 - cd clone1 &&
107 - git fetch &&
108 - git rebase -p origin/topic &&
109 - test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
110 - test 1 = $(git rev-list --all --pretty=oneline | grep "Merge remote-tracking branch " | wc -l)
111 - )
112 -'
113 -
72 test_expect_success '--continue works after a conflict' '
73 (
74 cd clone2 &&
@@ -138,15 +96,4 @@ test_expect_success 'rebase -p preserves no-ff merges' '
96 )
97 '
98
141 -test_expect_success 'rebase -p works when base inside second parent' '
142 - (
143 - cd clone4 &&
144 - git fetch &&
145 - git rebase -p HEAD^2 &&
146 - test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
147 - test 1 = $(git rev-list --all --pretty=oneline | grep "Modify B" | wc -l) &&
148 - test 1 = $(git rev-list --all --pretty=oneline | grep "Merge remote-tracking branch " | wc -l)
149 - )
150 -'
151 -
99 test_done
t/t3425-rebase-topology-merges.sh new
+258
@@ -0,0 +1,258 @@
1 +#!/bin/sh
2 +
3 +test_description='rebase topology tests with merges'
4 +. ./test-lib.sh
5 +. "$TEST_DIRECTORY"/lib-rebase.sh
6 +
7 +test_revision_subjects () {
8 + expected="$1"
9 + shift
10 + set -- $(git log --format=%s --no-walk=unsorted "$@")
11 + test "$expected" = "$*"
12 +}
13 +
14 +# a---b-----------c
15 +# \ \
16 +# d-------e \
17 +# \ \ \
18 +# n---o---w---v
19 +# \
20 +# z
21 +test_expect_success 'setup of non-linear-history' '
22 + test_commit a &&
23 + test_commit b &&
24 + test_commit c &&
25 + git checkout b &&
26 + test_commit d &&
27 + test_commit e
28 +
29 + git checkout c &&
30 + test_commit g &&
31 + revert h g &&
32 + git checkout d &&
33 + cherry_pick G g &&
34 + test_commit i &&
35 + git checkout b &&
36 + test_commit f
37 +
38 + git checkout d &&
39 + test_commit n &&
40 + test_commit o &&
41 + test_merge w e &&
42 + test_merge v c &&
43 + git checkout o &&
44 + test_commit z
45 +'
46 +
47 +test_run_rebase () {
48 + result=$1
49 + shift
50 + test_expect_$result "rebase $* after merge from upstream" "
51 + reset_rebase &&
52 + git rebase $* e w &&
53 + test_cmp_rev e HEAD~2 &&
54 + test_linear_range 'n o' e..
55 + "
56 +}
57 +test_run_rebase success ''
58 +test_run_rebase success -m
59 +test_run_rebase success -i
60 +
61 +test_run_rebase () {
62 + result=$1
63 + shift
64 + expected=$1
65 + shift
66 + test_expect_$result "rebase $* of non-linear history is linearized in place" "
67 + reset_rebase &&
68 + git rebase $* d w &&
69 + test_cmp_rev d HEAD~3 &&
70 + test_linear_range "\'"$expected"\'" d..
71 + "
72 +}
73 +#TODO: make order consistent across all flavors of rebase
74 +test_run_rebase success 'e n o' ''
75 +test_run_rebase success 'e n o' -m
76 +test_run_rebase success 'n o e' -i
77 +
78 +test_run_rebase () {
79 + result=$1
80 + shift
81 + expected=$1
82 + shift
83 + test_expect_$result "rebase $* of non-linear history is linearized upstream" "
84 + reset_rebase &&
85 + git rebase $* c w &&
86 + test_cmp_rev c HEAD~4 &&
87 + test_linear_range "\'"$expected"\'" c..
88 + "
89 +}
90 +#TODO: make order consistent across all flavors of rebase
91 +test_run_rebase success 'd e n o' ''
92 +test_run_rebase success 'd e n o' -m
93 +test_run_rebase success 'd n o e' -i
94 +
95 +test_run_rebase () {
96 + result=$1
97 + shift
98 + expected=$1
99 + shift
100 + test_expect_$result "rebase $* of non-linear history with merges after upstream merge is linearized" "
101 + reset_rebase &&
102 + git rebase $* c v &&
103 + test_cmp_rev c HEAD~4 &&
104 + test_linear_range "\'"$expected"\'" c..
105 + "
106 +}
107 +#TODO: make order consistent across all flavors of rebase
108 +test_run_rebase success 'd e n o' ''
109 +test_run_rebase success 'd e n o' -m
110 +test_run_rebase success 'd n o e' -i
111 +
112 +test_expect_success "rebase -p is no-op in non-linear history" "
113 + reset_rebase &&
114 + git rebase -p d w &&
115 + test_cmp_rev w HEAD
116 +"
117 +
118 +test_expect_success "rebase -p is no-op when base inside second parent" "
119 + reset_rebase &&
120 + git rebase -p e w &&
121 + test_cmp_rev w HEAD
122 +"
123 +
124 +test_expect_failure "rebase -p --root on non-linear history is a no-op" "
125 + reset_rebase &&
126 + git rebase -p --root w &&
127 + test_cmp_rev w HEAD
128 +"
129 +
130 +test_expect_success "rebase -p re-creates merge from side branch" "
131 + reset_rebase &&
132 + git rebase -p z w &&
133 + test_cmp_rev z HEAD^ &&
134 + test_cmp_rev w^2 HEAD^2
135 +"
136 +
137 +test_expect_success "rebase -p re-creates internal merge" "
138 + reset_rebase &&
139 + git rebase -p c w &&
140 + test_cmp_rev c HEAD~4 &&
141 + test_cmp_rev HEAD^2^ HEAD~3 &&
142 + test_revision_subjects 'd n e o w' HEAD~3 HEAD~2 HEAD^2 HEAD^ HEAD
143 +"
144 +
145 +test_expect_success "rebase -p can re-create two branches on onto" "
146 + reset_rebase &&
147 + git rebase -p --onto c d w &&
148 + test_cmp_rev c HEAD~3 &&
149 + test_cmp_rev c HEAD^2^ &&
150 + test_revision_subjects 'n e o w' HEAD~2 HEAD^2 HEAD^ HEAD
151 +"
152 +
153 +# f
154 +# /
155 +# a---b---c---g---h
156 +# \
157 +# d---G---i
158 +# \ \
159 +# e-------u
160 +#
161 +# uppercase = cherry-picked
162 +# h = reverted g
163 +test_expect_success 'setup of non-linear-history for patch-equivalence tests' '
164 + git checkout e &&
165 + test_merge u i
166 +'
167 +
168 +test_expect_success "rebase -p re-creates history around dropped commit matching upstream" "
169 + reset_rebase &&
170 + git rebase -p h u &&
171 + test_cmp_rev h HEAD~3 &&
172 + test_cmp_rev HEAD^2^ HEAD~2 &&
173 + test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
174 +"
175 +
176 +test_expect_success "rebase -p --onto in merged history drops patches in upstream" "
177 + reset_rebase &&
178 + git rebase -p --onto f h u &&
179 + test_cmp_rev f HEAD~3 &&
180 + test_cmp_rev HEAD^2^ HEAD~2 &&
181 + test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
182 +"
183 +
184 +test_expect_success "rebase -p --onto in merged history does not drop patches in onto" "
185 + reset_rebase &&
186 + git rebase -p --onto h f u &&
187 + test_cmp_rev h HEAD~3 &&
188 + test_cmp_rev HEAD^2~2 HEAD~2 &&
189 + test_revision_subjects 'd G i e u' HEAD~2 HEAD^2^ HEAD^2 HEAD^ HEAD
190 +"
191 +
192 +# a---b---c---g---h
193 +# \
194 +# d---G---s
195 +# \ \ /
196 +# \ X
197 +# \ / \
198 +# e---t
199 +#
200 +# uppercase = cherry-picked
201 +# h = reverted g
202 +test_expect_success 'setup of non-linear-history for dropping whole side' '
203 + git checkout G &&
204 + test_merge s e &&
205 + git checkout e &&
206 + test_merge t G
207 +'
208 +
209 +test_expect_failure "rebase -p drops merge commit when entire first-parent side is dropped" "
210 + reset_rebase &&
211 + git rebase -p h s &&
212 + test_cmp_rev h HEAD~2 &&
213 + test_linear_range 'd e' h..
214 +"
215 +
216 +test_expect_success "rebase -p drops merge commit when entire second-parent side is dropped" "
217 + reset_rebase &&
218 + git rebase -p h t &&
219 + test_cmp_rev h HEAD~2 &&
220 + test_linear_range 'd e' h..
221 +"
222 +
223 +# a---b---c
224 +# \
225 +# d---e
226 +# \ \
227 +# n---r
228 +# \
229 +# o
230 +#
231 +# r = tree-same with n
232 +test_expect_success 'setup of non-linear-history for empty commits' '
233 + git checkout n &&
234 + git merge --no-commit e &&
235 + git reset n . &&
236 + git commit -m r &&
237 + git reset --hard &&
238 + git clean -f &&
239 + git tag r
240 +'
241 +
242 +test_expect_success "rebase -p re-creates empty internal merge commit" "
243 + reset_rebase &&
244 + git rebase -p c r &&
245 + test_cmp_rev c HEAD~3 &&
246 + test_cmp_rev HEAD^2^ HEAD~2 &&
247 + test_revision_subjects 'd e n r' HEAD~2 HEAD^2 HEAD^ HEAD
248 +"
249 +
250 +test_expect_success "rebase -p re-creates empty merge commit" "
251 + reset_rebase &&
252 + git rebase -p o r &&
253 + test_cmp_rev e HEAD^2 &&
254 + test_cmp_rev o HEAD^ &&
255 + test_revision_subjects 'r' HEAD
256 +"
257 +
258 +test_done