Merge branch 'maint'
[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_done