(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'test git rev-parse --verify'>)}
          spids: [12]
        )
      ]
    )
    (command.Simple
      words: [{<exec>}]
      redirects: [(redir op:<Id.Redir_Less '<'> loc:(redir_loc.Fd fd:0) arg:{<'/dev/null'>})]
      do_fork: T
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShFunction
      name: add_line_into_file
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_line)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [36]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:_file)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [40]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (C {<Id.Lit_LBracket '['>} {<-f>} {(DQ ($ Id.VSub_DollarName '$_file'))} 
                              {<Id.Lit_RBracket ']'>}
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (command.Simple
                          words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$_line'))}]
                          redirects: [
                            (redir
                              op: <Id.Redir_DGreat '>>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {($ Id.VSub_DollarName '$_file')}
                            )
                          ]
                          do_fork: T
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:MSG)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ <'Add <'> ($ Id.VSub_DollarName '$_line') <'> into <'> 
                                ($ Id.VSub_DollarName '$_file') <'>.'>
                              )
                            }
                          spids: [78]
                        )
                      ]
                    )
                  ]
                  spids: [45 58]
                )
              ]
              else_action: [
                (command.AndOr
                  ops: [Id.Op_DPipe]
                  children: [
                    (command.Simple
                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$_line'))}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {($ Id.VSub_DollarName '$_file')}
                        )
                      ]
                      do_fork: T
                    )
                    (command.ControlFlow
                      token: <Id.ControlFlow_Return return>
                      arg_word: {($ Id.VSub_QMark '$?')}
                    )
                  ]
                )
                (command.AndOr
                  ops: [Id.Op_DPipe]
                  children: [
                    (C {<git>} {<add>} {($ Id.VSub_DollarName '$_file')})
                    (command.ControlFlow
                      token: <Id.ControlFlow_Return return>
                      arg_word: {($ Id.VSub_QMark '$?')}
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:MSG)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ <'Create file <'> ($ Id.VSub_DollarName '$_file') <'> with <'> 
                            ($ Id.VSub_DollarName '$_line') <'> inside.'>
                          )
                        }
                      spids: [121]
                    )
                  ]
                )
              ]
            )
            (C {<test_tick>})
            (C {<git>} {<commit>} {<--quiet>} {<-m>} {(DQ ($ Id.VSub_DollarName '$MSG'))} 
              {($ Id.VSub_DollarName '$_file')}
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HASH1)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [155]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HASH2)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [157]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HASH3)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [159]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HASH4)
          op: assign_op.Equal
          rhs: (word.Empty)
          spids: [161]
        )
      ]
    )
    (C {<test_expect_success>} {(SQ <'set up basic repo with 1 file (hello) and 4 commits'>)} 
      {
        (SQ <'\n'> <'\tadd_line_into_file "1: Hello World" hello &&\n'> 
          <'\tHASH1=$(git rev-parse --verify HEAD) &&\n'> <'\tadd_line_into_file "2: A new day for git" hello &&\n'> 
          <'\tHASH2=$(git rev-parse --verify HEAD) &&\n'> <'\tadd_line_into_file "3: Another new day for git" hello &&\n'> 
          <'\tHASH3=$(git rev-parse --verify HEAD) &&\n'> <'\tadd_line_into_file "4: Ciao for now" hello &&\n'> <'\tHASH4=$(git rev-parse --verify HEAD)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'works with one good rev'>)} 
      {
        (SQ <'\n'> <'\trev_hash1=$(git rev-parse --verify $HASH1) &&\n'> 
          <'\ttest "$rev_hash1" = "$HASH1" &&\n'> <'\trev_hash2=$(git rev-parse --verify $HASH2) &&\n'> <'\ttest "$rev_hash2" = "$HASH2" &&\n'> 
          <'\trev_hash3=$(git rev-parse --verify $HASH3) &&\n'> <'\ttest "$rev_hash3" = "$HASH3" &&\n'> <'\trev_hash4=$(git rev-parse --verify $HASH4) &&\n'> 
          <'\ttest "$rev_hash4" = "$HASH4" &&\n'> <'\trev_master=$(git rev-parse --verify master) &&\n'> <'\ttest "$rev_master" = "$HASH4" &&\n'> 
          <'\trev_head=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$rev_head" = "$HASH4"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fails with any bad rev or many good revs'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git rev-parse --verify 2>error &&\n'> 
          <'\tgrep "single revision" error &&\n'> <'\ttest_must_fail git rev-parse --verify foo 2>error &&\n'> <'\tgrep "single revision" error &&\n'> 
          <'\ttest_must_fail git rev-parse --verify HEAD bar 2>error &&\n'> <'\tgrep "single revision" error &&\n'> 
          <'\ttest_must_fail git rev-parse --verify baz HEAD 2>error &&\n'> <'\tgrep "single revision" error &&\n'> 
          <'\ttest_must_fail git rev-parse --verify $HASH2 HEAD 2>error &&\n'> <'\tgrep "single revision" error\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fails silently when using -q'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git rev-parse --verify --quiet 2>error &&\n'> 
          <'\ttest_must_be_empty error &&\n'> <'\ttest_must_fail git rev-parse -q --verify foo 2>error &&\n'> <'\ttest_must_be_empty error &&\n'> 
          <'\ttest_must_fail git rev-parse --verify -q HEAD bar 2>error &&\n'> <'\ttest_must_be_empty error &&\n'> 
          <'\ttest_must_fail git rev-parse --quiet --verify baz HEAD 2>error &&\n'> <'\ttest_must_be_empty error &&\n'> 
          <'\ttest_must_fail git rev-parse -q --verify $HASH2 HEAD 2>error &&\n'> <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fails silently when using -q with deleted reflogs'>)} 
      {
        (SQ <'\n'> <'\tref=$(git rev-parse HEAD) &&\n'> 
          <'\tgit update-ref --create-reflog -m "message for refs/test" refs/test "$ref" &&\n'> <'\tgit reflog delete --updateref --rewrite refs/test@{0} &&\n'> 
          <'\ttest_must_fail git rev-parse -q --verify refs/test@{0} >error 2>&1 &&\n'> <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fails silently when using -q with not enough reflogs'>)} 
      {
        (SQ <'\n'> <'\tref=$(git rev-parse HEAD) &&\n'> 
          <'\tgit update-ref --create-reflog -m "message for refs/test2" refs/test2 "$ref" &&\n'> <'\ttest_must_fail git rev-parse -q --verify refs/test2@{999} >error 2>&1 &&\n'> 
          <'\ttest_must_be_empty error\n'>
        )
      }
    )
    (C {<test_expect_success>} 
      {(SQ <'succeeds silently with -q and reflogs that do not go far back enough in time'>)} 
      {
        (SQ <'\n'> <'\tref=$(git rev-parse HEAD) &&\n'> 
          <'\tgit update-ref --create-reflog -m "message for refs/test3" refs/test3 "$ref" &&\n'> <'\tgit rev-parse -q --verify refs/test3@{1.year.ago} >actual 2>error &&\n'> 
          <'\ttest_must_be_empty error &&\n'> <'\techo "$ref" >expect &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'no stdout output on error'>)} 
      {
        (SQ <'\n'> <'\ttest -z "$(git rev-parse --verify)" &&\n'> 
          <'\ttest -z "$(git rev-parse --verify foo)" &&\n'> <'\ttest -z "$(git rev-parse --verify baz HEAD)" &&\n'> 
          <'\ttest -z "$(git rev-parse --verify HEAD bar)" &&\n'> <'\ttest -z "$(git rev-parse --verify $HASH2 HEAD)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'use --default'>)} 
      {
        (SQ <'\n'> <'\tgit rev-parse --verify --default master &&\n'> 
          <'\tgit rev-parse --verify --default master HEAD &&\n'> <'\tgit rev-parse --default master --verify &&\n'> 
          <'\tgit rev-parse --default master --verify HEAD &&\n'> <'\tgit rev-parse --verify HEAD --default master &&\n'> 
          <'\ttest_must_fail git rev-parse --verify foo --default master &&\n'> <'\ttest_must_fail git rev-parse --default HEAD --verify bar &&\n'> 
          <'\ttest_must_fail git rev-parse --verify --default HEAD baz &&\n'> <'\ttest_must_fail git rev-parse --default foo --verify &&\n'> 
          <'\ttest_must_fail git rev-parse --verify --default bar\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'master@{n} for various n'>)} 
      {
        (SQ <'\n'> <'\tN=$(git reflog | wc -l) &&\n'> <'\tNm1=$(($N-1)) &&\n'> <'\tNp1=$(($N+1)) &&\n'> 
          <'\tgit rev-parse --verify master@{0} &&\n'> <'\tgit rev-parse --verify master@{1} &&\n'> <'\tgit rev-parse --verify master@{$Nm1} &&\n'> 
          <'\ttest_must_fail git rev-parse --verify master@{$N} &&\n'> <'\ttest_must_fail git rev-parse --verify master@{$Np1}\n'>
        )
      }
    )
    (C {<test_expect_success>} {<SYMLINKS>} {(SQ <'ref resolution not confused by broken symlinks'>)} 
      {
        (SQ <'\n'> <'\tln -s does-not-exist .git/refs/heads/broken &&\n'> 
          <'\ttest_must_fail git rev-parse --verify broken\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)