3 # Copyright (c) 2006 Shawn Pearce
6 test_description='Test git update-ref and basic ref logging'
17 create_test_commits ()
20 for name in A B C D E F
23 T=$(git write-tree) &&
24 sha1=$(echo $name | git commit-tree $T) &&
29 test_expect_success setup '
30 create_test_commits "" &&
34 create_test_commits "bare" &&
40 "git update-ref $m $A &&
41 test $A"' = $(cat .git/'"$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)"
50 test_expect_success "delete $m" '
51 git update-ref -d $m $B &&
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 &&
67 test_must_fail git update-ref $n $A >out 2>err"
68 rm -f .git/$n_dir out err
71 "create $m (by HEAD)" \
72 "git update-ref HEAD $A &&
73 test $A"' = $(cat .git/'"$m"')'
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)
82 test_expect_success "delete $m (by HEAD)" '
83 git update-ref -d HEAD $B &&
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
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
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
114 test_expect_success 'core.logAllRefUpdates=true creates reflog in bare repository' '
115 test_when_finished "git -C $bare config --unset core.logAllRefUpdates && \
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
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
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
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
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
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 \
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 &&
179 cp -f .git/HEAD .git/HEAD.orig
180 test_expect_success "delete symref without dereference" '
181 git update-ref --no-deref -d HEAD &&
184 cp -f .git/HEAD.orig .git/HEAD
186 test_expect_success "delete symref without dereference when the referred ref is packed" '
190 git pack-refs --all &&
191 git update-ref --no-deref -d HEAD &&
194 cp -f .git/HEAD.orig .git/HEAD
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
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
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
223 test_expect_success '(not) create HEAD with old sha1' "
224 test_must_fail git update-ref HEAD $A $B
226 test_expect_success "(not) prior created .git/$m" "
231 test_expect_success \
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
237 test_expect_success "(not) changed .git/$m" "
238 ! test $B"' = $(cat .git/'"$m"')
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"')'
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
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
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
291 test_expect_success \
292 "verifying $m's log" \
293 "test_cmp expect .git/logs/$m"
294 rm -rf .git/$m .git/logs expect
296 test_expect_success \
297 'enable core.logAllRefUpdates' \
298 'git config core.logAllRefUpdates true &&
299 test true = $(git config --bool --get core.logAllRefUpdates)'
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"')'
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
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
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
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)' \
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)" \
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)' \
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)' \
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)' \
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)' \
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)' \
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)' \
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)' \
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)"'
395 rm -f .git/$m .git/logs/$m expect
397 test_expect_success \
398 'creating initial files' \
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 &&
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) &&
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.
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
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")'
446 pws='path with space'
448 test_expect_success 'stdin test setup' '
449 echo "$pws" >"$pws" &&
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
459 test_expect_success 'stdin works with no input' '
461 git update-ref --stdin <stdin &&
462 git rev-parse --verify -q $m
465 test_expect_success 'stdin fails on empty line' '
467 test_must_fail git update-ref --stdin <stdin 2>err &&
468 grep "fatal: empty command in input" err
471 test_expect_success 'stdin fails on only whitespace' '
473 test_must_fail git update-ref --stdin <stdin 2>err &&
474 grep "fatal: whitespace before command: " err
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
567 test_expect_success 'stdin fails with duplicate refs' '
573 test_must_fail git update-ref --stdin <stdin 2>err &&
574 grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed." err
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
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
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
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
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
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 &&
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
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
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
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
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
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
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
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
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
703 test_expect_success 'stdin update symref works option no-deref' '
704 git symbolic-ref TESTSYMREF $b &&
707 update TESTSYMREF $a $b
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
718 test_expect_success 'stdin delete symref works option no-deref' '
719 git symbolic-ref TESTSYMREF $b &&
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
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
737 test_expect_success 'stdin update/create/verify combination works' '
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
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
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
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
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
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
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
798 test_expect_success 'stdin update refs works with identity updates' '
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
813 test_expect_success 'stdin update refs fails with wrong old value' '
814 git update-ref $c $m &&
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
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 &&
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
845 test_expect_success 'stdin -z works on empty input' '
847 git update-ref -z --stdin <stdin &&
848 git rev-parse --verify -q $m
851 test_expect_success 'stdin -z fails on empty line' '
853 test_must_fail git update-ref -z --stdin <stdin 2>err &&
854 grep "fatal: whitespace before command: " err
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 &&
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1233 run_with_limited_open_files () {
1234 (ulimit -n 32 && "$@")
1237 test_lazy_prereq ULIMIT_FILE_DESCRIPTORS 'run_with_limited_open_files true'
1239 test_expect_success ULIMIT_FILE_DESCRIPTORS 'large transaction creating branches does not burst open file limit' '
1241 for i in $(test_seq 33)
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
1250 test_expect_success ULIMIT_FILE_DESCRIPTORS 'large transaction deleting branches does not burst open file limit' '
1252 for i in $(test_seq 33)
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
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 &&
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
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