1 | #!/bin/sh
|
---|
2 | #
|
---|
3 | # Copyright (c) 2005 Amos Waterland
|
---|
4 | #
|
---|
5 |
|
---|
6 | test_description='git rebase assorted tests
|
---|
7 |
|
---|
8 | This test runs git rebase and checks that the author information is not lost
|
---|
9 | among other things.
|
---|
10 | '
|
---|
11 | . ./test-lib.sh
|
---|
12 |
|
---|
13 | GIT_AUTHOR_NAME=author@name
|
---|
14 | GIT_AUTHOR_EMAIL=bogus@email@address
|
---|
15 | export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL
|
---|
16 |
|
---|
17 | test_expect_success 'prepare repository with topic branches' '
|
---|
18 | git config core.logAllRefUpdates true &&
|
---|
19 | echo First >A &&
|
---|
20 | git update-index --add A &&
|
---|
21 | git commit -m "Add A." &&
|
---|
22 | git checkout -b force-3way &&
|
---|
23 | echo Dummy >Y &&
|
---|
24 | git update-index --add Y &&
|
---|
25 | git commit -m "Add Y." &&
|
---|
26 | git checkout -b filemove &&
|
---|
27 | git reset --soft master &&
|
---|
28 | mkdir D &&
|
---|
29 | git mv A D/A &&
|
---|
30 | git commit -m "Move A." &&
|
---|
31 | git checkout -b my-topic-branch master &&
|
---|
32 | echo Second >B &&
|
---|
33 | git update-index --add B &&
|
---|
34 | git commit -m "Add B." &&
|
---|
35 | git checkout -f master &&
|
---|
36 | echo Third >>A &&
|
---|
37 | git update-index A &&
|
---|
38 | git commit -m "Modify A." &&
|
---|
39 | git checkout -b side my-topic-branch &&
|
---|
40 | echo Side >>C &&
|
---|
41 | git add C &&
|
---|
42 | git commit -m "Add C" &&
|
---|
43 | git checkout -f my-topic-branch &&
|
---|
44 | git tag topic
|
---|
45 | '
|
---|
46 |
|
---|
47 | test_expect_success 'rebase on dirty worktree' '
|
---|
48 | echo dirty >>A &&
|
---|
49 | test_must_fail git rebase master
|
---|
50 | '
|
---|
51 |
|
---|
52 | test_expect_success 'rebase on dirty cache' '
|
---|
53 | git add A &&
|
---|
54 | test_must_fail git rebase master
|
---|
55 | '
|
---|
56 |
|
---|
57 | test_expect_success 'rebase against master' '
|
---|
58 | git reset --hard HEAD &&
|
---|
59 | git rebase master
|
---|
60 | '
|
---|
61 |
|
---|
62 | test_expect_success 'rebase, with <onto> and <upstream> specified as :/quuxery' '
|
---|
63 | test_when_finished "git branch -D torebase" &&
|
---|
64 | git checkout -b torebase my-topic-branch^ &&
|
---|
65 | upstream=$(git rev-parse ":/Add B") &&
|
---|
66 | onto=$(git rev-parse ":/Add A") &&
|
---|
67 | git rebase --onto $onto $upstream &&
|
---|
68 | git reset --hard my-topic-branch^ &&
|
---|
69 | git rebase --onto ":/Add A" ":/Add B" &&
|
---|
70 | git checkout my-topic-branch
|
---|
71 | '
|
---|
72 |
|
---|
73 | test_expect_success 'the rebase operation should not have destroyed author information' '
|
---|
74 | ! (git log | grep "Author:" | grep "<>")
|
---|
75 | '
|
---|
76 |
|
---|
77 | test_expect_success 'the rebase operation should not have destroyed author information (2)' "
|
---|
78 | git log -1 |
|
---|
79 | grep 'Author: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>'
|
---|
80 | "
|
---|
81 |
|
---|
82 | test_expect_success 'HEAD was detached during rebase' '
|
---|
83 | test $(git rev-parse HEAD@{1}) != $(git rev-parse my-topic-branch@{1})
|
---|
84 | '
|
---|
85 |
|
---|
86 | test_expect_success 'rebase from ambiguous branch name' '
|
---|
87 | git checkout -b topic side &&
|
---|
88 | git rebase master
|
---|
89 | '
|
---|
90 |
|
---|
91 | test_expect_success 'rebase off of the previous branch using "-"' '
|
---|
92 | git checkout master &&
|
---|
93 | git checkout HEAD^ &&
|
---|
94 | git rebase @{-1} >expect.messages &&
|
---|
95 | git merge-base master HEAD >expect.forkpoint &&
|
---|
96 |
|
---|
97 | git checkout master &&
|
---|
98 | git checkout HEAD^ &&
|
---|
99 | git rebase - >actual.messages &&
|
---|
100 | git merge-base master HEAD >actual.forkpoint &&
|
---|
101 |
|
---|
102 | test_cmp expect.forkpoint actual.forkpoint &&
|
---|
103 | # the next one is dubious---we may want to say "-",
|
---|
104 | # instead of @{-1}, in the message
|
---|
105 | test_i18ncmp expect.messages actual.messages
|
---|
106 | '
|
---|
107 |
|
---|
108 | test_expect_success 'rebase a single mode change' '
|
---|
109 | git checkout master &&
|
---|
110 | git branch -D topic &&
|
---|
111 | echo 1 >X &&
|
---|
112 | git add X &&
|
---|
113 | test_tick &&
|
---|
114 | git commit -m prepare &&
|
---|
115 | git checkout -b modechange HEAD^ &&
|
---|
116 | echo 1 >X &&
|
---|
117 | git add X &&
|
---|
118 | test_chmod +x A &&
|
---|
119 | test_tick &&
|
---|
120 | git commit -m modechange &&
|
---|
121 | GIT_TRACE=1 git rebase master
|
---|
122 | '
|
---|
123 |
|
---|
124 | test_expect_success 'rebase is not broken by diff.renames' '
|
---|
125 | test_config diff.renames copies &&
|
---|
126 | git checkout filemove &&
|
---|
127 | GIT_TRACE=1 git rebase force-3way
|
---|
128 | '
|
---|
129 |
|
---|
130 | test_expect_success 'setup: recover' '
|
---|
131 | test_might_fail git rebase --abort &&
|
---|
132 | git reset --hard &&
|
---|
133 | git checkout modechange
|
---|
134 | '
|
---|
135 |
|
---|
136 | test_expect_success 'Show verbose error when HEAD could not be detached' '
|
---|
137 | >B &&
|
---|
138 | test_must_fail git rebase topic 2>output.err >output.out &&
|
---|
139 | grep "The following untracked working tree files would be overwritten by checkout:" output.err &&
|
---|
140 | grep B output.err
|
---|
141 | '
|
---|
142 | rm -f B
|
---|
143 |
|
---|
144 | test_expect_success 'fail when upstream arg is missing and not on branch' '
|
---|
145 | git checkout topic &&
|
---|
146 | test_must_fail git rebase
|
---|
147 | '
|
---|
148 |
|
---|
149 | test_expect_success 'fail when upstream arg is missing and not configured' '
|
---|
150 | git checkout -b no-config topic &&
|
---|
151 | test_must_fail git rebase
|
---|
152 | '
|
---|
153 |
|
---|
154 | test_expect_success 'default to common base in @{upstream}s reflog if no upstream arg' '
|
---|
155 | git checkout -b default-base master &&
|
---|
156 | git checkout -b default topic &&
|
---|
157 | git config branch.default.remote . &&
|
---|
158 | git config branch.default.merge refs/heads/default-base &&
|
---|
159 | git rebase &&
|
---|
160 | git rev-parse --verify default-base >expect &&
|
---|
161 | git rev-parse default~1 >actual &&
|
---|
162 | test_cmp expect actual &&
|
---|
163 | git checkout default-base &&
|
---|
164 | git reset --hard HEAD^ &&
|
---|
165 | git checkout default &&
|
---|
166 | git rebase &&
|
---|
167 | git rev-parse --verify default-base >expect &&
|
---|
168 | git rev-parse default~1 >actual &&
|
---|
169 | test_cmp expect actual
|
---|
170 | '
|
---|
171 |
|
---|
172 | test_expect_success 'rebase -q is quiet' '
|
---|
173 | git checkout -b quiet topic &&
|
---|
174 | git rebase -q master >output.out 2>&1 &&
|
---|
175 | test_must_be_empty output.out
|
---|
176 | '
|
---|
177 |
|
---|
178 | test_expect_success 'Rebase a commit that sprinkles CRs in' '
|
---|
179 | (
|
---|
180 | echo "One"
|
---|
181 | echo "TwoQ"
|
---|
182 | echo "Three"
|
---|
183 | echo "FQur"
|
---|
184 | echo "Five"
|
---|
185 | ) | q_to_cr >CR &&
|
---|
186 | git add CR &&
|
---|
187 | test_tick &&
|
---|
188 | git commit -a -m "A file with a line with CR" &&
|
---|
189 | git tag file-with-cr &&
|
---|
190 | git checkout HEAD^0 &&
|
---|
191 | git rebase --onto HEAD^^ HEAD^ &&
|
---|
192 | git diff --exit-code file-with-cr:CR HEAD:CR
|
---|
193 | '
|
---|
194 |
|
---|
195 | test_expect_success 'rebase can copy notes' '
|
---|
196 | git config notes.rewrite.rebase true &&
|
---|
197 | git config notes.rewriteRef "refs/notes/*" &&
|
---|
198 | test_commit n1 &&
|
---|
199 | test_commit n2 &&
|
---|
200 | test_commit n3 &&
|
---|
201 | git notes add -m"a note" n3 &&
|
---|
202 | git rebase --onto n1 n2 &&
|
---|
203 | test "a note" = "$(git notes show HEAD)"
|
---|
204 | '
|
---|
205 |
|
---|
206 | test_expect_success 'rebase -m can copy notes' '
|
---|
207 | git reset --hard n3 &&
|
---|
208 | git rebase -m --onto n1 n2 &&
|
---|
209 | test "a note" = "$(git notes show HEAD)"
|
---|
210 | '
|
---|
211 |
|
---|
212 | test_expect_success 'rebase commit with an ancient timestamp' '
|
---|
213 | git reset --hard &&
|
---|
214 |
|
---|
215 | >old.one && git add old.one && test_tick &&
|
---|
216 | git commit --date="@12345 +0400" -m "Old one" &&
|
---|
217 | >old.two && git add old.two && test_tick &&
|
---|
218 | git commit --date="@23456 +0500" -m "Old two" &&
|
---|
219 | >old.three && git add old.three && test_tick &&
|
---|
220 | git commit --date="@34567 +0600" -m "Old three" &&
|
---|
221 |
|
---|
222 | git cat-file commit HEAD^^ >actual &&
|
---|
223 | grep "author .* 12345 +0400$" actual &&
|
---|
224 | git cat-file commit HEAD^ >actual &&
|
---|
225 | grep "author .* 23456 +0500$" actual &&
|
---|
226 | git cat-file commit HEAD >actual &&
|
---|
227 | grep "author .* 34567 +0600$" actual &&
|
---|
228 |
|
---|
229 | git rebase --onto HEAD^^ HEAD^ &&
|
---|
230 |
|
---|
231 | git cat-file commit HEAD >actual &&
|
---|
232 | grep "author .* 34567 +0600$" actual
|
---|
233 | '
|
---|
234 |
|
---|
235 | test_done
|
---|