]> git.ipfire.org Git - thirdparty/git.git/blame - t/t5400-send-pack.sh
Start the 2.46 cycle
[thirdparty/git.git] / t / t5400-send-pack.sh
CommitLineData
bdf25142
LT
1#!/bin/sh
2#
3# Copyright (c) 2005 Junio C Hamano
4#
5
6test_description='See why rewinding head breaks send-pack
7
8'
966b4be2 9GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
334afbc7
JS
10export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
11
bdf25142
LT
12. ./test-lib.sh
13
04509738 14cnt=64
bdf25142 15test_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
58test_expect_success 'pack the source repository' '
59 git repack -a -d &&
026aa938 60 git prune
04509738
JH
61'
62
63test_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 71test_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 83test_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
90test_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
100test_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
111test_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
123test_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
135test_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 147test_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 163test_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
198rewound_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 214test_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 234test_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 254test_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
262extract_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
271test_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 303test_done