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