sequencer: pass absolute GIT_DIR to exec commands
[git] / t / t1400-update-ref.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2006 Shawn Pearce
4 #
5
6 test_description='Test git update-ref and basic ref logging'
7 . ./test-lib.sh
8
9 Z=$_z40
10
11 m=refs/heads/master
12 n_dir=refs/heads/gu
13 n=$n_dir/fixes
14 outside=refs/foo
15 bare=bare-repo
16
17 create_test_commits ()
18 {
19         prfx="$1"
20         for name in A B C D E F
21         do
22                 test_tick &&
23                 T=$(git write-tree) &&
24                 sha1=$(echo $name | git commit-tree $T) &&
25                 eval $prfx$name=$sha1
26         done
27 }
28
29 test_expect_success setup '
30         create_test_commits "" &&
31         mkdir $bare &&
32         cd $bare &&
33         git init --bare &&
34         create_test_commits "bare" &&
35         cd -
36 '
37
38 test_expect_success \
39         "create $m" \
40         "git update-ref $m $A &&
41          test $A"' = $(cat .git/'"$m"')'
42 test_expect_success \
43         "create $m" \
44         "git update-ref $m $B $A &&
45          test $B"' = $(cat .git/'"$m"')'
46 test_expect_success "fail to delete $m with stale ref" '
47         test_must_fail git update-ref -d $m $A &&
48         test $B = "$(cat .git/$m)"
49 '
50 test_expect_success "delete $m" '
51         git update-ref -d $m $B &&
52         ! test -f .git/$m
53 '
54 rm -f .git/$m
55
56 test_expect_success "delete $m without oldvalue verification" "
57         git update-ref $m $A &&
58         test $A = \$(cat .git/$m) &&
59         git update-ref -d $m &&
60         ! test -f .git/$m
61 "
62 rm -f .git/$m
63
64 test_expect_success \
65         "fail to create $n" \
66         "touch .git/$n_dir &&
67          test_must_fail git update-ref $n $A >out 2>err"
68 rm -f .git/$n_dir out err
69
70 test_expect_success \
71         "create $m (by HEAD)" \
72         "git update-ref HEAD $A &&
73          test $A"' = $(cat .git/'"$m"')'
74 test_expect_success \
75         "create $m (by HEAD)" \
76         "git update-ref HEAD $B $A &&
77          test $B"' = $(cat .git/'"$m"')'
78 test_expect_success "fail to delete $m (by HEAD) with stale ref" '
79         test_must_fail git update-ref -d HEAD $A &&
80         test $B = $(cat .git/$m)
81 '
82 test_expect_success "delete $m (by HEAD)" '
83         git update-ref -d HEAD $B &&
84         ! test -f .git/$m
85 '
86 rm -f .git/$m
87
88 test_expect_success 'update-ref does not create reflogs by default' '
89         test_when_finished "git update-ref -d $outside" &&
90         git update-ref $outside $A &&
91         git rev-parse $A >expect &&
92         git rev-parse $outside >actual &&
93         test_cmp expect actual &&
94         test_must_fail git reflog exists $outside
95 '
96
97 test_expect_success 'update-ref creates reflogs with --create-reflog' '
98         test_when_finished "git update-ref -d $outside" &&
99         git update-ref --create-reflog $outside $A &&
100         git rev-parse $A >expect &&
101         git rev-parse $outside >actual &&
102         test_cmp expect actual &&
103         git reflog exists $outside
104 '
105
106 test_expect_success 'creates no reflog in bare repository' '
107         git -C $bare update-ref $m $bareA &&
108         git -C $bare rev-parse $bareA >expect &&
109         git -C $bare rev-parse $m >actual &&
110         test_cmp expect actual &&
111         test_must_fail git -C $bare reflog exists $m
112 '
113
114 test_expect_success 'core.logAllRefUpdates=true creates reflog in bare repository' '
115         test_when_finished "git -C $bare config --unset core.logAllRefUpdates && \
116                 rm $bare/logs/$m" &&
117         git -C $bare config core.logAllRefUpdates true &&
118         git -C $bare update-ref $m $bareB &&
119         git -C $bare rev-parse $bareB >expect &&
120         git -C $bare rev-parse $m >actual &&
121         test_cmp expect actual &&
122         git -C $bare reflog exists $m
123 '
124
125 test_expect_success 'core.logAllRefUpdates=true does not create reflog by default' '
126         test_config core.logAllRefUpdates true &&
127         test_when_finished "git update-ref -d $outside" &&
128         git update-ref $outside $A &&
129         git rev-parse $A >expect &&
130         git rev-parse $outside >actual &&
131         test_cmp expect actual &&
132         test_must_fail git reflog exists $outside
133 '
134
135 test_expect_success 'core.logAllRefUpdates=always creates reflog by default' '
136         test_config core.logAllRefUpdates always &&
137         test_when_finished "git update-ref -d $outside" &&
138         git update-ref $outside $A &&
139         git rev-parse $A >expect &&
140         git rev-parse $outside >actual &&
141         test_cmp expect actual &&
142         git reflog exists $outside
143 '
144
145 test_expect_success 'core.logAllRefUpdates=always creates no reflog for ORIG_HEAD' '
146         test_config core.logAllRefUpdates always &&
147         git update-ref ORIG_HEAD $A &&
148         test_must_fail git reflog exists ORIG_HEAD
149 '
150
151 test_expect_success '--no-create-reflog overrides core.logAllRefUpdates=always' '
152         test_config core.logAllRefUpdates true &&
153         test_when_finished "git update-ref -d $outside" &&
154         git update-ref --no-create-reflog $outside $A &&
155         git rev-parse $A >expect &&
156         git rev-parse $outside >actual &&
157         test_cmp expect actual &&
158         test_must_fail git reflog exists $outside
159 '
160
161 test_expect_success \
162         "create $m (by HEAD)" \
163         "git update-ref HEAD $A &&
164          test $A"' = $(cat .git/'"$m"')'
165 test_expect_success \
166         "pack refs" \
167         "git pack-refs --all"
168 test_expect_success \
169         "move $m (by HEAD)" \
170         "git update-ref HEAD $B $A &&
171          test $B"' = $(cat .git/'"$m"')'
172 test_expect_success "delete $m (by HEAD) should remove both packed and loose $m" '
173         git update-ref -d HEAD $B &&
174         ! grep "$m" .git/packed-refs &&
175         ! test -f .git/$m
176 '
177 rm -f .git/$m
178
179 cp -f .git/HEAD .git/HEAD.orig
180 test_expect_success "delete symref without dereference" '
181         git update-ref --no-deref -d HEAD &&
182         ! test -f .git/HEAD
183 '
184 cp -f .git/HEAD.orig .git/HEAD
185
186 test_expect_success "delete symref without dereference when the referred ref is packed" '
187         echo foo >foo.c &&
188         git add foo.c &&
189         git commit -m foo &&
190         git pack-refs --all &&
191         git update-ref --no-deref -d HEAD &&
192         ! test -f .git/HEAD
193 '
194 cp -f .git/HEAD.orig .git/HEAD
195 git update-ref -d $m
196
197 test_expect_success 'update-ref -d is not confused by self-reference' '
198         git symbolic-ref refs/heads/self refs/heads/self &&
199         test_when_finished "rm -f .git/refs/heads/self" &&
200         test_path_is_file .git/refs/heads/self &&
201         test_must_fail git update-ref -d refs/heads/self &&
202         test_path_is_file .git/refs/heads/self
203 '
204
205 test_expect_success 'update-ref --no-deref -d can delete self-reference' '
206         git symbolic-ref refs/heads/self refs/heads/self &&
207         test_when_finished "rm -f .git/refs/heads/self" &&
208         test_path_is_file .git/refs/heads/self &&
209         git update-ref --no-deref -d refs/heads/self &&
210         test_path_is_missing .git/refs/heads/self
211 '
212
213 test_expect_success 'update-ref --no-deref -d can delete reference to bad ref' '
214         >.git/refs/heads/bad &&
215         test_when_finished "rm -f .git/refs/heads/bad" &&
216         git symbolic-ref refs/heads/ref-to-bad refs/heads/bad &&
217         test_when_finished "rm -f .git/refs/heads/ref-to-bad" &&
218         test_path_is_file .git/refs/heads/ref-to-bad &&
219         git update-ref --no-deref -d refs/heads/ref-to-bad &&
220         test_path_is_missing .git/refs/heads/ref-to-bad
221 '
222
223 test_expect_success '(not) create HEAD with old sha1' "
224         test_must_fail git update-ref HEAD $A $B
225 "
226 test_expect_success "(not) prior created .git/$m" "
227         ! test -f .git/$m
228 "
229 rm -f .git/$m
230
231 test_expect_success \
232         "create HEAD" \
233         "git update-ref HEAD $A"
234 test_expect_success '(not) change HEAD with wrong SHA1' "
235         test_must_fail git update-ref HEAD $B $Z
236 "
237 test_expect_success "(not) changed .git/$m" "
238         ! test $B"' = $(cat .git/'"$m"')
239 '
240 rm -f .git/$m
241
242 rm -f .git/logs/refs/heads/master
243 test_expect_success \
244         "create $m (logged by touch)" \
245         'GIT_COMMITTER_DATE="2005-05-26 23:30" \
246          git update-ref --create-reflog HEAD '"$A"' -m "Initial Creation" &&
247          test '"$A"' = $(cat .git/'"$m"')'
248 test_expect_success \
249         "update $m (logged by touch)" \
250         'GIT_COMMITTER_DATE="2005-05-26 23:31" \
251          git update-ref HEAD'" $B $A "'-m "Switch" &&
252          test '"$B"' = $(cat .git/'"$m"')'
253 test_expect_success \
254         "set $m (logged by touch)" \
255         'GIT_COMMITTER_DATE="2005-05-26 23:41" \
256          git update-ref HEAD'" $A &&
257          test $A"' = $(cat .git/'"$m"')'
258
259 test_expect_success "empty directory removal" '
260         git branch d1/d2/r1 HEAD &&
261         git branch d1/r2 HEAD &&
262         test -f .git/refs/heads/d1/d2/r1 &&
263         test -f .git/logs/refs/heads/d1/d2/r1 &&
264         git branch -d d1/d2/r1 &&
265         ! test -e .git/refs/heads/d1/d2 &&
266         ! test -e .git/logs/refs/heads/d1/d2 &&
267         test -f .git/refs/heads/d1/r2 &&
268         test -f .git/logs/refs/heads/d1/r2
269 '
270
271 test_expect_success "symref empty directory removal" '
272         git branch e1/e2/r1 HEAD &&
273         git branch e1/r2 HEAD &&
274         git checkout e1/e2/r1 &&
275         test_when_finished "git checkout master" &&
276         test -f .git/refs/heads/e1/e2/r1 &&
277         test -f .git/logs/refs/heads/e1/e2/r1 &&
278         git update-ref -d HEAD &&
279         ! test -e .git/refs/heads/e1/e2 &&
280         ! test -e .git/logs/refs/heads/e1/e2 &&
281         test -f .git/refs/heads/e1/r2 &&
282         test -f .git/logs/refs/heads/e1/r2 &&
283         test -f .git/logs/HEAD
284 '
285
286 cat >expect <<EOF
287 $Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000       Initial Creation
288 $A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150260 +0000       Switch
289 $B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000
290 EOF
291 test_expect_success \
292         "verifying $m's log" \
293         "test_cmp expect .git/logs/$m"
294 rm -rf .git/$m .git/logs expect
295
296 test_expect_success \
297         'enable core.logAllRefUpdates' \
298         'git config core.logAllRefUpdates true &&
299          test true = $(git config --bool --get core.logAllRefUpdates)'
300
301 test_expect_success \
302         "create $m (logged by config)" \
303         'GIT_COMMITTER_DATE="2005-05-26 23:32" \
304          git update-ref HEAD'" $A "'-m "Initial Creation" &&
305          test '"$A"' = $(cat .git/'"$m"')'
306 test_expect_success \
307         "update $m (logged by config)" \
308         'GIT_COMMITTER_DATE="2005-05-26 23:33" \
309          git update-ref HEAD'" $B $A "'-m "Switch" &&
310          test '"$B"' = $(cat .git/'"$m"')'
311 test_expect_success \
312         "set $m (logged by config)" \
313         'GIT_COMMITTER_DATE="2005-05-26 23:43" \
314          git update-ref HEAD '"$A &&
315          test $A"' = $(cat .git/'"$m"')'
316
317 cat >expect <<EOF
318 $Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 +0000       Initial Creation
319 $A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 +0000       Switch
320 $B $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 +0000
321 EOF
322 test_expect_success \
323         "verifying $m's log" \
324         'test_cmp expect .git/logs/$m'
325 rm -f .git/$m .git/logs/$m expect
326
327 git update-ref $m $D
328 cat >.git/logs/$m <<EOF
329 0000000000000000000000000000000000000000 $C $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 -0500
330 $C $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150350 -0500
331 $A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 -0500
332 $F $Z $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150680 -0500
333 $Z $E $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 -0500
334 EOF
335
336 ed="Thu, 26 May 2005 18:32:00 -0500"
337 gd="Thu, 26 May 2005 18:33:00 -0500"
338 ld="Thu, 26 May 2005 18:43:00 -0500"
339 test_expect_success \
340         'Query "master@{May 25 2005}" (before history)' \
341         'rm -f o e &&
342          git rev-parse --verify "master@{May 25 2005}" >o 2>e &&
343          test '"$C"' = $(cat o) &&
344          test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
345 test_expect_success \
346         "Query master@{2005-05-25} (before history)" \
347         'rm -f o e &&
348          git rev-parse --verify master@{2005-05-25} >o 2>e &&
349          test '"$C"' = $(cat o) &&
350          echo test "warning: Log for '\'master\'' only goes back to $ed." = "$(cat e)"'
351 test_expect_success \
352         'Query "master@{May 26 2005 23:31:59}" (1 second before history)' \
353         'rm -f o e &&
354          git rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e &&
355          test '"$C"' = $(cat o) &&
356          test "warning: Log for '\''master'\'' only goes back to $ed." = "$(cat e)"'
357 test_expect_success \
358         'Query "master@{May 26 2005 23:32:00}" (exactly history start)' \
359         'rm -f o e &&
360          git rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e &&
361          test '"$C"' = $(cat o) &&
362          test "" = "$(cat e)"'
363 test_expect_success \
364         'Query "master@{May 26 2005 23:32:30}" (first non-creation change)' \
365         'rm -f o e &&
366          git rev-parse --verify "master@{May 26 2005 23:32:30}" >o 2>e &&
367          test '"$A"' = $(cat o) &&
368          test "" = "$(cat e)"'
369 test_expect_success \
370         'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)' \
371         'rm -f o e &&
372          git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&
373          test '"$B"' = $(cat o) &&
374          test "warning: Log for ref '"$m has gap after $gd"'." = "$(cat e)"'
375 test_expect_success \
376         'Query "master@{2005-05-26 23:38:00}" (middle of history)' \
377         'rm -f o e &&
378          git rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e &&
379          test '"$Z"' = $(cat o) &&
380          test "" = "$(cat e)"'
381 test_expect_success \
382         'Query "master@{2005-05-26 23:43:00}" (exact end of history)' \
383         'rm -f o e &&
384          git rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e &&
385          test '"$E"' = $(cat o) &&
386          test "" = "$(cat e)"'
387 test_expect_success \
388         'Query "master@{2005-05-28}" (past end of history)' \
389         'rm -f o e &&
390          git rev-parse --verify "master@{2005-05-28}" >o 2>e &&
391          test '"$D"' = $(cat o) &&
392          test "warning: Log for ref '"$m unexpectedly ended on $ld"'." = "$(cat e)"'
393
394
395 rm -f .git/$m .git/logs/$m expect
396
397 test_expect_success \
398     'creating initial files' \
399     'echo TEST >F &&
400      git add F &&
401          GIT_AUTHOR_DATE="2005-05-26 23:30" \
402          GIT_COMMITTER_DATE="2005-05-26 23:30" git commit -m add -a &&
403          h_TEST=$(git rev-parse --verify HEAD) &&
404          echo The other day this did not work. >M &&
405          echo And then Bob told me how to fix it. >>M &&
406          echo OTHER >F &&
407          GIT_AUTHOR_DATE="2005-05-26 23:41" \
408          GIT_COMMITTER_DATE="2005-05-26 23:41" git commit -F M -a &&
409          h_OTHER=$(git rev-parse --verify HEAD) &&
410          GIT_AUTHOR_DATE="2005-05-26 23:44" \
411          GIT_COMMITTER_DATE="2005-05-26 23:44" git commit --amend &&
412          h_FIXED=$(git rev-parse --verify HEAD) &&
413          echo Merged initial commit and a later commit. >M &&
414          echo $h_TEST >.git/MERGE_HEAD &&
415          GIT_AUTHOR_DATE="2005-05-26 23:45" \
416          GIT_COMMITTER_DATE="2005-05-26 23:45" git commit -F M &&
417          h_MERGED=$(git rev-parse --verify HEAD) &&
418          rm -f M'
419
420 cat >expect <<EOF
421 $Z $h_TEST $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000  commit (initial): add
422 $h_TEST $h_OTHER $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150860 +0000    commit: The other day this did not work.
423 $h_OTHER $h_FIXED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151040 +0000   commit (amend): The other day this did not work.
424 $h_FIXED $h_MERGED $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117151100 +0000  commit (merge): Merged initial commit and a later commit.
425 EOF
426 test_expect_success \
427         'git commit logged updates' \
428         "test_cmp expect .git/logs/$m"
429 unset h_TEST h_OTHER h_FIXED h_MERGED
430
431 test_expect_success \
432         'git cat-file blob master:F (expect OTHER)' \
433         'test OTHER = $(git cat-file blob master:F)'
434 test_expect_success \
435         'git cat-file blob master@{2005-05-26 23:30}:F (expect TEST)' \
436         'test TEST = $(git cat-file blob "master@{2005-05-26 23:30}:F")'
437 test_expect_success \
438         'git cat-file blob master@{2005-05-26 23:42}:F (expect OTHER)' \
439         'test OTHER = $(git cat-file blob "master@{2005-05-26 23:42}:F")'
440
441 a=refs/heads/a
442 b=refs/heads/b
443 c=refs/heads/c
444 E='""'
445 F='%s\0'
446 pws='path with space'
447
448 test_expect_success 'stdin test setup' '
449         echo "$pws" >"$pws" &&
450         git add -- "$pws" &&
451         git commit -m "$pws"
452 '
453
454 test_expect_success '-z fails without --stdin' '
455         test_must_fail git update-ref -z $m $m $m 2>err &&
456         test_i18ngrep "usage: git update-ref" err
457 '
458
459 test_expect_success 'stdin works with no input' '
460         >stdin &&
461         git update-ref --stdin <stdin &&
462         git rev-parse --verify -q $m
463 '
464
465 test_expect_success 'stdin fails on empty line' '
466         echo "" >stdin &&
467         test_must_fail git update-ref --stdin <stdin 2>err &&
468         grep "fatal: empty command in input" err
469 '
470
471 test_expect_success 'stdin fails on only whitespace' '
472         echo " " >stdin &&
473         test_must_fail git update-ref --stdin <stdin 2>err &&
474         grep "fatal: whitespace before command:  " err
475 '
476
477 test_expect_success 'stdin fails on leading whitespace' '
478         echo " create $a $m" >stdin &&
479         test_must_fail git update-ref --stdin <stdin 2>err &&
480         grep "fatal: whitespace before command:  create $a $m" err
481 '
482
483 test_expect_success 'stdin fails on unknown command' '
484         echo "unknown $a" >stdin &&
485         test_must_fail git update-ref --stdin <stdin 2>err &&
486         grep "fatal: unknown command: unknown $a" err
487 '
488
489 test_expect_success 'stdin fails on unbalanced quotes' '
490         echo "create $a \"master" >stdin &&
491         test_must_fail git update-ref --stdin <stdin 2>err &&
492         grep "fatal: badly quoted argument: \\\"master" err
493 '
494
495 test_expect_success 'stdin fails on invalid escape' '
496         echo "create $a \"ma\zter\"" >stdin &&
497         test_must_fail git update-ref --stdin <stdin 2>err &&
498         grep "fatal: badly quoted argument: \\\"ma\\\\zter\\\"" err
499 '
500
501 test_expect_success 'stdin fails on junk after quoted argument' '
502         echo "create \"$a\"master" >stdin &&
503         test_must_fail git update-ref --stdin <stdin 2>err &&
504         grep "fatal: unexpected character after quoted argument: \\\"$a\\\"master" err
505 '
506
507 test_expect_success 'stdin fails create with no ref' '
508         echo "create " >stdin &&
509         test_must_fail git update-ref --stdin <stdin 2>err &&
510         grep "fatal: create: missing <ref>" err
511 '
512
513 test_expect_success 'stdin fails create with no new value' '
514         echo "create $a" >stdin &&
515         test_must_fail git update-ref --stdin <stdin 2>err &&
516         grep "fatal: create $a: missing <newvalue>" err
517 '
518
519 test_expect_success 'stdin fails create with too many arguments' '
520         echo "create $a $m $m" >stdin &&
521         test_must_fail git update-ref --stdin <stdin 2>err &&
522         grep "fatal: create $a: extra input:  $m" err
523 '
524
525 test_expect_success 'stdin fails update with no ref' '
526         echo "update " >stdin &&
527         test_must_fail git update-ref --stdin <stdin 2>err &&
528         grep "fatal: update: missing <ref>" err
529 '
530
531 test_expect_success 'stdin fails update with no new value' '
532         echo "update $a" >stdin &&
533         test_must_fail git update-ref --stdin <stdin 2>err &&
534         grep "fatal: update $a: missing <newvalue>" err
535 '
536
537 test_expect_success 'stdin fails update with too many arguments' '
538         echo "update $a $m $m $m" >stdin &&
539         test_must_fail git update-ref --stdin <stdin 2>err &&
540         grep "fatal: update $a: extra input:  $m" err
541 '
542
543 test_expect_success 'stdin fails delete with no ref' '
544         echo "delete " >stdin &&
545         test_must_fail git update-ref --stdin <stdin 2>err &&
546         grep "fatal: delete: missing <ref>" err
547 '
548
549 test_expect_success 'stdin fails delete with too many arguments' '
550         echo "delete $a $m $m" >stdin &&
551         test_must_fail git update-ref --stdin <stdin 2>err &&
552         grep "fatal: delete $a: extra input:  $m" err
553 '
554
555 test_expect_success 'stdin fails verify with too many arguments' '
556         echo "verify $a $m $m" >stdin &&
557         test_must_fail git update-ref --stdin <stdin 2>err &&
558         grep "fatal: verify $a: extra input:  $m" err
559 '
560
561 test_expect_success 'stdin fails option with unknown name' '
562         echo "option unknown" >stdin &&
563         test_must_fail git update-ref --stdin <stdin 2>err &&
564         grep "fatal: option unknown: unknown" err
565 '
566
567 test_expect_success 'stdin fails with duplicate refs' '
568         cat >stdin <<-EOF &&
569         create $a $m
570         create $b $m
571         create $a $m
572         EOF
573         test_must_fail git update-ref --stdin <stdin 2>err &&
574         grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed." err
575 '
576
577 test_expect_success 'stdin create ref works' '
578         echo "create $a $m" >stdin &&
579         git update-ref --stdin <stdin &&
580         git rev-parse $m >expect &&
581         git rev-parse $a >actual &&
582         test_cmp expect actual
583 '
584
585 test_expect_success 'stdin does not create reflogs by default' '
586         test_when_finished "git update-ref -d $outside" &&
587         echo "create $outside $m" >stdin &&
588         git update-ref --stdin <stdin &&
589         git rev-parse $m >expect &&
590         git rev-parse $outside >actual &&
591         test_cmp expect actual &&
592         test_must_fail git reflog exists $outside
593 '
594
595 test_expect_success 'stdin creates reflogs with --create-reflog' '
596         test_when_finished "git update-ref -d $outside" &&
597         echo "create $outside $m" >stdin &&
598         git update-ref --create-reflog --stdin <stdin &&
599         git rev-parse $m >expect &&
600         git rev-parse $outside >actual &&
601         test_cmp expect actual &&
602         git reflog exists $outside
603 '
604
605 test_expect_success 'stdin succeeds with quoted argument' '
606         git update-ref -d $a &&
607         echo "create $a \"$m\"" >stdin &&
608         git update-ref --stdin <stdin &&
609         git rev-parse $m >expect &&
610         git rev-parse $a >actual &&
611         test_cmp expect actual
612 '
613
614 test_expect_success 'stdin succeeds with escaped character' '
615         git update-ref -d $a &&
616         echo "create $a \"ma\\163ter\"" >stdin &&
617         git update-ref --stdin <stdin &&
618         git rev-parse $m >expect &&
619         git rev-parse $a >actual &&
620         test_cmp expect actual
621 '
622
623 test_expect_success 'stdin update ref creates with zero old value' '
624         echo "update $b $m $Z" >stdin &&
625         git update-ref --stdin <stdin &&
626         git rev-parse $m >expect &&
627         git rev-parse $b >actual &&
628         test_cmp expect actual &&
629         git update-ref -d $b
630 '
631
632 test_expect_success 'stdin update ref creates with empty old value' '
633         echo "update $b $m $E" >stdin &&
634         git update-ref --stdin <stdin &&
635         git rev-parse $m >expect &&
636         git rev-parse $b >actual &&
637         test_cmp expect actual
638 '
639
640 test_expect_success 'stdin create ref works with path with space to blob' '
641         echo "create refs/blobs/pws \"$m:$pws\"" >stdin &&
642         git update-ref --stdin <stdin &&
643         git rev-parse "$m:$pws" >expect &&
644         git rev-parse refs/blobs/pws >actual &&
645         test_cmp expect actual &&
646         git update-ref -d refs/blobs/pws
647 '
648
649 test_expect_success 'stdin update ref fails with wrong old value' '
650         echo "update $c $m $m~1" >stdin &&
651         test_must_fail git update-ref --stdin <stdin 2>err &&
652         grep "fatal: cannot lock ref '"'"'$c'"'"'" err &&
653         test_must_fail git rev-parse --verify -q $c
654 '
655
656 test_expect_success 'stdin update ref fails with bad old value' '
657         echo "update $c $m does-not-exist" >stdin &&
658         test_must_fail git update-ref --stdin <stdin 2>err &&
659         grep "fatal: update $c: invalid <oldvalue>: does-not-exist" err &&
660         test_must_fail git rev-parse --verify -q $c
661 '
662
663 test_expect_success 'stdin create ref fails with bad new value' '
664         echo "create $c does-not-exist" >stdin &&
665         test_must_fail git update-ref --stdin <stdin 2>err &&
666         grep "fatal: create $c: invalid <newvalue>: does-not-exist" err &&
667         test_must_fail git rev-parse --verify -q $c
668 '
669
670 test_expect_success 'stdin create ref fails with zero new value' '
671         echo "create $c " >stdin &&
672         test_must_fail git update-ref --stdin <stdin 2>err &&
673         grep "fatal: create $c: zero <newvalue>" err &&
674         test_must_fail git rev-parse --verify -q $c
675 '
676
677 test_expect_success 'stdin update ref works with right old value' '
678         echo "update $b $m~1 $m" >stdin &&
679         git update-ref --stdin <stdin &&
680         git rev-parse $m~1 >expect &&
681         git rev-parse $b >actual &&
682         test_cmp expect actual
683 '
684
685 test_expect_success 'stdin delete ref fails with wrong old value' '
686         echo "delete $a $m~1" >stdin &&
687         test_must_fail git update-ref --stdin <stdin 2>err &&
688         grep "fatal: cannot lock ref '"'"'$a'"'"'" err &&
689         git rev-parse $m >expect &&
690         git rev-parse $a >actual &&
691         test_cmp expect actual
692 '
693
694 test_expect_success 'stdin delete ref fails with zero old value' '
695         echo "delete $a " >stdin &&
696         test_must_fail git update-ref --stdin <stdin 2>err &&
697         grep "fatal: delete $a: zero <oldvalue>" err &&
698         git rev-parse $m >expect &&
699         git rev-parse $a >actual &&
700         test_cmp expect actual
701 '
702
703 test_expect_success 'stdin update symref works option no-deref' '
704         git symbolic-ref TESTSYMREF $b &&
705         cat >stdin <<-EOF &&
706         option no-deref
707         update TESTSYMREF $a $b
708         EOF
709         git update-ref --stdin <stdin &&
710         git rev-parse TESTSYMREF >expect &&
711         git rev-parse $a >actual &&
712         test_cmp expect actual &&
713         git rev-parse $m~1 >expect &&
714         git rev-parse $b >actual &&
715         test_cmp expect actual
716 '
717
718 test_expect_success 'stdin delete symref works option no-deref' '
719         git symbolic-ref TESTSYMREF $b &&
720         cat >stdin <<-EOF &&
721         option no-deref
722         delete TESTSYMREF $b
723         EOF
724         git update-ref --stdin <stdin &&
725         test_must_fail git rev-parse --verify -q TESTSYMREF &&
726         git rev-parse $m~1 >expect &&
727         git rev-parse $b >actual &&
728         test_cmp expect actual
729 '
730
731 test_expect_success 'stdin delete ref works with right old value' '
732         echo "delete $b $m~1" >stdin &&
733         git update-ref --stdin <stdin &&
734         test_must_fail git rev-parse --verify -q $b
735 '
736
737 test_expect_success 'stdin update/create/verify combination works' '
738         cat >stdin <<-EOF &&
739         update $a $m
740         create $b $m
741         verify $c
742         EOF
743         git update-ref --stdin <stdin &&
744         git rev-parse $m >expect &&
745         git rev-parse $a >actual &&
746         test_cmp expect actual &&
747         git rev-parse $b >actual &&
748         test_cmp expect actual &&
749         test_must_fail git rev-parse --verify -q $c
750 '
751
752 test_expect_success 'stdin verify succeeds for correct value' '
753         git rev-parse $m >expect &&
754         echo "verify $m $m" >stdin &&
755         git update-ref --stdin <stdin &&
756         git rev-parse $m >actual &&
757         test_cmp expect actual
758 '
759
760 test_expect_success 'stdin verify succeeds for missing reference' '
761         echo "verify refs/heads/missing $Z" >stdin &&
762         git update-ref --stdin <stdin &&
763         test_must_fail git rev-parse --verify -q refs/heads/missing
764 '
765
766 test_expect_success 'stdin verify treats no value as missing' '
767         echo "verify refs/heads/missing" >stdin &&
768         git update-ref --stdin <stdin &&
769         test_must_fail git rev-parse --verify -q refs/heads/missing
770 '
771
772 test_expect_success 'stdin verify fails for wrong value' '
773         git rev-parse $m >expect &&
774         echo "verify $m $m~1" >stdin &&
775         test_must_fail git update-ref --stdin <stdin &&
776         git rev-parse $m >actual &&
777         test_cmp expect actual
778 '
779
780 test_expect_success 'stdin verify fails for mistaken null value' '
781         git rev-parse $m >expect &&
782         echo "verify $m $Z" >stdin &&
783         test_must_fail git update-ref --stdin <stdin &&
784         git rev-parse $m >actual &&
785         test_cmp expect actual
786 '
787
788 test_expect_success 'stdin verify fails for mistaken empty value' '
789         M=$(git rev-parse $m) &&
790         test_when_finished "git update-ref $m $M" &&
791         git rev-parse $m >expect &&
792         echo "verify $m" >stdin &&
793         test_must_fail git update-ref --stdin <stdin &&
794         git rev-parse $m >actual &&
795         test_cmp expect actual
796 '
797
798 test_expect_success 'stdin update refs works with identity updates' '
799         cat >stdin <<-EOF &&
800         update $a $m $m
801         update $b $m $m
802         update $c $Z $E
803         EOF
804         git update-ref --stdin <stdin &&
805         git rev-parse $m >expect &&
806         git rev-parse $a >actual &&
807         test_cmp expect actual &&
808         git rev-parse $b >actual &&
809         test_cmp expect actual &&
810         test_must_fail git rev-parse --verify -q $c
811 '
812
813 test_expect_success 'stdin update refs fails with wrong old value' '
814         git update-ref $c $m &&
815         cat >stdin <<-EOF &&
816         update $a $m $m
817         update $b $m $m
818         update $c  ''
819         EOF
820         test_must_fail git update-ref --stdin <stdin 2>err &&
821         grep "fatal: cannot lock ref '"'"'$c'"'"'" err &&
822         git rev-parse $m >expect &&
823         git rev-parse $a >actual &&
824         test_cmp expect actual &&
825         git rev-parse $b >actual &&
826         test_cmp expect actual &&
827         git rev-parse $c >actual &&
828         test_cmp expect actual
829 '
830
831 test_expect_success 'stdin delete refs works with packed and loose refs' '
832         git pack-refs --all &&
833         git update-ref $c $m~1 &&
834         cat >stdin <<-EOF &&
835         delete $a $m
836         update $b $Z $m
837         update $c $E $m~1
838         EOF
839         git update-ref --stdin <stdin &&
840         test_must_fail git rev-parse --verify -q $a &&
841         test_must_fail git rev-parse --verify -q $b &&
842         test_must_fail git rev-parse --verify -q $c
843 '
844
845 test_expect_success 'stdin -z works on empty input' '
846         >stdin &&
847         git update-ref -z --stdin <stdin &&
848         git rev-parse --verify -q $m
849 '
850
851 test_expect_success 'stdin -z fails on empty line' '
852         echo "" >stdin &&
853         test_must_fail git update-ref -z --stdin <stdin 2>err &&
854         grep "fatal: whitespace before command: " err
855 '
856
857 test_expect_success 'stdin -z fails on empty command' '
858         printf $F "" >stdin &&
859         test_must_fail git update-ref -z --stdin <stdin 2>err &&
860         grep "fatal: empty command in input" err
861 '
862
863 test_expect_success 'stdin -z fails on only whitespace' '
864         printf $F " " >stdin &&
865         test_must_fail git update-ref -z --stdin <stdin 2>err &&
866         grep "fatal: whitespace before command:  " err
867 '
868
869 test_expect_success 'stdin -z fails on leading whitespace' '
870         printf $F " create $a" "$m" >stdin &&
871         test_must_fail git update-ref -z --stdin <stdin 2>err &&
872         grep "fatal: whitespace before command:  create $a" err
873 '
874
875 test_expect_success 'stdin -z fails on unknown command' '
876         printf $F "unknown $a" >stdin &&
877         test_must_fail git update-ref -z --stdin <stdin 2>err &&
878         grep "fatal: unknown command: unknown $a" err
879 '
880
881 test_expect_success 'stdin -z fails create with no ref' '
882         printf $F "create " >stdin &&
883         test_must_fail git update-ref -z --stdin <stdin 2>err &&
884         grep "fatal: create: missing <ref>" err
885 '
886
887 test_expect_success 'stdin -z fails create with no new value' '
888         printf $F "create $a" >stdin &&
889         test_must_fail git update-ref -z --stdin <stdin 2>err &&
890         grep "fatal: create $a: unexpected end of input when reading <newvalue>" err
891 '
892
893 test_expect_success 'stdin -z fails create with too many arguments' '
894         printf $F "create $a" "$m" "$m" >stdin &&
895         test_must_fail git update-ref -z --stdin <stdin 2>err &&
896         grep "fatal: unknown command: $m" err
897 '
898
899 test_expect_success 'stdin -z fails update with no ref' '
900         printf $F "update " >stdin &&
901         test_must_fail git update-ref -z --stdin <stdin 2>err &&
902         grep "fatal: update: missing <ref>" err
903 '
904
905 test_expect_success 'stdin -z fails update with too few args' '
906         printf $F "update $a" "$m" >stdin &&
907         test_must_fail git update-ref -z --stdin <stdin 2>err &&
908         grep "fatal: update $a: unexpected end of input when reading <oldvalue>" err
909 '
910
911 test_expect_success 'stdin -z emits warning with empty new value' '
912         git update-ref $a $m &&
913         printf $F "update $a" "" "" >stdin &&
914         git update-ref -z --stdin <stdin 2>err &&
915         grep "warning: update $a: missing <newvalue>, treating as zero" err &&
916         test_must_fail git rev-parse --verify -q $a
917 '
918
919 test_expect_success 'stdin -z fails update with no new value' '
920         printf $F "update $a" >stdin &&
921         test_must_fail git update-ref -z --stdin <stdin 2>err &&
922         grep "fatal: update $a: unexpected end of input when reading <newvalue>" err
923 '
924
925 test_expect_success 'stdin -z fails update with no old value' '
926         printf $F "update $a" "$m" >stdin &&
927         test_must_fail git update-ref -z --stdin <stdin 2>err &&
928         grep "fatal: update $a: unexpected end of input when reading <oldvalue>" err
929 '
930
931 test_expect_success 'stdin -z fails update with too many arguments' '
932         printf $F "update $a" "$m" "$m" "$m" >stdin &&
933         test_must_fail git update-ref -z --stdin <stdin 2>err &&
934         grep "fatal: unknown command: $m" err
935 '
936
937 test_expect_success 'stdin -z fails delete with no ref' '
938         printf $F "delete " >stdin &&
939         test_must_fail git update-ref -z --stdin <stdin 2>err &&
940         grep "fatal: delete: missing <ref>" err
941 '
942
943 test_expect_success 'stdin -z fails delete with no old value' '
944         printf $F "delete $a" >stdin &&
945         test_must_fail git update-ref -z --stdin <stdin 2>err &&
946         grep "fatal: delete $a: unexpected end of input when reading <oldvalue>" err
947 '
948
949 test_expect_success 'stdin -z fails delete with too many arguments' '
950         printf $F "delete $a" "$m" "$m" >stdin &&
951         test_must_fail git update-ref -z --stdin <stdin 2>err &&
952         grep "fatal: unknown command: $m" err
953 '
954
955 test_expect_success 'stdin -z fails verify with too many arguments' '
956         printf $F "verify $a" "$m" "$m" >stdin &&
957         test_must_fail git update-ref -z --stdin <stdin 2>err &&
958         grep "fatal: unknown command: $m" err
959 '
960
961 test_expect_success 'stdin -z fails verify with no old value' '
962         printf $F "verify $a" >stdin &&
963         test_must_fail git update-ref -z --stdin <stdin 2>err &&
964         grep "fatal: verify $a: unexpected end of input when reading <oldvalue>" err
965 '
966
967 test_expect_success 'stdin -z fails option with unknown name' '
968         printf $F "option unknown" >stdin &&
969         test_must_fail git update-ref -z --stdin <stdin 2>err &&
970         grep "fatal: option unknown: unknown" err
971 '
972
973 test_expect_success 'stdin -z fails with duplicate refs' '
974         printf $F "create $a" "$m" "create $b" "$m" "create $a" "$m" >stdin &&
975         test_must_fail git update-ref -z --stdin <stdin 2>err &&
976         grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed." err
977 '
978
979 test_expect_success 'stdin -z create ref works' '
980         printf $F "create $a" "$m" >stdin &&
981         git update-ref -z --stdin <stdin &&
982         git rev-parse $m >expect &&
983         git rev-parse $a >actual &&
984         test_cmp expect actual
985 '
986
987 test_expect_success 'stdin -z update ref creates with zero old value' '
988         printf $F "update $b" "$m" "$Z" >stdin &&
989         git update-ref -z --stdin <stdin &&
990         git rev-parse $m >expect &&
991         git rev-parse $b >actual &&
992         test_cmp expect actual &&
993         git update-ref -d $b
994 '
995
996 test_expect_success 'stdin -z update ref creates with empty old value' '
997         printf $F "update $b" "$m" "" >stdin &&
998         git update-ref -z --stdin <stdin &&
999         git rev-parse $m >expect &&
1000         git rev-parse $b >actual &&
1001         test_cmp expect actual
1002 '
1003
1004 test_expect_success 'stdin -z create ref works with path with space to blob' '
1005         printf $F "create refs/blobs/pws" "$m:$pws" >stdin &&
1006         git update-ref -z --stdin <stdin &&
1007         git rev-parse "$m:$pws" >expect &&
1008         git rev-parse refs/blobs/pws >actual &&
1009         test_cmp expect actual &&
1010         git update-ref -d refs/blobs/pws
1011 '
1012
1013 test_expect_success 'stdin -z update ref fails with wrong old value' '
1014         printf $F "update $c" "$m" "$m~1" >stdin &&
1015         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1016         grep "fatal: cannot lock ref '"'"'$c'"'"'" err &&
1017         test_must_fail git rev-parse --verify -q $c
1018 '
1019
1020 test_expect_success 'stdin -z update ref fails with bad old value' '
1021         printf $F "update $c" "$m" "does-not-exist" >stdin &&
1022         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1023         grep "fatal: update $c: invalid <oldvalue>: does-not-exist" err &&
1024         test_must_fail git rev-parse --verify -q $c
1025 '
1026
1027 test_expect_success 'stdin -z create ref fails when ref exists' '
1028         git update-ref $c $m &&
1029         git rev-parse "$c" >expect &&
1030         printf $F "create $c" "$m~1" >stdin &&
1031         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1032         grep "fatal: cannot lock ref '"'"'$c'"'"'" err &&
1033         git rev-parse "$c" >actual &&
1034         test_cmp expect actual
1035 '
1036
1037 test_expect_success 'stdin -z create ref fails with bad new value' '
1038         git update-ref -d "$c" &&
1039         printf $F "create $c" "does-not-exist" >stdin &&
1040         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1041         grep "fatal: create $c: invalid <newvalue>: does-not-exist" err &&
1042         test_must_fail git rev-parse --verify -q $c
1043 '
1044
1045 test_expect_success 'stdin -z create ref fails with empty new value' '
1046         printf $F "create $c" "" >stdin &&
1047         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1048         grep "fatal: create $c: missing <newvalue>" err &&
1049         test_must_fail git rev-parse --verify -q $c
1050 '
1051
1052 test_expect_success 'stdin -z update ref works with right old value' '
1053         printf $F "update $b" "$m~1" "$m" >stdin &&
1054         git update-ref -z --stdin <stdin &&
1055         git rev-parse $m~1 >expect &&
1056         git rev-parse $b >actual &&
1057         test_cmp expect actual
1058 '
1059
1060 test_expect_success 'stdin -z delete ref fails with wrong old value' '
1061         printf $F "delete $a" "$m~1" >stdin &&
1062         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1063         grep "fatal: cannot lock ref '"'"'$a'"'"'" err &&
1064         git rev-parse $m >expect &&
1065         git rev-parse $a >actual &&
1066         test_cmp expect actual
1067 '
1068
1069 test_expect_success 'stdin -z delete ref fails with zero old value' '
1070         printf $F "delete $a" "$Z" >stdin &&
1071         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1072         grep "fatal: delete $a: zero <oldvalue>" err &&
1073         git rev-parse $m >expect &&
1074         git rev-parse $a >actual &&
1075         test_cmp expect actual
1076 '
1077
1078 test_expect_success 'stdin -z update symref works option no-deref' '
1079         git symbolic-ref TESTSYMREF $b &&
1080         printf $F "option no-deref" "update TESTSYMREF" "$a" "$b" >stdin &&
1081         git update-ref -z --stdin <stdin &&
1082         git rev-parse TESTSYMREF >expect &&
1083         git rev-parse $a >actual &&
1084         test_cmp expect actual &&
1085         git rev-parse $m~1 >expect &&
1086         git rev-parse $b >actual &&
1087         test_cmp expect actual
1088 '
1089
1090 test_expect_success 'stdin -z delete symref works option no-deref' '
1091         git symbolic-ref TESTSYMREF $b &&
1092         printf $F "option no-deref" "delete TESTSYMREF" "$b" >stdin &&
1093         git update-ref -z --stdin <stdin &&
1094         test_must_fail git rev-parse --verify -q TESTSYMREF &&
1095         git rev-parse $m~1 >expect &&
1096         git rev-parse $b >actual &&
1097         test_cmp expect actual
1098 '
1099
1100 test_expect_success 'stdin -z delete ref works with right old value' '
1101         printf $F "delete $b" "$m~1" >stdin &&
1102         git update-ref -z --stdin <stdin &&
1103         test_must_fail git rev-parse --verify -q $b
1104 '
1105
1106 test_expect_success 'stdin -z update/create/verify combination works' '
1107         printf $F "update $a" "$m" "" "create $b" "$m" "verify $c" "" >stdin &&
1108         git update-ref -z --stdin <stdin &&
1109         git rev-parse $m >expect &&
1110         git rev-parse $a >actual &&
1111         test_cmp expect actual &&
1112         git rev-parse $b >actual &&
1113         test_cmp expect actual &&
1114         test_must_fail git rev-parse --verify -q $c
1115 '
1116
1117 test_expect_success 'stdin -z verify succeeds for correct value' '
1118         git rev-parse $m >expect &&
1119         printf $F "verify $m" "$m" >stdin &&
1120         git update-ref -z --stdin <stdin &&
1121         git rev-parse $m >actual &&
1122         test_cmp expect actual
1123 '
1124
1125 test_expect_success 'stdin -z verify succeeds for missing reference' '
1126         printf $F "verify refs/heads/missing" "$Z" >stdin &&
1127         git update-ref -z --stdin <stdin &&
1128         test_must_fail git rev-parse --verify -q refs/heads/missing
1129 '
1130
1131 test_expect_success 'stdin -z verify treats no value as missing' '
1132         printf $F "verify refs/heads/missing" "" >stdin &&
1133         git update-ref -z --stdin <stdin &&
1134         test_must_fail git rev-parse --verify -q refs/heads/missing
1135 '
1136
1137 test_expect_success 'stdin -z verify fails for wrong value' '
1138         git rev-parse $m >expect &&
1139         printf $F "verify $m" "$m~1" >stdin &&
1140         test_must_fail git update-ref -z --stdin <stdin &&
1141         git rev-parse $m >actual &&
1142         test_cmp expect actual
1143 '
1144
1145 test_expect_success 'stdin -z verify fails for mistaken null value' '
1146         git rev-parse $m >expect &&
1147         printf $F "verify $m" "$Z" >stdin &&
1148         test_must_fail git update-ref -z --stdin <stdin &&
1149         git rev-parse $m >actual &&
1150         test_cmp expect actual
1151 '
1152
1153 test_expect_success 'stdin -z verify fails for mistaken empty value' '
1154         M=$(git rev-parse $m) &&
1155         test_when_finished "git update-ref $m $M" &&
1156         git rev-parse $m >expect &&
1157         printf $F "verify $m" "" >stdin &&
1158         test_must_fail git update-ref -z --stdin <stdin &&
1159         git rev-parse $m >actual &&
1160         test_cmp expect actual
1161 '
1162
1163 test_expect_success 'stdin -z update refs works with identity updates' '
1164         printf $F "update $a" "$m" "$m" "update $b" "$m" "$m" "update $c" "$Z" "" >stdin &&
1165         git update-ref -z --stdin <stdin &&
1166         git rev-parse $m >expect &&
1167         git rev-parse $a >actual &&
1168         test_cmp expect actual &&
1169         git rev-parse $b >actual &&
1170         test_cmp expect actual &&
1171         test_must_fail git rev-parse --verify -q $c
1172 '
1173
1174 test_expect_success 'stdin -z update refs fails with wrong old value' '
1175         git update-ref $c $m &&
1176         printf $F "update $a" "$m" "$m" "update $b" "$m" "$m" "update $c" "$m" "$Z" >stdin &&
1177         test_must_fail git update-ref -z --stdin <stdin 2>err &&
1178         grep "fatal: cannot lock ref '"'"'$c'"'"'" err &&
1179         git rev-parse $m >expect &&
1180         git rev-parse $a >actual &&
1181         test_cmp expect actual &&
1182         git rev-parse $b >actual &&
1183         test_cmp expect actual &&
1184         git rev-parse $c >actual &&
1185         test_cmp expect actual
1186 '
1187
1188 test_expect_success 'stdin -z delete refs works with packed and loose refs' '
1189         git pack-refs --all &&
1190         git update-ref $c $m~1 &&
1191         printf $F "delete $a" "$m" "update $b" "$Z" "$m" "update $c" "" "$m~1" >stdin &&
1192         git update-ref -z --stdin <stdin &&
1193         test_must_fail git rev-parse --verify -q $a &&
1194         test_must_fail git rev-parse --verify -q $b &&
1195         test_must_fail git rev-parse --verify -q $c
1196 '
1197
1198 test_expect_success 'fails with duplicate HEAD update' '
1199         git branch target1 $A &&
1200         git checkout target1 &&
1201         cat >stdin <<-EOF &&
1202         update refs/heads/target1 $C
1203         option no-deref
1204         update HEAD $B
1205         EOF
1206         test_must_fail git update-ref --stdin <stdin 2>err &&
1207         grep "fatal: multiple updates for '\''HEAD'\'' (including one via its referent .refs/heads/target1.) are not allowed" err &&
1208         echo "refs/heads/target1" >expect &&
1209         git symbolic-ref HEAD >actual &&
1210         test_cmp expect actual &&
1211         echo "$A" >expect &&
1212         git rev-parse refs/heads/target1 >actual &&
1213         test_cmp expect actual
1214 '
1215
1216 test_expect_success 'fails with duplicate ref update via symref' '
1217         git branch target2 $A &&
1218         git symbolic-ref refs/heads/symref2 refs/heads/target2 &&
1219         cat >stdin <<-EOF &&
1220         update refs/heads/target2 $C
1221         update refs/heads/symref2 $B
1222         EOF
1223         test_must_fail git update-ref --stdin <stdin 2>err &&
1224         grep "fatal: multiple updates for '\''refs/heads/target2'\'' (including one via symref .refs/heads/symref2.) are not allowed" err &&
1225         echo "refs/heads/target2" >expect &&
1226         git symbolic-ref refs/heads/symref2 >actual &&
1227         test_cmp expect actual &&
1228         echo "$A" >expect &&
1229         git rev-parse refs/heads/target2 >actual &&
1230         test_cmp expect actual
1231 '
1232
1233 run_with_limited_open_files () {
1234         (ulimit -n 32 && "$@")
1235 }
1236
1237 test_lazy_prereq ULIMIT_FILE_DESCRIPTORS 'run_with_limited_open_files true'
1238
1239 test_expect_success ULIMIT_FILE_DESCRIPTORS 'large transaction creating branches does not burst open file limit' '
1240 (
1241         for i in $(test_seq 33)
1242         do
1243                 echo "create refs/heads/$i HEAD"
1244         done >large_input &&
1245         run_with_limited_open_files git update-ref --stdin <large_input &&
1246         git rev-parse --verify -q refs/heads/33
1247 )
1248 '
1249
1250 test_expect_success ULIMIT_FILE_DESCRIPTORS 'large transaction deleting branches does not burst open file limit' '
1251 (
1252         for i in $(test_seq 33)
1253         do
1254                 echo "delete refs/heads/$i HEAD"
1255         done >large_input &&
1256         run_with_limited_open_files git update-ref --stdin <large_input &&
1257         test_must_fail git rev-parse --verify -q refs/heads/33
1258 )
1259 '
1260
1261 test_expect_success 'handle per-worktree refs in refs/bisect' '
1262         git commit --allow-empty -m "initial commit" &&
1263         git worktree add -b branch worktree &&
1264         (
1265                 cd worktree &&
1266                 git commit --allow-empty -m "test commit"  &&
1267                 git for-each-ref >for-each-ref.out &&
1268                 ! grep refs/bisect for-each-ref.out &&
1269                 git update-ref refs/bisect/something HEAD &&
1270                 git rev-parse refs/bisect/something >../worktree-head &&
1271                 git for-each-ref | grep refs/bisect/something
1272         ) &&
1273         test_path_is_missing .git/refs/bisect &&
1274         test_must_fail git rev-parse refs/bisect/something &&
1275         git update-ref refs/bisect/something HEAD &&
1276         git rev-parse refs/bisect/something >main-head &&
1277         ! test_cmp main-head worktree-head
1278 '
1279
1280 test_done