(command.CommandList
  children: [
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'Test git update-ref and basic ref logging'>)}
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:Z) op:Equal rhs:{($ VSub_DollarName '$_z40')})]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'\n'> <'\tfor name in A B C D E F\n'> <'\tdo\n'> <'\t\ttest_tick &&\n'> 
          <'\t\tT=$(git write-tree) &&\n'> <'\t\tsha1=$(echo $name | git commit-tree $T) &&\n'> <'\t\teval $name=$sha1\n'> <'\tdone\n'> <'\n'>
        )
      }
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:m) op:Equal rhs:{(refs/heads/master)})]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:n_dir) op:Equal rhs:{(refs/heads/gu)})]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:n)
          op: Equal
          rhs: {($ VSub_DollarName '$n_dir') (/fixes)}
        )
      ]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:outside) op:Equal rhs:{(refs/foo)})]
    )
    (C {(test_expect_success)} {(DQ ('create ') ($ VSub_DollarName '$m'))} 
      {
        (DQ ('git update-ref ') ($ VSub_DollarName '$m') (' ') ($ VSub_DollarName '$A') (' &&\n') 
          ('\t test ') ($ VSub_DollarName '$A')
        ) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('create ') ($ VSub_DollarName '$m'))} 
      {
        (DQ ('git update-ref ') ($ VSub_DollarName '$m') (' ') ($ VSub_DollarName '$B') (' ') 
          ($ VSub_DollarName '$A') (' &&\n') ('\t test ') ($ VSub_DollarName '$B')
        ) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('fail to delete ') ($ VSub_DollarName '$m') (' with stale ref'))} 
      {
        (SQ <'\n'> <'\ttest_must_fail git update-ref -d $m $A &&\n'> <'\ttest $B = "$(cat .git/$m)"\n'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('delete ') ($ VSub_DollarName '$m'))} 
      {(SQ <'\n'> <'\tgit update-ref -d $m $B &&\n'> <'\t! test -f .git/$m\n'>)}
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')})
    (C {(test_expect_success)} 
      {(DQ ('delete ') ($ VSub_DollarName '$m') (' without oldvalue verification'))} 
      {
        (DQ ('\n') ('\tgit update-ref ') ($ VSub_DollarName '$m') (' ') ($ VSub_DollarName '$A') (' &&\n') 
          ('\ttest ') ($ VSub_DollarName '$A') (' = ') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) 
          ('(cat .git/') ($ VSub_DollarName '$m') (') &&\n') ('\tgit update-ref -d ') ($ VSub_DollarName '$m') (' &&\n') 
          ('\t! test -f .git/') ($ VSub_DollarName '$m') ('\n')
        )
      }
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')})
    (C {(test_expect_success)} {(DQ ('fail to create ') ($ VSub_DollarName '$n'))} 
      {
        (DQ ('touch .git/') ($ VSub_DollarName '$n_dir') (' &&\n') ('\t test_must_fail git update-ref ') 
          ($ VSub_DollarName '$n') (' ') ($ VSub_DollarName '$A') (' >out 2>err')
        )
      }
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$n_dir')} {(out)} {(err)})
    (C {(test_expect_success)} {(DQ ('create ') ($ VSub_DollarName '$m') (' (by HEAD)'))} 
      {
        (DQ ('git update-ref HEAD ') ($ VSub_DollarName '$A') (' &&\n') ('\t test ') 
          ($ VSub_DollarName '$A')
        ) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('create ') ($ VSub_DollarName '$m') (' (by HEAD)'))} 
      {
        (DQ ('git update-ref HEAD ') ($ VSub_DollarName '$B') (' ') ($ VSub_DollarName '$A') (' &&\n') 
          ('\t test ') ($ VSub_DollarName '$B')
        ) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} 
      {(DQ ('fail to delete ') ($ VSub_DollarName '$m') (' (by HEAD) with stale ref'))} {(SQ <'\n'> <'\ttest_must_fail git update-ref -d HEAD $A &&\n'> <'\ttest $B = $(cat .git/$m)\n'>)}
    )
    (C {(test_expect_success)} {(DQ ('delete ') ($ VSub_DollarName '$m') (' (by HEAD)'))} 
      {(SQ <'\n'> <'\tgit update-ref -d HEAD $B &&\n'> <'\t! test -f .git/$m\n'>)}
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')})
    (C {(test_expect_success)} {(SQ <'update-ref does not create reflogs by default'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "git update-ref -d $outside" &&\n'> 
          <'\tgit update-ref $outside $A &&\n'> <'\tgit rev-parse $A >expect &&\n'> <'\tgit rev-parse $outside >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\ttest_must_fail git reflog exists $outside\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref creates reflogs with --create-reflog'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "git update-ref -d $outside" &&\n'> 
          <'\tgit update-ref --create-reflog $outside $A &&\n'> <'\tgit rev-parse $A >expect &&\n'> <'\tgit rev-parse $outside >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit reflog exists $outside\n'>
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('create ') ($ VSub_DollarName '$m') (' (by HEAD)'))} 
      {
        (DQ ('git update-ref HEAD ') ($ VSub_DollarName '$A') (' &&\n') ('\t test ') 
          ($ VSub_DollarName '$A')
        ) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('pack refs'))} {(DQ ('git pack-refs --all'))})
    (C {(test_expect_success)} {(DQ ('move ') ($ VSub_DollarName '$m') (' (by HEAD)'))} 
      {
        (DQ ('git update-ref HEAD ') ($ VSub_DollarName '$B') (' ') ($ VSub_DollarName '$A') (' &&\n') 
          ('\t test ') ($ VSub_DollarName '$B')
        ) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} 
      {
        (DQ ('delete ') ($ VSub_DollarName '$m') (' (by HEAD) should remove both packed and loose ') 
          ($ VSub_DollarName '$m')
        )
      } 
      {
        (SQ <'\n'> <'\tgit update-ref -d HEAD $B &&\n'> <'\t! grep "$m" .git/packed-refs &&\n'> 
          <'\t! test -f .git/$m\n'>
        )
      }
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')})
    (C {(cp)} {(-f)} {(.git/HEAD)} {(.git/HEAD.orig)})
    (C {(test_expect_success)} {(DQ ('delete symref without dereference'))} 
      {(SQ <'\n'> <'\tgit update-ref --no-deref -d HEAD &&\n'> <'\t! test -f .git/HEAD\n'>)}
    )
    (C {(cp)} {(-f)} {(.git/HEAD.orig)} {(.git/HEAD)})
    (C {(test_expect_success)} 
      {(DQ ('delete symref without dereference when the referred ref is packed'))} 
      {
        (SQ <'\n'> <'\techo foo >foo.c &&\n'> <'\tgit add foo.c &&\n'> <'\tgit commit -m foo &&\n'> 
          <'\tgit pack-refs --all &&\n'> <'\tgit update-ref --no-deref -d HEAD &&\n'> <'\t! test -f .git/HEAD\n'>
        )
      }
    )
    (C {(cp)} {(-f)} {(.git/HEAD.orig)} {(.git/HEAD)})
    (C {(git)} {(update-ref)} {(-d)} {($ VSub_DollarName '$m')})
    (C {(test_expect_success)} {(SQ <'update-ref -d is not confused by self-reference'>)} 
      {
        (SQ <'\n'> <'\tgit symbolic-ref refs/heads/self refs/heads/self &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/self" &&\n'> <'\ttest_path_is_file .git/refs/heads/self &&\n'> 
          <'\ttest_must_fail git update-ref -d refs/heads/self &&\n'> <'\ttest_path_is_file .git/refs/heads/self\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --no-deref -d can delete self-reference'>)} 
      {
        (SQ <'\n'> <'\tgit symbolic-ref refs/heads/self refs/heads/self &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/self" &&\n'> <'\ttest_path_is_file .git/refs/heads/self &&\n'> 
          <'\tgit update-ref --no-deref -d refs/heads/self &&\n'> <'\ttest_path_is_missing .git/refs/heads/self\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update-ref --no-deref -d can delete reference to bad ref'>)} 
      {
        (SQ <'\n'> <'\t>.git/refs/heads/bad &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/bad" &&\n'> <'\tgit symbolic-ref refs/heads/ref-to-bad refs/heads/bad &&\n'> 
          <'\ttest_when_finished "rm -f .git/refs/heads/ref-to-bad" &&\n'> <'\ttest_path_is_file .git/refs/heads/ref-to-bad &&\n'> 
          <'\tgit update-ref --no-deref -d refs/heads/ref-to-bad &&\n'> <'\ttest_path_is_missing .git/refs/heads/ref-to-bad\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'(not) create HEAD with old sha1'>)} 
      {
        (DQ ('\n') ('\ttest_must_fail git update-ref HEAD ') ($ VSub_DollarName '$A') (' ') 
          ($ VSub_DollarName '$B') ('\n')
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('(not) prior created .git/') ($ VSub_DollarName '$m'))} 
      {(DQ ('\n') ('\t! test -f .git/') ($ VSub_DollarName '$m') ('\n'))}
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')})
    (C {(test_expect_success)} {(DQ ('create HEAD'))} 
      {(DQ ('git update-ref HEAD ') ($ VSub_DollarName '$A'))}
    )
    (C {(test_expect_success)} {(SQ <'(not) change HEAD with wrong SHA1'>)} 
      {
        (DQ ('\n') ('\ttest_must_fail git update-ref HEAD ') ($ VSub_DollarName '$B') (' ') 
          ($ VSub_DollarName '$Z') ('\n')
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('(not) changed .git/') ($ VSub_DollarName '$m'))} 
      {(DQ ('\n') ('\t! test ') ($ VSub_DollarName '$B')) (SQ <' = $(cat .git/'>) 
        (DQ ($ VSub_DollarName '$m')) (SQ <')\n'>)
      }
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')})
    (C {(rm)} {(-f)} {(.git/logs/refs/heads/master)})
    (C {(test_expect_success)} {(DQ ('create ') ($ VSub_DollarName '$m') (' (logged by touch)'))} 
      {
        (SQ <'GIT_COMMITTER_DATE="2005-05-26 23:30" \\\n'> <'\t git update-ref --create-reflog HEAD '>) (DQ ($ VSub_DollarName '$A')) (SQ <' -m "Initial Creation" &&\n'> <'\t test '>) 
        (DQ ($ VSub_DollarName '$A')) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('update ') ($ VSub_DollarName '$m') (' (logged by touch)'))} 
      {(SQ <'GIT_COMMITTER_DATE="2005-05-26 23:31" \\\n'> <'\t git update-ref HEAD'>) 
        (DQ (' ') ($ VSub_DollarName '$B') (' ') ($ VSub_DollarName '$A') (' ')) (SQ <'-m "Switch" &&\n'> <'\t test '>) (DQ ($ VSub_DollarName '$B')) (SQ <' = $(cat .git/'>) 
        (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('set ') ($ VSub_DollarName '$m') (' (logged by touch)'))} 
      {(SQ <'GIT_COMMITTER_DATE="2005-05-26 23:41" \\\n'> <'\t git update-ref HEAD'>) 
        (DQ (' ') ($ VSub_DollarName '$A') (' &&\n') ('\t test ') ($ VSub_DollarName '$A')) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (command.SimpleCommand
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect)})
        (redir.HereDoc
          op: <Redir_DLess '<<'>
          fd: 16777215
          here_begin: {(EOF)}
          here_end_span_id: 814
          stdin_parts: [
            ($ VSub_DollarName '$Z')
            (' ')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150200 +0000\tInitial Creation\n')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$B')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150260 +0000\tSwitch\n')
            ($ VSub_DollarName '$B')
            (' ')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150860 +0000\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(DQ ('verifying ') ($ VSub_DollarName '$m') ("'s log"))} 
      {(DQ ('test_cmp expect .git/logs/') ($ VSub_DollarName '$m'))}
    )
    (C {(rm)} {(-rf)} {(.git/) ($ VSub_DollarName '$m')} {(.git/logs)} {(expect)})
    (C {(test_expect_success)} {(SQ <'enable core.logAllRefUpdates'>)} 
      {
        (SQ <'git config core.logAllRefUpdates true &&\n'> 
          <'\t test true = $(git config --bool --get core.logAllRefUpdates)'>
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('create ') ($ VSub_DollarName '$m') (' (logged by config)'))} 
      {(SQ <'GIT_COMMITTER_DATE="2005-05-26 23:32" \\\n'> <'\t git update-ref HEAD'>) 
        (DQ (' ') ($ VSub_DollarName '$A') (' ')) (SQ <'-m "Initial Creation" &&\n'> <'\t test '>) (DQ ($ VSub_DollarName '$A')) (SQ <' = $(cat .git/'>) 
        (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('update ') ($ VSub_DollarName '$m') (' (logged by config)'))} 
      {(SQ <'GIT_COMMITTER_DATE="2005-05-26 23:33" \\\n'> <'\t git update-ref HEAD'>) 
        (DQ (' ') ($ VSub_DollarName '$B') (' ') ($ VSub_DollarName '$A') (' ')) (SQ <'-m "Switch" &&\n'> <'\t test '>) (DQ ($ VSub_DollarName '$B')) (SQ <' = $(cat .git/'>) 
        (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('set ') ($ VSub_DollarName '$m') (' (logged by config)'))} 
      {(SQ <'GIT_COMMITTER_DATE="2005-05-26 23:43" \\\n'> <'\t git update-ref HEAD '>) 
        (DQ ($ VSub_DollarName '$A') (' &&\n') ('\t test ') ($ VSub_DollarName '$A')) (SQ <' = $(cat .git/'>) (DQ ($ VSub_DollarName '$m')) (SQ <')'>)
      }
    )
    (command.SimpleCommand
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect)})
        (redir.HereDoc
          op: <Redir_DLess '<<'>
          fd: 16777215
          here_begin: {(EOF)}
          here_end_span_id: 1004
          stdin_parts: [
            ($ VSub_DollarName '$Z')
            (' ')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150320 +0000\tInitial Creation\n')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$B')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150380 +0000\tSwitch\n')
            ($ VSub_DollarName '$B')
            (' ')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150980 +0000\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(DQ ('verifying ') ($ VSub_DollarName '$m') ("'s log"))} 
      {(SQ <'test_cmp expect .git/logs/$m'>)}
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')} {(.git/logs/) ($ VSub_DollarName '$m')} {(expect)})
    (C {(git)} {(update-ref)} {($ VSub_DollarName '$m')} {($ VSub_DollarName '$D')})
    (command.SimpleCommand
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: <Redir_Great '>'>
          fd: 16777215
          arg_word: {(.git/logs/) ($ VSub_DollarName '$m')}
        )
        (redir.HereDoc
          op: <Redir_DLess '<<'>
          fd: 16777215
          here_begin: {(EOF)}
          here_end_span_id: 1091
          stdin_parts: [
            ('0000000000000000000000000000000000000000 ')
            ($ VSub_DollarName '$C')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150320 -0500\n')
            ($ VSub_DollarName '$C')
            (' ')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150350 -0500\n')
            ($ VSub_DollarName '$A')
            (' ')
            ($ VSub_DollarName '$B')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150380 -0500\n')
            ($ VSub_DollarName '$F')
            (' ')
            ($ VSub_DollarName '$Z')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150680 -0500\n')
            ($ VSub_DollarName '$Z')
            (' ')
            ($ VSub_DollarName '$E')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150980 -0500\n')
          ]
        )
      ]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:ed)
          op: Equal
          rhs: {(DQ ('Thu, 26 May 2005 18:32:00 -0500'))}
        )
      ]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:gd)
          op: Equal
          rhs: {(DQ ('Thu, 26 May 2005 18:33:00 -0500'))}
        )
      ]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:ld)
          op: Equal
          rhs: {(DQ ('Thu, 26 May 2005 18:43:00 -0500'))}
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'Query "master@{May 25 2005}" (before history)'>)} 
      {
        (SQ <'rm -f o e &&\n'> <'\t git rev-parse --verify "master@{May 25 2005}" >o 2>e &&\n'> 
          <'\t test '>
        ) (DQ ($ VSub_DollarName '$C')) (SQ <' = $(cat o) &&\n'> <'\t test "warning: Log for '>) 
        (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (master) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) 
        (SQ <' only goes back to $ed." = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} {(DQ ('Query master@{2005-05-25} (before history)'))} 
      {
        (SQ <'rm -f o e &&\n'> <'\t git rev-parse --verify master@{2005-05-25} >o 2>e &&\n'> 
          <'\t test '>
        ) (DQ ($ VSub_DollarName '$C')) (SQ <' = $(cat o) &&\n'> <'\t echo test "warning: Log for '>) 
        (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (master) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) 
        (SQ <' only goes back to $ed." = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'Query "master@{May 26 2005 23:31:59}" (1 second before history)'>)} 
      {
        (SQ <'rm -f o e &&\n'> 
          <'\t git rev-parse --verify "master@{May 26 2005 23:31:59}" >o 2>e &&\n'> <'\t test '>
        ) (DQ ($ VSub_DollarName '$C')) (SQ <' = $(cat o) &&\n'> <'\t test "warning: Log for '>) 
        (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <master>) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) 
        (SQ <' only goes back to $ed." = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'Query "master@{May 26 2005 23:32:00}" (exactly history start)'>)} 
      {
        (SQ <'rm -f o e &&\n'> 
          <'\t git rev-parse --verify "master@{May 26 2005 23:32:00}" >o 2>e &&\n'> <'\t test '>
        ) (DQ ($ VSub_DollarName '$C')) (SQ <' = $(cat o) &&\n'> <'\t test "" = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'Query "master@{May 26 2005 23:32:30}" (first non-creation change)'>)} 
      {
        (SQ <'rm -f o e &&\n'> 
          <'\t git rev-parse --verify "master@{May 26 2005 23:32:30}" >o 2>e &&\n'> <'\t test '>
        ) (DQ ($ VSub_DollarName '$A')) (SQ <' = $(cat o) &&\n'> <'\t test "" = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'Query "master@{2005-05-26 23:33:01}" (middle of history with gap)'>)} 
      {
        (SQ <'rm -f o e &&\n'> 
          <'\t git rev-parse --verify "master@{2005-05-26 23:33:01}" >o 2>e &&\n'> <'\t test '>
        ) (DQ ($ VSub_DollarName '$B')) (SQ <' = $(cat o) &&\n'> <'\t test "warning: Log for ref '>) 
        (DQ ($ VSub_DollarName '$m') (' has gap after ') ($ VSub_DollarName '$gd')) (SQ <'." = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'Query "master@{2005-05-26 23:38:00}" (middle of history)'>)} 
      {
        (SQ <'rm -f o e &&\n'> 
          <'\t git rev-parse --verify "master@{2005-05-26 23:38:00}" >o 2>e &&\n'> <'\t test '>
        ) (DQ ($ VSub_DollarName '$Z')) (SQ <' = $(cat o) &&\n'> <'\t test "" = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'Query "master@{2005-05-26 23:43:00}" (exact end of history)'>)} 
      {
        (SQ <'rm -f o e &&\n'> 
          <'\t git rev-parse --verify "master@{2005-05-26 23:43:00}" >o 2>e &&\n'> <'\t test '>
        ) (DQ ($ VSub_DollarName '$E')) (SQ <' = $(cat o) &&\n'> <'\t test "" = "$(cat e)"'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'Query "master@{2005-05-28}" (past end of history)'>)} 
      {
        (SQ <'rm -f o e &&\n'> <'\t git rev-parse --verify "master@{2005-05-28}" >o 2>e &&\n'> 
          <'\t test '>
        ) (DQ ($ VSub_DollarName '$D')) (SQ <' = $(cat o) &&\n'> <'\t test "warning: Log for ref '>) 
        (DQ ($ VSub_DollarName '$m') (' unexpectedly ended on ') ($ VSub_DollarName '$ld')) (SQ <'." = "$(cat e)"'>)
      }
    )
    (C {(rm)} {(-f)} {(.git/) ($ VSub_DollarName '$m')} {(.git/logs/) ($ VSub_DollarName '$m')} {(expect)})
    (C {(test_expect_success)} {(SQ <'creating initial files'>)} 
      {
        (SQ <'echo TEST >F &&\n'> <'     git add F &&\n'> 
          <'\t GIT_AUTHOR_DATE="2005-05-26 23:30" \\\n'> <'\t GIT_COMMITTER_DATE="2005-05-26 23:30" git commit -m add -a &&\n'> 
          <'\t h_TEST=$(git rev-parse --verify HEAD) &&\n'> <'\t echo The other day this did not work. >M &&\n'> 
          <'\t echo And then Bob told me how to fix it. >>M &&\n'> <'\t echo OTHER >F &&\n'> <'\t GIT_AUTHOR_DATE="2005-05-26 23:41" \\\n'> 
          <'\t GIT_COMMITTER_DATE="2005-05-26 23:41" git commit -F M -a &&\n'> <'\t h_OTHER=$(git rev-parse --verify HEAD) &&\n'> <'\t GIT_AUTHOR_DATE="2005-05-26 23:44" \\\n'> 
          <'\t GIT_COMMITTER_DATE="2005-05-26 23:44" git commit --amend &&\n'> <'\t h_FIXED=$(git rev-parse --verify HEAD) &&\n'> 
          <'\t echo Merged initial commit and a later commit. >M &&\n'> <'\t echo $h_TEST >.git/MERGE_HEAD &&\n'> <'\t GIT_AUTHOR_DATE="2005-05-26 23:45" \\\n'> 
          <'\t GIT_COMMITTER_DATE="2005-05-26 23:45" git commit -F M &&\n'> <'\t h_MERGED=$(git rev-parse --verify HEAD) &&\n'> <'\t rm -f M'>
        )
      }
    )
    (command.SimpleCommand
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect)})
        (redir.HereDoc
          op: <Redir_DLess '<<'>
          fd: 16777215
          here_begin: {(EOF)}
          here_end_span_id: 1441
          stdin_parts: [
            ($ VSub_DollarName '$Z')
            (' ')
            ($ VSub_DollarName '$h_TEST')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150200 +0000\tcommit (initial): add\n')
            ($ VSub_DollarName '$h_TEST')
            (' ')
            ($ VSub_DollarName '$h_OTHER')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117150860 +0000\tcommit: The other day this did not work.\n')
            ($ VSub_DollarName '$h_OTHER')
            (' ')
            ($ VSub_DollarName '$h_FIXED')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117151040 +0000\tcommit (amend): The other day this did not work.\n')
            ($ VSub_DollarName '$h_FIXED')
            (' ')
            ($ VSub_DollarName '$h_MERGED')
            (' ')
            ($ VSub_DollarName '$GIT_COMMITTER_NAME')
            (' <')
            ($ VSub_DollarName '$GIT_COMMITTER_EMAIL')
            ('> 1117151100 +0000\tcommit (merge): Merged initial commit and a later commit.\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'git commit logged updates'>)} 
      {(DQ ('test_cmp expect .git/logs/') ($ VSub_DollarName '$m'))}
    )
    (C {(unset)} {(h_TEST)} {(h_OTHER)} {(h_FIXED)} {(h_MERGED)})
    (C {(test_expect_success)} {(SQ <'git cat-file blob master:F (expect OTHER)'>)} 
      {(SQ <'test OTHER = $(git cat-file blob master:F)'>)}
    )
    (C {(test_expect_success)} {(SQ <'git cat-file blob master@{2005-05-26 23:30}:F (expect TEST)'>)} 
      {(SQ <'test TEST = $(git cat-file blob "master@{2005-05-26 23:30}:F")'>)}
    )
    (C {(test_expect_success)} {(SQ <'git cat-file blob master@{2005-05-26 23:42}:F (expect OTHER)'>)} 
      {(SQ <'test OTHER = $(git cat-file blob "master@{2005-05-26 23:42}:F")'>)}
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:a) op:Equal rhs:{(refs/heads/a)})]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:b) op:Equal rhs:{(refs/heads/b)})]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:c) op:Equal rhs:{(refs/heads/c)})]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:E) op:Equal rhs:{(SQ <'""'>)})]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:F) op:Equal rhs:{(SQ <'%s\\0'>)})]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(lhs_expr.LhsName name:pws) op:Equal rhs:{(SQ <'path with space'>)})]
    )
    (C {(test_expect_success)} {(SQ <'stdin test setup'>)} 
      {
        (SQ <'\n'> <'\techo "$pws" >"$pws" &&\n'> <'\tgit add -- "$pws" &&\n'> 
          <'\tgit commit -m "$pws"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'-z fails without --stdin'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git update-ref -z $m $m $m 2>err &&\n'> 
          <'\ttest_i18ngrep "usage: git update-ref" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin works with no input'>)} 
      {
        (SQ <'\n'> <'\t>stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\tgit rev-parse --verify -q $m\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails on empty line'>)} 
      {
        (SQ <'\n'> <'\techo "" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: empty command in input" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails on only whitespace'>)} 
      {
        (SQ <'\n'> <'\techo " " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: whitespace before command:  " err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails on leading whitespace'>)} 
      {
        (SQ <'\n'> <'\techo " create $a $m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: whitespace before command:  create $a $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails on unknown command'>)} 
      {
        (SQ <'\n'> <'\techo "unknown $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: unknown command: unknown $a" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails on unbalanced quotes'>)} 
      {
        (SQ <'\n'> <'\techo "create $a \\"master" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: badly quoted argument: \\\\\\"master" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails on invalid escape'>)} 
      {
        (SQ <'\n'> <'\techo "create $a \\"ma\\zter\\"" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: badly quoted argument: \\\\\\"ma\\\\\\\\zter\\\\\\"" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails on junk after quoted argument'>)} 
      {
        (SQ <'\n'> <'\techo "create \\"$a\\"master" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: unexpected character after quoted argument: \\\\\\"$a\\\\\\"master" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails create with no ref'>)} 
      {
        (SQ <'\n'> <'\techo "create " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create: missing <ref>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails create with no new value'>)} 
      {
        (SQ <'\n'> <'\techo "create $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create $a: missing <newvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails create with too many arguments'>)} 
      {
        (SQ <'\n'> <'\techo "create $a $m $m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create $a: extra input:  $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails update with no ref'>)} 
      {
        (SQ <'\n'> <'\techo "update " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update: missing <ref>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails update with no new value'>)} 
      {
        (SQ <'\n'> <'\techo "update $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update $a: missing <newvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails update with too many arguments'>)} 
      {
        (SQ <'\n'> <'\techo "update $a $m $m $m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update $a: extra input:  $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails delete with no ref'>)} 
      {
        (SQ <'\n'> <'\techo "delete " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: delete: missing <ref>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails delete with too many arguments'>)} 
      {
        (SQ <'\n'> <'\techo "delete $a $m $m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: delete $a: extra input:  $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails verify with too many arguments'>)} 
      {
        (SQ <'\n'> <'\techo "verify $a $m $m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: verify $a: extra input:  $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails option with unknown name'>)} 
      {
        (SQ <'\n'> <'\techo "option unknown" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: option unknown: unknown" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin fails with duplicate refs'>)} 
      {
        (SQ <'\n'> <'\tcat >stdin <<-EOF &&\n'> <'\tcreate $a $m\n'> <'\tcreate $b $m\n'> 
          <'\tcreate $a $m\n'> <'\tEOF\n'> <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> 
          <'\tgrep "fatal: multiple updates for ref '>
        ) (DQ ("'")) (SQ <'$a'>) (DQ ("'")) (SQ <' not allowed." err\n'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin create ref works'>)} 
      {
        (SQ <'\n'> <'\techo "create $a $m" >stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin does not create reflogs by default'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "git update-ref -d $outside" &&\n'> 
          <'\techo "create $outside $m" >stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> 
          <'\tgit rev-parse $outside >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\ttest_must_fail git reflog exists $outside\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin creates reflogs with --create-reflog'>)} 
      {
        (SQ <'\n'> <'\techo "create $outside $m" >stdin &&\n'> 
          <'\tgit update-ref --create-reflog --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $outside >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit reflog exists $outside\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin succeeds with quoted argument'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref -d $a &&\n'> <'\techo "create $a \\"$m\\"" >stdin &&\n'> 
          <'\tgit update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin succeeds with escaped character'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref -d $a &&\n'> 
          <'\techo "create $a \\"ma\\\\163ter\\"" >stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> 
          <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update ref creates with zero old value'>)} 
      {
        (SQ <'\n'> <'\techo "update $b $m $Z" >stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\tgit update-ref -d $b\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update ref creates with empty old value'>)} 
      {
        (SQ <'\n'> <'\techo "update $b $m $E" >stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin create ref works with path with space to blob'>)} 
      {
        (SQ <'\n'> <'\techo "create refs/blobs/pws \\"$m:$pws\\"" >stdin &&\n'> 
          <'\tgit update-ref --stdin <stdin &&\n'> <'\tgit rev-parse "$m:$pws" >expect &&\n'> <'\tgit rev-parse refs/blobs/pws >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit update-ref -d refs/blobs/pws\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update ref fails with wrong old value'>)} 
      {
        (SQ <'\n'> <'\techo "update $c $m $m~1" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: cannot lock ref '>
        ) (DQ ("'")) (SQ <'$c'>) (DQ ("'")) (SQ <'" err &&\n'> <'\ttest_must_fail git rev-parse --verify -q $c\n'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update ref fails with bad old value'>)} 
      {
        (SQ <'\n'> <'\techo "update $c $m does-not-exist" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update $c: invalid <oldvalue>: does-not-exist" err &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin create ref fails with bad new value'>)} 
      {
        (SQ <'\n'> <'\techo "create $c does-not-exist" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create $c: invalid <newvalue>: does-not-exist" err &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin create ref fails with zero new value'>)} 
      {
        (SQ <'\n'> <'\techo "create $c " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create $c: zero <newvalue>" err &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update ref works with right old value'>)} 
      {
        (SQ <'\n'> <'\techo "update $b $m~1 $m" >stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\tgit rev-parse $m~1 >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin delete ref fails with wrong old value'>)} 
      {
        (SQ <'\n'> <'\techo "delete $a $m~1" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: cannot lock ref '>
        ) (DQ ("'")) (SQ <'$a'>) (DQ ("'")) 
        (SQ <'" err &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin delete ref fails with zero old value'>)} 
      {
        (SQ <'\n'> <'\techo "delete $a " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: delete $a: zero <oldvalue>" err &&\n'> <'\tgit rev-parse $m >expect &&\n'> 
          <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update symref works option no-deref'>)} 
      {
        (SQ <'\n'> <'\tgit symbolic-ref TESTSYMREF $b &&\n'> <'\tcat >stdin <<-EOF &&\n'> 
          <'\toption no-deref\n'> <'\tupdate TESTSYMREF $a $b\n'> <'\tEOF\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\tgit rev-parse TESTSYMREF >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\tgit rev-parse $m~1 >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin delete symref works option no-deref'>)} 
      {
        (SQ <'\n'> <'\tgit symbolic-ref TESTSYMREF $b &&\n'> <'\tcat >stdin <<-EOF &&\n'> 
          <'\toption no-deref\n'> <'\tdelete TESTSYMREF $b\n'> <'\tEOF\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q TESTSYMREF &&\n'> <'\tgit rev-parse $m~1 >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin delete ref works with right old value'>)} 
      {
        (SQ <'\n'> <'\techo "delete $b $m~1" >stdin &&\n'> <'\tgit update-ref --stdin <stdin &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $b\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update/create/verify combination works'>)} 
      {
        (SQ <'\n'> <'\tcat >stdin <<-EOF &&\n'> <'\tupdate $a $m\n'> <'\tcreate $b $m\n'> 
          <'\tverify $c\n'> <'\tEOF\n'> <'\tgit update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> 
          <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin verify succeeds for correct value'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse $m >expect &&\n'> <'\techo "verify $m $m" >stdin &&\n'> 
          <'\tgit update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin verify succeeds for missing reference'>)} 
      {
        (SQ <'\n'> <'\techo "verify refs/heads/missing $Z" >stdin &&\n'> 
          <'\tgit update-ref --stdin <stdin &&\n'> <'\ttest_must_fail git rev-parse --verify -q refs/heads/missing\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin verify treats no value as missing'>)} 
      {
        (SQ <'\n'> <'\techo "verify refs/heads/missing" >stdin &&\n'> 
          <'\tgit update-ref --stdin <stdin &&\n'> <'\ttest_must_fail git rev-parse --verify -q refs/heads/missing\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin verify fails for wrong value'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse $m >expect &&\n'> <'\techo "verify $m $m~1" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin verify fails for mistaken null value'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse $m >expect &&\n'> <'\techo "verify $m $Z" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin verify fails for mistaken empty value'>)} 
      {
        (SQ <'\n'> <'\tM=$(git rev-parse $m) &&\n'> 
          <'\ttest_when_finished "git update-ref $m $M" &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\techo "verify $m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update refs works with identity updates'>)} 
      {
        (SQ <'\n'> <'\tcat >stdin <<-EOF &&\n'> <'\tupdate $a $m $m\n'> <'\tupdate $b $m $m\n'> 
          <'\tupdate $c $Z $E\n'> <'\tEOF\n'> <'\tgit update-ref --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> 
          <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin update refs fails with wrong old value'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref $c $m &&\n'> <'\tcat >stdin <<-EOF &&\n'> <'\tupdate $a $m $m\n'> 
          <'\tupdate $b $m $m\n'> <'\tupdate $c  '>
        ) 
        (SQ <'\n'> <'\tEOF\n'> <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> 
          <'\tgrep "fatal: cannot lock ref '>
        ) (DQ ("'")) (SQ <'$c'>) (DQ ("'")) 
        (SQ <'" err &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\tgit rev-parse $c >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin delete refs works with packed and loose refs'>)} 
      {
        (SQ <'\n'> <'\tgit pack-refs --all &&\n'> <'\tgit update-ref $c $m~1 &&\n'> 
          <'\tcat >stdin <<-EOF &&\n'> <'\tdelete $a $m\n'> <'\tupdate $b $Z $m\n'> <'\tupdate $c $E $m~1\n'> <'\tEOF\n'> 
          <'\tgit update-ref --stdin <stdin &&\n'> <'\ttest_must_fail git rev-parse --verify -q $a &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $b &&\n'> <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z works on empty input'>)} 
      {
        (SQ <'\n'> <'\t>stdin &&\n'> <'\tgit update-ref -z --stdin <stdin &&\n'> 
          <'\tgit rev-parse --verify -q $m\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails on empty line'>)} 
      {
        (SQ <'\n'> <'\techo "" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: whitespace before command: " err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails on empty command'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: empty command in input" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails on only whitespace'>)} 
      {
        (SQ <'\n'> <'\tprintf $F " " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: whitespace before command:  " err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails on leading whitespace'>)} 
      {
        (SQ <'\n'> <'\tprintf $F " create $a" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: whitespace before command:  create $a" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails on unknown command'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "unknown $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: unknown command: unknown $a" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails create with no ref'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "create " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create: missing <ref>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails create with no new value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "create $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create $a: unexpected end of input when reading <newvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails create with too many arguments'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "create $a" "$m" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: unknown command: $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails update with no ref'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update: missing <ref>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails update with too few args'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $a" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update $a: unexpected end of input when reading <oldvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z emits warning with empty new value'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref $a $m &&\n'> <'\tprintf $F "update $a" "" "" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "warning: update $a: missing <newvalue>, treating as zero" err &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $a\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails update with no new value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update $a: unexpected end of input when reading <newvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails update with no old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $a" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update $a: unexpected end of input when reading <oldvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails update with too many arguments'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $a" "$m" "$m" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: unknown command: $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails delete with no ref'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "delete " >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: delete: missing <ref>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails delete with no old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "delete $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: delete $a: unexpected end of input when reading <oldvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails delete with too many arguments'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "delete $a" "$m" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: unknown command: $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails verify with too many arguments'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "verify $a" "$m" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: unknown command: $m" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails verify with no old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "verify $a" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: verify $a: unexpected end of input when reading <oldvalue>" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails option with unknown name'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "option unknown" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: option unknown: unknown" err\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z fails with duplicate refs'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "create $a" "$m" "create $b" "$m" "create $a" "$m" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: multiple updates for ref '>
        ) (DQ ("'")) (SQ <'$a'>) (DQ ("'")) (SQ <' not allowed." err\n'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z create ref works'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "create $a" "$m" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update ref creates with zero old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $b" "$m" "$Z" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit update-ref -d $b\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update ref creates with empty old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $b" "$m" "" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z create ref works with path with space to blob'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "create refs/blobs/pws" "$m:$pws" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse "$m:$pws" >expect &&\n'> <'\tgit rev-parse refs/blobs/pws >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit update-ref -d refs/blobs/pws\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update ref fails with wrong old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $c" "$m" "$m~1" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: cannot lock ref '>
        ) (DQ ("'")) (SQ <'$c'>) (DQ ("'")) (SQ <'" err &&\n'> <'\ttest_must_fail git rev-parse --verify -q $c\n'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update ref fails with bad old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $c" "$m" "does-not-exist" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: update $c: invalid <oldvalue>: does-not-exist" err &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z create ref fails when ref exists'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref $c $m &&\n'> <'\tgit rev-parse "$c" >expect &&\n'> 
          <'\tprintf $F "create $c" "$m~1" >stdin &&\n'> <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: cannot lock ref '>
        ) (DQ ("'")) (SQ <'$c'>) (DQ ("'")) 
        (SQ <'" err &&\n'> <'\tgit rev-parse "$c" >actual &&\n'> <'\ttest_cmp expect actual\n'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z create ref fails with bad new value'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref -d "$c" &&\n'> 
          <'\tprintf $F "create $c" "does-not-exist" >stdin &&\n'> <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> 
          <'\tgrep "fatal: create $c: invalid <newvalue>: does-not-exist" err &&\n'> <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z create ref fails with empty new value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "create $c" "" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: create $c: missing <newvalue>" err &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update ref works with right old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $b" "$m~1" "$m" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m~1 >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z delete ref fails with wrong old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "delete $a" "$m~1" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: cannot lock ref '>
        ) (DQ ("'")) (SQ <'$a'>) (DQ ("'")) 
        (SQ <'" err &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z delete ref fails with zero old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "delete $a" "$Z" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: delete $a: zero <oldvalue>" err &&\n'> <'\tgit rev-parse $m >expect &&\n'> 
          <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update symref works option no-deref'>)} 
      {
        (SQ <'\n'> <'\tgit symbolic-ref TESTSYMREF $b &&\n'> 
          <'\tprintf $F "option no-deref" "update TESTSYMREF" "$a" "$b" >stdin &&\n'> <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse TESTSYMREF >expect &&\n'> 
          <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\tgit rev-parse $m~1 >expect &&\n'> 
          <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z delete symref works option no-deref'>)} 
      {
        (SQ <'\n'> <'\tgit symbolic-ref TESTSYMREF $b &&\n'> 
          <'\tprintf $F "option no-deref" "delete TESTSYMREF" "$b" >stdin &&\n'> <'\tgit update-ref -z --stdin <stdin &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q TESTSYMREF &&\n'> <'\tgit rev-parse $m~1 >expect &&\n'> <'\tgit rev-parse $b >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z delete ref works with right old value'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "delete $b" "$m~1" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\ttest_must_fail git rev-parse --verify -q $b\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update/create/verify combination works'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "update $a" "$m" "" "create $b" "$m" "verify $c" "" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z verify succeeds for correct value'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tprintf $F "verify $m" "$m" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z verify succeeds for missing reference'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "verify refs/heads/missing" "$Z" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\ttest_must_fail git rev-parse --verify -q refs/heads/missing\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z verify treats no value as missing'>)} 
      {
        (SQ <'\n'> <'\tprintf $F "verify refs/heads/missing" "" >stdin &&\n'> 
          <'\tgit update-ref -z --stdin <stdin &&\n'> <'\ttest_must_fail git rev-parse --verify -q refs/heads/missing\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z verify fails for wrong value'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tprintf $F "verify $m" "$m~1" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z verify fails for mistaken null value'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tprintf $F "verify $m" "$Z" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z verify fails for mistaken empty value'>)} 
      {
        (SQ <'\n'> <'\tM=$(git rev-parse $m) &&\n'> 
          <'\ttest_when_finished "git update-ref $m $M" &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tprintf $F "verify $m" "" >stdin &&\n'> 
          <'\ttest_must_fail git update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update refs works with identity updates'>)} 
      {
        (SQ <'\n'> 
          <
'\tprintf $F "update $a" "$m" "$m" "update $b" "$m" "$m" "update $c" "$Z" "" >stdin &&\n'
          > <'\tgit update-ref -z --stdin <stdin &&\n'> <'\tgit rev-parse $m >expect &&\n'> 
          <'\tgit rev-parse $a >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z update refs fails with wrong old value'>)} 
      {
        (SQ <'\n'> <'\tgit update-ref $c $m &&\n'> 
          <
'\tprintf $F "update $a" "$m" "$m" "update $b" "$m" "$m" "update $c" "$m" "$Z" >stdin &&\n'
          > <'\ttest_must_fail git update-ref -z --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: cannot lock ref '>
        ) (DQ ("'")) (SQ <'$c'>) (DQ ("'")) 
        (SQ <'" err &&\n'> <'\tgit rev-parse $m >expect &&\n'> <'\tgit rev-parse $a >actual &&\n'> 
          <'\ttest_cmp expect actual &&\n'> <'\tgit rev-parse $b >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\tgit rev-parse $c >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'stdin -z delete refs works with packed and loose refs'>)} 
      {
        (SQ <'\n'> <'\tgit pack-refs --all &&\n'> <'\tgit update-ref $c $m~1 &&\n'> 
          <'\tprintf $F "delete $a" "$m" "update $b" "$Z" "$m" "update $c" "" "$m~1" >stdin &&\n'> <'\tgit update-ref -z --stdin <stdin &&\n'> <'\ttest_must_fail git rev-parse --verify -q $a &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q $b &&\n'> <'\ttest_must_fail git rev-parse --verify -q $c\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'fails with duplicate HEAD update'>)} 
      {
        (SQ <'\n'> <'\tgit branch target1 $A &&\n'> <'\tgit checkout target1 &&\n'> 
          <'\tcat >stdin <<-EOF &&\n'> <'\tupdate refs/heads/target1 $C\n'> <'\toption no-deref\n'> <'\tupdate HEAD $B\n'> <'\tEOF\n'> 
          <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: multiple updates for '>
        ) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <HEAD>) 
        (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) 
        (SQ <' (including one via its referent .refs/heads/target1.) are not allowed" err &&\n'> 
          <'\techo "refs/heads/target1" >expect &&\n'> <'\tgit symbolic-ref HEAD >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\techo "$A" >expect &&\n'> 
          <'\tgit rev-parse refs/heads/target1 >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'fails with duplicate ref update via symref'>)} 
      {
        (SQ <'\n'> <'\tgit branch target2 $A &&\n'> 
          <'\tgit symbolic-ref refs/heads/symref2 refs/heads/target2 &&\n'> <'\tcat >stdin <<-EOF &&\n'> <'\tupdate refs/heads/target2 $C\n'> <'\tupdate refs/heads/symref2 $B\n'> 
          <'\tEOF\n'> <'\ttest_must_fail git update-ref --stdin <stdin 2>err &&\n'> <'\tgrep "fatal: multiple updates for '>
        ) (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <refs/heads/target2>) 
        (word_part.EscapedLiteralPart token:<Lit_EscapedChar "\\'">) 
        (SQ <' (including one via symref .refs/heads/symref2.) are not allowed" err &&\n'> 
          <'\techo "refs/heads/target2" >expect &&\n'> <'\tgit symbolic-ref refs/heads/symref2 >actual &&\n'> <'\ttest_cmp expect actual &&\n'> 
          <'\techo "$A" >expect &&\n'> <'\tgit rev-parse refs/heads/target2 >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (command.FuncDef
      name: run_with_limited_open_files
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              command_list: 
                (command.CommandList
                  children: [
                    (command.AndOr
                      ops: [Op_DAmp]
                      children: [(C {(ulimit)} {(-n)} {(32)}) (C {(DQ ($ VSub_At '$@'))})]
                    )
                  ]
                )
            )
          ]
        )
    )
    (C {(test_lazy_prereq)} {(ULIMIT_FILE_DESCRIPTORS)} {(SQ <'run_with_limited_open_files true'>)})
    (C {(test_expect_success)} {(ULIMIT_FILE_DESCRIPTORS)} 
      {(SQ <'large transaction creating branches does not burst open file limit'>)} 
      {
        (SQ <'\n'> <'(\n'> <'\tfor i in $(test_seq 33)\n'> <'\tdo\n'> 
          <'\t\techo "create refs/heads/$i HEAD"\n'> <'\tdone >large_input &&\n'> 
          <'\trun_with_limited_open_files git update-ref --stdin <large_input &&\n'> <'\tgit rev-parse --verify -q refs/heads/33\n'> <')\n'>
        )
      }
    )
    (C {(test_expect_success)} {(ULIMIT_FILE_DESCRIPTORS)} 
      {(SQ <'large transaction deleting branches does not burst open file limit'>)} 
      {
        (SQ <'\n'> <'(\n'> <'\tfor i in $(test_seq 33)\n'> <'\tdo\n'> 
          <'\t\techo "delete refs/heads/$i HEAD"\n'> <'\tdone >large_input &&\n'> 
          <'\trun_with_limited_open_files git update-ref --stdin <large_input &&\n'> <'\ttest_must_fail git rev-parse --verify -q refs/heads/33\n'> <')\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'handle per-worktree refs in refs/bisect'>)} 
      {
        (SQ <'\n'> <'\tgit commit --allow-empty -m "initial commit" &&\n'> 
          <'\tgit worktree add -b branch worktree &&\n'> <'\t(\n'> <'\t\tcd worktree &&\n'> <'\t\tgit commit --allow-empty -m "test commit"  &&\n'> 
          <'\t\tgit for-each-ref >for-each-ref.out &&\n'> <'\t\t! grep refs/bisect for-each-ref.out &&\n'> 
          <'\t\tgit update-ref refs/bisect/something HEAD &&\n'> <'\t\tgit rev-parse refs/bisect/something >../worktree-head &&\n'> 
          <'\t\tgit for-each-ref | grep refs/bisect/something\n'> <'\t) &&\n'> <'\ttest_path_is_missing .git/refs/bisect &&\n'> 
          <'\ttest_must_fail git rev-parse refs/bisect/something &&\n'> <'\tgit update-ref refs/bisect/something HEAD &&\n'> 
          <'\tgit rev-parse refs/bisect/something >main-head &&\n'> <'\t! test_cmp main-head worktree-head\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)