]>
Commit | Line | Data |
---|---|---|
bdf25142 LT |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2005 Junio C Hamano | |
4 | # | |
5 | ||
6 | test_description='See why rewinding head breaks send-pack | |
7 | ||
8 | ' | |
966b4be2 | 9 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
334afbc7 JS |
10 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
11 | ||
bdf25142 LT |
12 | . ./test-lib.sh |
13 | ||
04509738 | 14 | cnt=64 |
bdf25142 | 15 | test_expect_success setup ' |
04509738 JH |
16 | test_tick && |
17 | mkdir mozart mozart/is && | |
18 | echo "Commit #0" >mozart/is/pink && | |
5be60078 JH |
19 | git update-index --add mozart/is/pink && |
20 | tree=$(git write-tree) && | |
21 | commit=$(echo "Commit #0" | git commit-tree $tree) && | |
bdf25142 LT |
22 | zero=$commit && |
23 | parent=$zero && | |
04509738 JH |
24 | i=0 && |
25 | while test $i -le $cnt | |
bdf25142 | 26 | do |
739edb2a JS |
27 | i=$(($i+1)) && |
28 | test_tick && | |
29 | echo "Commit #$i" >mozart/is/pink && | |
30 | git update-index --add mozart/is/pink && | |
31 | tree=$(git write-tree) && | |
32 | commit=$(echo "Commit #$i" | | |
33 | git commit-tree $tree -p $parent) && | |
34 | git update-ref refs/tags/commit$i $commit && | |
35 | parent=$commit || return 1 | |
bdf25142 | 36 | done && |
5be60078 | 37 | git update-ref HEAD "$commit" && |
3604e7c5 | 38 | git clone ./. victim && |
acd2a45b | 39 | ( cd victim && git config receive.denyCurrentBranch warn && git log ) && |
5be60078 | 40 | git update-ref HEAD "$zero" && |
bdf25142 | 41 | parent=$zero && |
04509738 JH |
42 | i=0 && |
43 | while test $i -le $cnt | |
bdf25142 | 44 | do |
739edb2a JS |
45 | i=$(($i+1)) && |
46 | test_tick && | |
47 | echo "Rebase #$i" >mozart/is/pink && | |
48 | git update-index --add mozart/is/pink && | |
49 | tree=$(git write-tree) && | |
50 | commit=$(echo "Rebase #$i" | git commit-tree $tree -p $parent) && | |
51 | git update-ref refs/tags/rebase$i $commit && | |
52 | parent=$commit || return 1 | |
bdf25142 | 53 | done && |
5be60078 | 54 | git update-ref HEAD "$commit" && |
bdf25142 | 55 | echo Rebase && |
5be60078 | 56 | git log' |
bdf25142 | 57 | |
04509738 JH |
58 | test_expect_success 'pack the source repository' ' |
59 | git repack -a -d && | |
026aa938 | 60 | git prune |
04509738 JH |
61 | ' |
62 | ||
63 | test_expect_success 'pack the destination repository' ' | |
739edb2a JS |
64 | ( |
65 | cd victim && | |
66 | git repack -a -d && | |
67 | git prune | |
68 | ) | |
04509738 JH |
69 | ' |
70 | ||
2f334155 | 71 | test_expect_success 'refuse pushing rewound head without --force' ' |
966b4be2 JS |
72 | pushed_head=$(git rev-parse --verify main) && |
73 | victim_orig=$(cd victim && git rev-parse --verify main) && | |
74 | test_must_fail git send-pack ./victim main && | |
75 | victim_head=$(cd victim && git rev-parse --verify main) && | |
2f334155 | 76 | test "$victim_head" = "$victim_orig" && |
bdf25142 | 77 | # this should update |
966b4be2 JS |
78 | git send-pack --force ./victim main && |
79 | victim_head=$(cd victim && git rev-parse --verify main) && | |
2f334155 | 80 | test "$victim_head" = "$pushed_head" |
bdf25142 | 81 | ' |
da7bc9b0 | 82 | |
0e18a5b4 | 83 | test_expect_success 'push can be used to delete a ref' ' |
966b4be2 JS |
84 | ( cd victim && git branch extra main ) && |
85 | git send-pack ./victim :extra main && | |
2f334155 JH |
86 | ( cd victim && |
87 | test_must_fail git rev-parse --verify extra ) | |
d4f694ba JH |
88 | ' |
89 | ||
2f334155 JH |
90 | test_expect_success 'refuse deleting push with denyDeletes' ' |
91 | ( | |
739edb2a JS |
92 | cd victim && |
93 | test_might_fail git branch -D extra && | |
94 | git config receive.denyDeletes true && | |
966b4be2 | 95 | git branch extra main |
2f334155 | 96 | ) && |
966b4be2 | 97 | test_must_fail git send-pack ./victim :extra main |
a240de11 | 98 | ' |
a240de11 | 99 | |
655e8d9c JN |
100 | test_expect_success 'cannot override denyDeletes with git -c send-pack' ' |
101 | ( | |
102 | cd victim && | |
103 | test_might_fail git branch -D extra && | |
104 | git config receive.denyDeletes true && | |
966b4be2 | 105 | git branch extra main |
655e8d9c JN |
106 | ) && |
107 | test_must_fail git -c receive.denyDeletes=false \ | |
966b4be2 | 108 | send-pack ./victim :extra main |
655e8d9c JN |
109 | ' |
110 | ||
111 | test_expect_success 'override denyDeletes with git -c receive-pack' ' | |
112 | ( | |
113 | cd victim && | |
114 | test_might_fail git branch -D extra && | |
115 | git config receive.denyDeletes true && | |
966b4be2 | 116 | git branch extra main |
655e8d9c JN |
117 | ) && |
118 | git send-pack \ | |
119 | --receive-pack="git -c receive.denyDeletes=false receive-pack" \ | |
966b4be2 | 120 | ./victim :extra main |
655e8d9c JN |
121 | ' |
122 | ||
2f334155 JH |
123 | test_expect_success 'denyNonFastforwards trumps --force' ' |
124 | ( | |
739edb2a JS |
125 | cd victim && |
126 | test_might_fail git branch -D extra && | |
127 | git config receive.denyNonFastforwards true | |
2f334155 | 128 | ) && |
966b4be2 JS |
129 | victim_orig=$(cd victim && git rev-parse --verify main) && |
130 | test_must_fail git send-pack --force ./victim main^:main && | |
131 | victim_head=$(cd victim && git rev-parse --verify main) && | |
2f334155 | 132 | test "$victim_orig" = "$victim_head" |
199a9218 JS |
133 | ' |
134 | ||
c6777563 SK |
135 | test_expect_success 'send-pack --all sends all branches' ' |
136 | # make sure we have at least 2 branches with different | |
137 | # values, just to be thorough | |
138 | git branch other-branch HEAD^ && | |
139 | ||
140 | git init --bare all.git && | |
141 | git send-pack --all all.git && | |
142 | git for-each-ref refs/heads >expect && | |
143 | git -C all.git for-each-ref refs/heads >actual && | |
144 | test_cmp expect actual | |
145 | ' | |
146 | ||
60109d0e | 147 | test_expect_success 'push --all excludes remote-tracking hierarchy' ' |
2f334155 JH |
148 | mkdir parent && |
149 | ( | |
739edb2a JS |
150 | cd parent && |
151 | git init && : >file && git add file && git commit -m add | |
2f334155 JH |
152 | ) && |
153 | git clone parent child && | |
154 | ( | |
739edb2a | 155 | cd child && git push --all |
2f334155 JH |
156 | ) && |
157 | ( | |
739edb2a JS |
158 | cd parent && |
159 | test -z "$(git for-each-ref refs/remotes/origin)" | |
2f334155 | 160 | ) |
5c633a4c JK |
161 | ' |
162 | ||
4b7f2fa4 | 163 | test_expect_success 'receive-pack runs auto-gc in remote repo' ' |
2c3fd4bb BC |
164 | rm -rf parent child && |
165 | git init parent && | |
166 | ( | |
739edb2a JS |
167 | # Setup a repo with 2 packs |
168 | cd parent && | |
169 | echo "Some text" >file.txt && | |
170 | git add . && | |
171 | git commit -m "Initial commit" && | |
172 | git repack -adl && | |
173 | echo "Some more text" >>file.txt && | |
174 | git commit -a -m "Second commit" && | |
175 | git repack | |
2c3fd4bb | 176 | ) && |
d4a7ffaa | 177 | cp -R parent child && |
2c3fd4bb | 178 | ( |
739edb2a JS |
179 | # Set the child to auto-pack if more than one pack exists |
180 | cd child && | |
181 | git config gc.autopacklimit 1 && | |
182 | git config gc.autodetach false && | |
183 | git branch test_auto_gc && | |
184 | # And create a file that follows the temporary object naming | |
185 | # convention for the auto-gc to remove | |
186 | : >.git/objects/tmp_test_object && | |
187 | test-tool chmtime =-1209601 .git/objects/tmp_test_object | |
2c3fd4bb BC |
188 | ) && |
189 | ( | |
739edb2a JS |
190 | cd parent && |
191 | echo "Even more text" >>file.txt && | |
192 | git commit -a -m "Third commit" && | |
193 | git send-pack ../child HEAD:refs/heads/test_auto_gc | |
2c3fd4bb BC |
194 | ) && |
195 | test ! -e child/.git/objects/tmp_test_object | |
196 | ' | |
197 | ||
5eb73581 JK |
198 | rewound_push_setup() { |
199 | rm -rf parent child && | |
2f334155 JH |
200 | mkdir parent && |
201 | ( | |
739edb2a JS |
202 | cd parent && |
203 | git init && | |
204 | echo one >file && git add file && git commit -m one && | |
205 | git config receive.denyCurrentBranch warn && | |
206 | echo two >file && git commit -a -m two | |
2f334155 JH |
207 | ) && |
208 | git clone parent child && | |
209 | ( | |
739edb2a | 210 | cd child && git reset --hard HEAD^ |
2f334155 | 211 | ) |
5eb73581 JK |
212 | } |
213 | ||
2f334155 | 214 | test_expect_success 'pushing explicit refspecs respects forcing' ' |
5eb73581 | 215 | rewound_push_setup && |
966b4be2 | 216 | parent_orig=$(cd parent && git rev-parse --verify main) && |
2f334155 | 217 | ( |
739edb2a JS |
218 | cd child && |
219 | test_must_fail git send-pack ../parent \ | |
966b4be2 | 220 | refs/heads/main:refs/heads/main |
2f334155 | 221 | ) && |
966b4be2 | 222 | parent_head=$(cd parent && git rev-parse --verify main) && |
2f334155 JH |
223 | test "$parent_orig" = "$parent_head" && |
224 | ( | |
739edb2a JS |
225 | cd child && |
226 | git send-pack ../parent \ | |
966b4be2 | 227 | +refs/heads/main:refs/heads/main |
2f334155 | 228 | ) && |
966b4be2 JS |
229 | parent_head=$(cd parent && git rev-parse --verify main) && |
230 | child_head=$(cd child && git rev-parse --verify main) && | |
2f334155 | 231 | test "$parent_head" = "$child_head" |
5eb73581 JK |
232 | ' |
233 | ||
2f334155 | 234 | test_expect_success 'pushing wildcard refspecs respects forcing' ' |
5eb73581 | 235 | rewound_push_setup && |
966b4be2 | 236 | parent_orig=$(cd parent && git rev-parse --verify main) && |
2f334155 | 237 | ( |
739edb2a JS |
238 | cd child && |
239 | test_must_fail git send-pack ../parent \ | |
240 | "refs/heads/*:refs/heads/*" | |
2f334155 | 241 | ) && |
966b4be2 | 242 | parent_head=$(cd parent && git rev-parse --verify main) && |
2f334155 JH |
243 | test "$parent_orig" = "$parent_head" && |
244 | ( | |
739edb2a JS |
245 | cd child && |
246 | git send-pack ../parent \ | |
247 | "+refs/heads/*:refs/heads/*" | |
2f334155 | 248 | ) && |
966b4be2 JS |
249 | parent_head=$(cd parent && git rev-parse --verify main) && |
250 | child_head=$(cd child && git rev-parse --verify main) && | |
2f334155 | 251 | test "$parent_head" = "$child_head" |
5eb73581 JK |
252 | ' |
253 | ||
375881fa | 254 | test_expect_success 'deny pushing to delete current branch' ' |
747ca245 JH |
255 | rewound_push_setup && |
256 | ( | |
739edb2a | 257 | cd child && |
966b4be2 | 258 | test_must_fail git send-pack ../parent :refs/heads/main 2>errs |
747ca245 JH |
259 | ) |
260 | ' | |
261 | ||
63d428e6 JK |
262 | extract_ref_advertisement () { |
263 | perl -lne ' | |
264 | # \\ is there to skip capabilities after \0 | |
265 | /push< ([^\\]+)/ or next; | |
266 | exit 0 if $1 eq "0000"; | |
267 | print $1; | |
268 | ' | |
269 | } | |
270 | ||
271 | test_expect_success 'receive-pack de-dupes .have lines' ' | |
272 | git init shared && | |
273 | git -C shared commit --allow-empty -m both && | |
274 | git clone -s shared fork && | |
275 | ( | |
276 | cd shared && | |
277 | git checkout -b only-shared && | |
278 | git commit --allow-empty -m only-shared && | |
279 | git update-ref refs/heads/foo HEAD | |
280 | ) && | |
281 | ||
282 | # Notable things in this expectation: | |
283 | # - local refs are not de-duped | |
284 | # - .have does not duplicate locals | |
285 | # - .have does not duplicate itself | |
286 | local=$(git -C fork rev-parse HEAD) && | |
287 | shared=$(git -C shared rev-parse only-shared) && | |
288 | cat >expect <<-EOF && | |
966b4be2 | 289 | $local refs/heads/main |
63d428e6 | 290 | $local refs/remotes/origin/HEAD |
966b4be2 | 291 | $local refs/remotes/origin/main |
63d428e6 JK |
292 | $shared .have |
293 | EOF | |
294 | ||
8a1b0978 | 295 | GIT_TRACE_PACKET=$(pwd)/trace GIT_TEST_PROTOCOL_VERSION=0 \ |
739edb2a | 296 | git push \ |
71406ed4 JK |
297 | --receive-pack="unset GIT_TRACE_PACKET; git-receive-pack" \ |
298 | fork HEAD:foo && | |
63d428e6 JK |
299 | extract_ref_advertisement <trace >refs && |
300 | test_cmp expect refs | |
301 | ' | |
302 | ||
da7bc9b0 | 303 | test_done |