]>
Commit | Line | Data |
---|---|---|
190f5323 TR |
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 | ||
d911d146 TR |
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 | ||
190f5323 TR |
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 | ||
d911d146 TR |
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 | ||
a6c7a276 JH |
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 | ||
190f5323 | 281 | test_done |