t3412: use log|name-rev instead of log --graph
[git/jnareb-git.git] / t / t3412-rebase-root.sh
blob57a3cad2d93b472aaea5542e39c2171c2542bef6
1 #!/bin/sh
3 test_description='git rebase --root
5 Tests if git rebase --root --onto <newparent> can rebase the root commit.
7 . ./test-lib.sh
9 # we always run the interactive rebases unchanged, so just disable the editor
10 GIT_EDITOR=:
11 export GIT_EDITOR
13 log_with_names () {
14 git rev-list --topo-order --parents --pretty="tformat:%s" HEAD |
15 git name-rev --stdin --name-only --refs=refs/heads/$1
19 test_expect_success 'prepare repository' '
20 test_commit 1 A &&
21 test_commit 2 A &&
22 git symbolic-ref HEAD refs/heads/other &&
23 rm .git/index &&
24 test_commit 3 B &&
25 test_commit 1b A 1 &&
26 test_commit 4 B
29 test_expect_success 'rebase --root expects --onto' '
30 test_must_fail git rebase --root
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
41 cat > expect <<EOF
46 EOF
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
55 test_expect_success 'pre-rebase got correct input (1)' '
56 test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
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
66 test_expect_success 'pre-rebase got correct input (2)' '
67 test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work2
70 test_expect_success 'rebase -i --root --onto <newbase>' '
71 git checkout -b work3 other &&
72 git rebase -i --root --onto master &&
73 git log --pretty=tformat:"%s" > rebased3 &&
74 test_cmp expect rebased3
77 test_expect_success 'pre-rebase got correct input (3)' '
78 test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
81 test_expect_success 'rebase -i --root --onto <newbase> <branch>' '
82 git branch work4 other &&
83 git rebase -i --root --onto master work4 &&
84 git log --pretty=tformat:"%s" > rebased4 &&
85 test_cmp expect rebased4
88 test_expect_success 'pre-rebase got correct input (4)' '
89 test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work4
92 test_expect_success 'rebase -i -p with linear history' '
93 git checkout -b work5 other &&
94 git rebase -i -p --root --onto master &&
95 git log --pretty=tformat:"%s" > rebased5 &&
96 test_cmp expect rebased5
99 test_expect_success 'pre-rebase got correct input (5)' '
100 test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
103 test_expect_success 'set up merge history' '
104 git checkout other^ &&
105 git checkout -b side &&
106 test_commit 5 C &&
107 git checkout other &&
108 git merge side
111 cat > expect-side <<'EOF'
112 commit work6 work6~1 work6^2
113 Merge branch 'side' into other
114 commit work6^2 work6~2
116 commit work6~1 work6~2
118 commit work6~2 work6~3
120 commit work6~3 work6~4
122 commit work6~4
126 test_expect_success 'rebase -i -p with merge' '
127 git checkout -b work6 other &&
128 git rebase -i -p --root --onto master &&
129 log_with_names work6 > rebased6 &&
130 test_cmp expect-side rebased6
133 test_expect_success 'set up second root and merge' '
134 git symbolic-ref HEAD refs/heads/third &&
135 rm .git/index &&
136 rm A B C &&
137 test_commit 6 D &&
138 git checkout other &&
139 git merge third
142 cat > expect-third <<'EOF'
143 commit work7 work7~1 work7^2
144 Merge branch 'third' into other
145 commit work7^2 work7~4
147 commit work7~1 work7~2 work7~1^2
148 Merge branch 'side' into other
149 commit work7~1^2 work7~3
151 commit work7~2 work7~3
153 commit work7~3 work7~4
155 commit work7~4 work7~5
157 commit work7~5
161 test_expect_success 'rebase -i -p with two roots' '
162 git checkout -b work7 other &&
163 git rebase -i -p --root --onto master &&
164 log_with_names work7 > rebased7 &&
165 test_cmp expect-third rebased7
168 test_expect_success 'setup pre-rebase hook that fails' '
169 mkdir -p .git/hooks &&
170 cat >.git/hooks/pre-rebase <<EOF &&
171 #!$SHELL_PATH
172 false
174 chmod +x .git/hooks/pre-rebase
177 test_expect_success 'pre-rebase hook stops rebase' '
178 git checkout -b stops1 other &&
179 test_must_fail git rebase --root --onto master &&
180 test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops1
181 test 0 = $(git rev-list other...stops1 | wc -l)
184 test_expect_success 'pre-rebase hook stops rebase -i' '
185 git checkout -b stops2 other &&
186 test_must_fail git rebase --root --onto master &&
187 test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops2
188 test 0 = $(git rev-list other...stops2 | wc -l)
191 test_expect_success 'remove pre-rebase hook' '
192 rm -f .git/hooks/pre-rebase
195 test_expect_success 'set up a conflict' '
196 git checkout master &&
197 echo conflict > B &&
198 git add B &&
199 git commit -m conflict
202 test_expect_success 'rebase --root with conflict (first part)' '
203 git checkout -b conflict1 other &&
204 test_must_fail git rebase --root --onto master &&
205 git ls-files -u | grep "B$"
208 test_expect_success 'fix the conflict' '
209 echo 3 > B &&
210 git add B
213 cat > expect-conflict <<EOF
218 conflict
223 test_expect_success 'rebase --root with conflict (second part)' '
224 git rebase --continue &&
225 git log --pretty=tformat:"%s" > conflict1 &&
226 test_cmp expect-conflict conflict1
229 test_expect_success 'rebase -i --root with conflict (first part)' '
230 git checkout -b conflict2 other &&
231 test_must_fail git rebase -i --root --onto master &&
232 git ls-files -u | grep "B$"
235 test_expect_success 'fix the conflict' '
236 echo 3 > B &&
237 git add B
240 test_expect_success 'rebase -i --root with conflict (second part)' '
241 git rebase --continue &&
242 git log --pretty=tformat:"%s" > conflict2 &&
243 test_cmp expect-conflict conflict2
246 cat >expect-conflict-p <<\EOF
247 commit conflict3 conflict3~1 conflict3^2
248 Merge branch 'third' into other
249 commit conflict3^2 conflict3~4
251 commit conflict3~1 conflict3~2 conflict3~1^2
252 Merge branch 'side' into other
253 commit conflict3~1^2 conflict3~3
255 commit conflict3~2 conflict3~3
257 commit conflict3~3 conflict3~4
259 commit conflict3~4 conflict3~5
260 conflict
261 commit conflict3~5 conflict3~6
263 commit conflict3~6
267 test_expect_success 'rebase -i -p --root with conflict (first part)' '
268 git checkout -b conflict3 other &&
269 test_must_fail git rebase -i -p --root --onto master &&
270 git ls-files -u | grep "B$"
273 test_expect_success 'fix the conflict' '
274 echo 3 > B &&
275 git add B
278 test_expect_success 'rebase -i -p --root with conflict (second part)' '
279 git rebase --continue &&
280 log_with_names conflict3 >out &&
281 test_cmp expect-conflict-p out
284 test_done