]> asedeno.scripts.mit.edu Git - git.git/blob - t/t3412-rebase-root.sh
rebase -i: correctly remember --root flag across --continue
[git.git] / t / t3412-rebase-root.sh
1 #!/bin/sh
2
3 test_description='git rebase --root
4
5 Tests if git rebase --root --onto <newparent> can rebase the root commit.
6 '
7 . ./test-lib.sh
8
9 test_expect_success 'prepare repository' '
10         echo 1 > A &&
11         git add A &&
12         git commit -m 1 &&
13         echo 2 > A &&
14         git add A &&
15         git commit -m 2 &&
16         git symbolic-ref HEAD refs/heads/other &&
17         rm .git/index &&
18         echo 3 > B &&
19         git add B &&
20         git commit -m 3 &&
21         echo 1 > A &&
22         git add A &&
23         git commit -m 1b &&
24         echo 4 > B &&
25         git add B &&
26         git commit -m 4
27 '
28
29 test_expect_success 'rebase --root expects --onto' '
30         test_must_fail git rebase --root
31 '
32
33 test_expect_success 'setup pre-rebase hook' '
34         mkdir -p .git/hooks &&
35         cat >.git/hooks/pre-rebase <<EOF &&
36 #!$SHELL_PATH
37 echo "\$1,\$2" >.git/PRE-REBASE-INPUT
38 EOF
39         chmod +x .git/hooks/pre-rebase
40 '
41 cat > expect <<EOF
42 4
43 3
44 2
45 1
46 EOF
47
48 test_expect_success 'rebase --root --onto <newbase>' '
49         git checkout -b work &&
50         git rebase --root --onto master &&
51         git log --pretty=tformat:"%s" > rebased &&
52         test_cmp expect rebased
53 '
54
55 test_expect_success 'pre-rebase got correct input (1)' '
56         test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
57 '
58
59 test_expect_success 'rebase --root --onto <newbase> <branch>' '
60         git branch work2 other &&
61         git rebase --root --onto master work2 &&
62         git log --pretty=tformat:"%s" > rebased2 &&
63         test_cmp expect rebased2
64 '
65
66 test_expect_success 'pre-rebase got correct input (2)' '
67         test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work2
68 '
69
70 test_expect_success 'rebase -i --root --onto <newbase>' '
71         git checkout -b work3 other &&
72         GIT_EDITOR=: git rebase -i --root --onto master &&
73         git log --pretty=tformat:"%s" > rebased3 &&
74         test_cmp expect rebased3
75 '
76
77 test_expect_success 'pre-rebase got correct input (3)' '
78         test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
79 '
80
81 test_expect_success 'rebase -i --root --onto <newbase> <branch>' '
82         git branch work4 other &&
83         GIT_EDITOR=: git rebase -i --root --onto master work4 &&
84         git log --pretty=tformat:"%s" > rebased4 &&
85         test_cmp expect rebased4
86 '
87
88 test_expect_success 'pre-rebase got correct input (4)' '
89         test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work4
90 '
91
92 test_expect_success 'rebase -i -p with linear history' '
93         git checkout -b work5 other &&
94         GIT_EDITOR=: git rebase -i -p --root --onto master &&
95         git log --pretty=tformat:"%s" > rebased5 &&
96         test_cmp expect rebased5
97 '
98
99 test_expect_success 'pre-rebase got correct input (5)' '
100         test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
101 '
102
103 test_expect_success 'set up merge history' '
104         git checkout other^ &&
105         git checkout -b side &&
106         echo 5 > C &&
107         git add C &&
108         git commit -m 5 &&
109         git checkout other &&
110         git merge side
111 '
112
113 sed 's/#/ /g' > expect-side <<'EOF'
114 *   Merge branch 'side' into other
115 |\##
116 | * 5
117 * | 4
118 |/##
119 * 3
120 * 2
121 * 1
122 EOF
123
124 test_expect_success 'rebase -i -p with merge' '
125         git checkout -b work6 other &&
126         GIT_EDITOR=: git rebase -i -p --root --onto master &&
127         git log --graph --topo-order --pretty=tformat:"%s" > rebased6 &&
128         test_cmp expect-side rebased6
129 '
130
131 test_expect_success 'set up second root and merge' '
132         git symbolic-ref HEAD refs/heads/third &&
133         rm .git/index &&
134         rm A B C &&
135         echo 6 > D &&
136         git add D &&
137         git commit -m 6 &&
138         git checkout other &&
139         git merge third
140 '
141
142 sed 's/#/ /g' > expect-third <<'EOF'
143 *   Merge branch 'third' into other
144 |\##
145 | * 6
146 * |   Merge branch 'side' into other
147 |\ \##
148 | * | 5
149 * | | 4
150 |/ /##
151 * | 3
152 |/##
153 * 2
154 * 1
155 EOF
156
157 test_expect_success 'rebase -i -p with two roots' '
158         git checkout -b work7 other &&
159         GIT_EDITOR=: git rebase -i -p --root --onto master &&
160         git log --graph --topo-order --pretty=tformat:"%s" > rebased7 &&
161         test_cmp expect-third rebased7
162 '
163
164 test_expect_success 'setup pre-rebase hook that fails' '
165         mkdir -p .git/hooks &&
166         cat >.git/hooks/pre-rebase <<EOF &&
167 #!$SHELL_PATH
168 false
169 EOF
170         chmod +x .git/hooks/pre-rebase
171 '
172
173 test_expect_success 'pre-rebase hook stops rebase' '
174         git checkout -b stops1 other &&
175         GIT_EDITOR=: test_must_fail git rebase --root --onto master &&
176         test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops1
177         test 0 = $(git rev-list other...stops1 | wc -l)
178 '
179
180 test_expect_success 'pre-rebase hook stops rebase -i' '
181         git checkout -b stops2 other &&
182         GIT_EDITOR=: test_must_fail git rebase --root --onto master &&
183         test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops2
184         test 0 = $(git rev-list other...stops2 | wc -l)
185 '
186
187 test_expect_success 'remove pre-rebase hook' '
188         rm -f .git/hooks/pre-rebase
189 '
190
191 test_expect_success 'set up a conflict' '
192         git checkout master &&
193         echo conflict > B &&
194         git add B &&
195         git commit -m conflict
196 '
197
198 test_expect_success 'rebase --root with conflict (first part)' '
199         git checkout -b conflict1 other &&
200         test_must_fail git rebase --root --onto master &&
201         git ls-files -u | grep "B$"
202 '
203
204 test_expect_success 'fix the conflict' '
205         echo 3 > B &&
206         git add B
207 '
208
209 cat > expect-conflict <<EOF
210 6
211 5
212 4
213 3
214 conflict
215 2
216 1
217 EOF
218
219 test_expect_success 'rebase --root with conflict (second part)' '
220         git rebase --continue &&
221         git log --pretty=tformat:"%s" > conflict1 &&
222         test_cmp expect-conflict conflict1
223 '
224
225 test_expect_success 'rebase -i --root with conflict (first part)' '
226         git checkout -b conflict2 other &&
227         GIT_EDITOR=: test_must_fail git rebase -i --root --onto master &&
228         git ls-files -u | grep "B$"
229 '
230
231 test_expect_success 'fix the conflict' '
232         echo 3 > B &&
233         git add B
234 '
235
236 test_expect_success 'rebase -i --root with conflict (second part)' '
237         git rebase --continue &&
238         git log --pretty=tformat:"%s" > conflict2 &&
239         test_cmp expect-conflict conflict2
240 '
241
242 cat >expect-conflict-p <<\EOF
243 commit conflict3 conflict3~1 conflict3^2
244 Merge branch 'third' into other
245 commit conflict3^2 conflict3~4
246 6
247 commit conflict3~1 conflict3~2 conflict3~1^2
248 Merge branch 'side' into other
249 commit conflict3~1^2 conflict3~3
250 5
251 commit conflict3~2 conflict3~3
252 4
253 commit conflict3~3 conflict3~4
254 3
255 commit conflict3~4 conflict3~5
256 conflict
257 commit conflict3~5 conflict3~6
258 2
259 commit conflict3~6
260 1
261 EOF
262
263 test_expect_success 'rebase -i -p --root with conflict (first part)' '
264         git checkout -b conflict3 other &&
265         GIT_EDITOR=: test_must_fail git rebase -i -p --root --onto master &&
266         git ls-files -u | grep "B$"
267 '
268
269 test_expect_success 'fix the conflict' '
270         echo 3 > B &&
271         git add B
272 '
273
274 test_expect_success 'rebase -i -p --root with conflict (second part)' '
275         git rebase --continue &&
276         git rev-list --topo-order --parents --pretty="tformat:%s" HEAD |
277         git name-rev --stdin --name-only --refs=refs/heads/conflict3 >out &&
278         test_cmp expect-conflict-p out
279 '
280
281 test_done