(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'test git rev-parse --verify'>)}
          spids: [12]
        )
      ]
      spids: [12]
    )
    (SimpleCommand
      words: [{(exec)}]
      redirects: [(Redir op_id:Redir_Less fd:-1 arg_word:{(/dev/null)} spids:[20])]
    )
    (C {(.)} {(./test-lib.sh)})
    (FuncDef
      name: add_line_into_file
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:_line)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [36]
                )
              ]
              spids: [36]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:_file)
                  op: Equal
                  rhs: {($ VSub_Number '$2')}
                  spids: [40]
                )
              ]
              spids: [40]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(-f)} {(DQ ($ VSub_Name '$_file'))} {(Lit_Other ']')})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (AndOr
                      children: [
                        (SimpleCommand
                          words: [{(echo)} {(DQ ($ VSub_Name '$_line'))}]
                          redirects: [
                            (Redir
                              op_id: Redir_DGreat
                              fd: -1
                              arg_word: {($ VSub_Name '$_file')}
                              spids: [67]
                            )
                          ]
                        )
                        (ControlFlow
                          token: <ControlFlow_Return return>
                          arg_word: {($ VSub_QMark '$?')}
                        )
                      ]
                      op_id: Op_DPipe
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:MSG)
                          op: Equal
                          rhs: 
                            {
                              (DQ ('Add <') ($ VSub_Name '$_line') ('> into <') ($ VSub_Name '$_file') 
                                ('>.')
                              )
                            }
                          spids: [78]
                        )
                      ]
                      spids: [78]
                    )
                  ]
                  spids: [-1 58]
                )
              ]
              else_action: [
                (AndOr
                  children: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ($ VSub_Name '$_line'))}]
                      redirects: [
                        (Redir
                          op_id: Redir_Great
                          fd: -1
                          arg_word: {($ VSub_Name '$_file')}
                          spids: [97]
                        )
                      ]
                    )
                    (ControlFlow
                      token: <ControlFlow_Return return>
                      arg_word: {($ VSub_QMark '$?')}
                    )
                  ]
                  op_id: Op_DPipe
                )
                (AndOr
                  children: [
                    (C {(git)} {(add)} {($ VSub_Name '$_file')})
                    (ControlFlow
                      token: <ControlFlow_Return return>
                      arg_word: {($ VSub_QMark '$?')}
                    )
                  ]
                  op_id: Op_DPipe
                )
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:MSG)
                      op: Equal
                      rhs: 
                        {
                          (DQ ('Create file <') ($ VSub_Name '$_file') ('> with <') 
                            ($ VSub_Name '$_line') ('> inside.')
                          )
                        }
                      spids: [121]
                    )
                  ]
                  spids: [121]
                )
              ]
              spids: [88 131]
            )
            (C {(test_tick)})
            (C {(git)} {(commit)} {(--quiet)} {(-m)} {(DQ ($ VSub_Name '$MSG'))} {($ VSub_Name '$_file')})
          ]
          spids: [33]
        )
      spids: [29 32]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH1) op:Equal rhs:{(SQ )} spids:[155])]
      spids: [155]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH2) op:Equal rhs:{(SQ )} spids:[157])]
      spids: [157]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH3) op:Equal rhs:{(SQ )} spids:[159])]
      spids: [159]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH4) op:Equal rhs:{(SQ )} spids:[161])]
      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)})
  ]
)