(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'Tests git bisect functionality'>)}
          spids: [12]
        )
      ]
      spids: [12]
    )
    (SimpleCommand
      words: [{(exec)}]
      redirects: [(Redir op_id:Redir_Less fd:16777215 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
                      ops: [Op_DPipe]
                      children: [
                        (SimpleCommand
                          words: [{(echo)} {(DQ ($ VSub_Name '$_line'))}]
                          redirects: [
                            (Redir
                              op_id: Redir_DGreat
                              fd: 16777215
                              arg_word: {($ VSub_Name '$_file')}
                              spids: [67]
                            )
                          ]
                        )
                        (ControlFlow
                          token: <ControlFlow_Return return>
                          arg_word: {($ VSub_QMark '$?')}
                        )
                      ]
                    )
                    (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: [16777215 58]
                )
              ]
              else_action: [
                (AndOr
                  ops: [Op_DPipe]
                  children: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ($ VSub_Name '$_line'))}]
                      redirects: [
                        (Redir
                          op_id: Redir_Great
                          fd: 16777215
                          arg_word: {($ VSub_Name '$_file')}
                          spids: [97]
                        )
                      ]
                    )
                    (ControlFlow
                      token: <ControlFlow_Return return>
                      arg_word: {($ VSub_QMark '$?')}
                    )
                  ]
                )
                (AndOr
                  ops: [Op_DPipe]
                  children: [
                    (C {(git)} {(add)} {($ VSub_Name '$_file')})
                    (ControlFlow
                      token: <ControlFlow_Return return>
                      arg_word: {($ VSub_QMark '$?')}
                    )
                  ]
                )
                (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:{(EmptyPart)} spids:[155])]
      spids: [155]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH2) op:Equal rhs:{(EmptyPart)} spids:[157])]
      spids: [157]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH3) op:Equal rhs:{(EmptyPart)} spids:[159])]
      spids: [159]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH4) op:Equal rhs:{(EmptyPart)} spids:[161])]
      spids: [161]
    )
    (C {(test_expect_success)} {(SQ <'set up basic repo with 1 file (hello) and 4 commits'>)} 
      {
        (SQ <'\n'> <'     add_line_into_file "1: Hello World" hello &&\n'> 
          <'     HASH1=$(git rev-parse --verify HEAD) &&\n'> <'     add_line_into_file "2: A new day for git" hello &&\n'> 
          <'     HASH2=$(git rev-parse --verify HEAD) &&\n'> <'     add_line_into_file "3: Another new day for git" hello &&\n'> 
          <'     HASH3=$(git rev-parse --verify HEAD) &&\n'> <'     add_line_into_file "4: Ciao for now" hello &&\n'> 
          <'     HASH4=$(git rev-parse --verify HEAD)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect starts with only one bad'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect bad $HASH4 &&\n'> <'\tgit bisect next\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect does not start with only one good'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect good $HASH1 &&\n'> <'\ttest_must_fail git bisect next\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start with one bad and good'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect good $HASH1 &&\n'> <'\tgit bisect bad $HASH4 &&\n'> <'\tgit bisect next\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect fails if given any junk instead of revs'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\ttest_must_fail git bisect start foo $HASH1 -- &&\n'> 
          <'\ttest_must_fail git bisect start $HASH4 $HASH1 bar -- &&\n'> <'\ttest -z "$(git for-each-ref "refs/bisect/*")" &&\n'> 
          <'\ttest -z "$(ls .git/BISECT_* 2>/dev/null)" &&\n'> <'\tgit bisect start &&\n'> <'\ttest_must_fail git bisect good foo $HASH1 &&\n'> 
          <'\ttest_must_fail git bisect good $HASH1 bar &&\n'> <'\ttest_must_fail git bisect bad frotz &&\n'> <'\ttest_must_fail git bisect bad $HASH3 $HASH4 &&\n'> 
          <'\ttest_must_fail git bisect skip bar $HASH3 &&\n'> <'\ttest_must_fail git bisect skip $HASH1 foo &&\n'> 
          <'\ttest -z "$(git for-each-ref "refs/bisect/*")" &&\n'> <'\tgit bisect good $HASH1 &&\n'> <'\tgit bisect bad $HASH4\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect reset: back in the master branch'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\techo "* master" > branch.expect &&\n'> 
          <'\tgit branch > branch.output &&\n'> <'\tcmp branch.expect branch.output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect reset: back in another branch'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -b other &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect good $HASH1 &&\n'> <'\tgit bisect bad $HASH3 &&\n'> <'\tgit bisect reset &&\n'> <'\techo "  master" > branch.expect &&\n'> 
          <'\techo "* other" >> branch.expect &&\n'> <'\tgit branch > branch.output &&\n'> <'\tcmp branch.expect branch.output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect reset when not bisecting'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit branch > branch.output &&\n'> 
          <'\tcmp branch.expect branch.output\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect reset removes packed refs'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect good $HASH1 &&\n'> <'\tgit bisect bad $HASH3 &&\n'> <'\tgit pack-refs --all --prune &&\n'> <'\tgit bisect next &&\n'> 
          <'\tgit bisect reset &&\n'> <'\ttest -z "$(git for-each-ref "refs/bisect/*")" &&\n'> 
          <'\ttest -z "$(git for-each-ref "refs/heads/bisect")"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect reset removes bisect state after --no-checkout'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start --no-checkout &&\n'> 
          <'\tgit bisect good $HASH1 &&\n'> <'\tgit bisect bad $HASH3 &&\n'> <'\tgit bisect next &&\n'> <'\tgit bisect reset &&\n'> 
          <'\ttest -z "$(git for-each-ref "refs/bisect/*")" &&\n'> <'\ttest -z "$(git for-each-ref "refs/heads/bisect")" &&\n'> 
          <'\ttest -z "$(git for-each-ref "BISECT_HEAD")"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start: back in good branch'>)} 
      {
        (SQ <'\n'> <'\tgit branch > branch.output &&\n'> 
          <'\tgrep "* other" branch.output > /dev/null &&\n'> <'\tgit bisect start $HASH4 $HASH1 -- &&\n'> <'\tgit bisect good &&\n'> 
          <'\tgit bisect start $HASH4 $HASH1 -- &&\n'> <'\tgit bisect bad &&\n'> <'\tgit bisect reset &&\n'> <'\tgit branch > branch.output &&\n'> 
          <'\tgrep "* other" branch.output > /dev/null\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start: no ".git/BISECT_START" created if junk rev'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\ttest_must_fail git bisect start $HASH4 foo -- &&\n'> 
          <'\tgit branch > branch.output &&\n'> <'\tgrep "* other" branch.output > /dev/null &&\n'> <'\ttest_must_fail test -e .git/BISECT_START\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'bisect start: existing ".git/BISECT_START" not modified if junk rev'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start $HASH4 $HASH1 -- &&\n'> <'\tgit bisect good &&\n'> 
          <'\tcp .git/BISECT_START saved &&\n'> <'\ttest_must_fail git bisect start $HASH4 foo -- &&\n'> <'\tgit branch > branch.output &&\n'> 
          <
'\ttest_i18ngrep "* (no branch, bisect started on other)" branch.output > /dev/null &&\n'
          > <'\ttest_cmp saved .git/BISECT_START\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start: no ".git/BISECT_START" if mistaken rev'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start $HASH4 $HASH1 -- &&\n'> <'\tgit bisect good &&\n'> 
          <'\ttest_must_fail git bisect start $HASH1 $HASH4 -- &&\n'> <'\tgit branch > branch.output &&\n'> <'\tgrep "* other" branch.output > /dev/null &&\n'> 
          <'\ttest_must_fail test -e .git/BISECT_START\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start: no ".git/BISECT_START" if checkout error'>)} 
      {
        (SQ <'\n'> <'\techo "temp stuff" > hello &&\n'> 
          <'\ttest_must_fail git bisect start $HASH4 $HASH1 -- &&\n'> <'\tgit branch &&\n'> <'\tgit branch > branch.output &&\n'> 
          <'\tgrep "* other" branch.output > /dev/null &&\n'> <'\ttest_must_fail test -e .git/BISECT_START &&\n'> 
          <'\ttest -z "$(git for-each-ref "refs/bisect/*")" &&\n'> <'\tgit checkout HEAD hello\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect skip: successful result'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished git bisect reset &&\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start $HASH4 $HASH1 &&\n'> <'\tgit bisect skip &&\n'> <'\tgit bisect bad > my_bisect_log.txt &&\n'> 
          <'\tgrep "$HASH2 is the first bad commit" my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect skip: cannot tell between 3 commits'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished git bisect reset &&\n'> 
          <'\tgit bisect start $HASH4 $HASH1 &&\n'> <'\tgit bisect skip &&\n'> <'\ttest_expect_code 2 git bisect skip >my_bisect_log.txt &&\n'> 
          <'\tgrep "first bad commit could be any of" my_bisect_log.txt &&\n'> <'\t! grep $HASH1 my_bisect_log.txt &&\n'> <'\tgrep $HASH2 my_bisect_log.txt &&\n'> 
          <'\tgrep $HASH3 my_bisect_log.txt &&\n'> <'\tgrep $HASH4 my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect skip: cannot tell between 2 commits'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished git bisect reset &&\n'> 
          <'\tgit bisect start $HASH4 $HASH1 &&\n'> <'\tgit bisect skip &&\n'> <'\ttest_expect_code 2 git bisect good >my_bisect_log.txt &&\n'> 
          <'\tgrep "first bad commit could be any of" my_bisect_log.txt &&\n'> <'\t! grep $HASH1 my_bisect_log.txt &&\n'> <'\t! grep $HASH2 my_bisect_log.txt &&\n'> 
          <'\tgrep $HASH3 my_bisect_log.txt &&\n'> <'\tgrep $HASH4 my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect skip: with commit both bad and skipped'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished git bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect skip &&\n'> <'\tgit bisect bad &&\n'> <'\tgit bisect good $HASH1 &&\n'> <'\tgit bisect skip &&\n'> 
          <'\ttest_expect_code 2 git bisect good >my_bisect_log.txt &&\n'> <'\tgrep "first bad commit could be any of" my_bisect_log.txt &&\n'> 
          <'\t! grep $HASH1 my_bisect_log.txt &&\n'> <'\t! grep $HASH2 my_bisect_log.txt &&\n'> <'\tgrep $HASH3 my_bisect_log.txt &&\n'> 
          <'\tgrep $HASH4 my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git bisect run" simple case'>)} 
      {
        (SQ <'echo "#"\\!"/bin/sh" > test_script.sh &&\n'> 
          <'     echo "grep Another hello > /dev/null" >> test_script.sh &&\n'> <'     echo "test \\$? -ne 0" >> test_script.sh &&\n'> <'     chmod +x test_script.sh &&\n'> 
          <'     git bisect start &&\n'> <'     git bisect good $HASH1 &&\n'> <'     git bisect bad $HASH4 &&\n'> 
          <'     git bisect run ./test_script.sh > my_bisect_log.txt &&\n'> <'     grep "$HASH3 is the first bad commit" my_bisect_log.txt &&\n'> <'     git bisect reset'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git bisect run" with more complex "git bisect start"'>)} 
      {
        (SQ <'echo "#"\\!"/bin/sh" > test_script.sh &&\n'> 
          <'     echo "grep Ciao hello > /dev/null" >> test_script.sh &&\n'> <'     echo "test \\$? -ne 0" >> test_script.sh &&\n'> <'     chmod +x test_script.sh &&\n'> 
          <'     git bisect start $HASH4 $HASH1 &&\n'> <'     git bisect run ./test_script.sh > my_bisect_log.txt &&\n'> 
          <'     grep "$HASH4 is the first bad commit" my_bisect_log.txt &&\n'> <'     git bisect reset'>
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH5) op:Equal rhs:{(EmptyPart)} spids:[622])]
      spids: [622]
    )
    (C {(test_expect_success)} {(SQ <'bisect skip: add line and then a new test'>)} 
      {
        (SQ <'\n'> <'\tadd_line_into_file "5: Another new line." hello &&\n'> 
          <'\tHASH5=$(git rev-parse --verify HEAD) &&\n'> <'\tgit bisect start $HASH5 $HASH1 &&\n'> <'\tgit bisect skip &&\n'> 
          <'\tgit bisect good > my_bisect_log.txt &&\n'> <'\tgrep "$HASH5 is the first bad commit" my_bisect_log.txt &&\n'> 
          <'\tgit bisect log > log_to_replay.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect skip and bisect replay'>)} 
      {
        (SQ <'\n'> <'\tgit bisect replay log_to_replay.txt > my_bisect_log.txt &&\n'> 
          <'\tgrep "$HASH5 is the first bad commit" my_bisect_log.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH6) op:Equal rhs:{(EmptyPart)} spids:[657])]
      spids: [657]
    )
    (C {(test_expect_success)} {(SQ <'bisect run & skip: cannot tell between 2'>)} 
      {
        (SQ <'\n'> <'\tadd_line_into_file "6: Yet a line." hello &&\n'> 
          <'\tHASH6=$(git rev-parse --verify HEAD) &&\n'> <'\techo "#"\\!"/bin/sh" > test_script.sh &&\n'> 
          <
'\techo "sed -ne \\\\\\$p hello | grep Ciao > /dev/null && exit 125" >> test_script.sh &&\n'
          > <'\techo "grep line hello > /dev/null" >> test_script.sh &&\n'> 
          <'\techo "test \\$? -ne 0" >> test_script.sh &&\n'> <'\tchmod +x test_script.sh &&\n'> <'\tgit bisect start $HASH6 $HASH1 &&\n'> 
          <'\tif git bisect run ./test_script.sh > my_bisect_log.txt\n'> <'\tthen\n'> <'\t\techo Oops, should have failed.\n'> <'\t\tfalse\n'> <'\telse\n'> 
          <'\t\ttest $? -eq 2 &&\n'> <'\t\tgrep "first bad commit could be any of" my_bisect_log.txt &&\n'> 
          <'\t\t! grep $HASH3 my_bisect_log.txt &&\n'> <'\t\t! grep $HASH6 my_bisect_log.txt &&\n'> <'\t\tgrep $HASH4 my_bisect_log.txt &&\n'> 
          <'\t\tgrep $HASH5 my_bisect_log.txt\n'> <'\tfi\n'>
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:HASH7) op:Equal rhs:{(EmptyPart)} spids:[690])]
      spids: [690]
    )
    (C {(test_expect_success)} {(SQ <'bisect run & skip: find first bad'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tadd_line_into_file "7: Should be the last line." hello &&\n'> <'\tHASH7=$(git rev-parse --verify HEAD) &&\n'> <'\techo "#"\\!"/bin/sh" > test_script.sh &&\n'> 
          <
'\techo "sed -ne \\\\\\$p hello | grep Ciao > /dev/null && exit 125" >> test_script.sh &&\n'
          > <'\techo "sed -ne \\\\\\$p hello | grep day > /dev/null && exit 125" >> test_script.sh &&\n'> 
          <'\techo "grep Yet hello > /dev/null" >> test_script.sh &&\n'> <'\techo "test \\$? -ne 0" >> test_script.sh &&\n'> <'\tchmod +x test_script.sh &&\n'> 
          <'\tgit bisect start $HASH7 $HASH1 &&\n'> <'\tgit bisect run ./test_script.sh > my_bisect_log.txt &&\n'> 
          <'\tgrep "$HASH6 is the first bad commit" my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect skip only one range'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start $HASH7 $HASH1 &&\n'> 
          <'\tgit bisect skip $HASH1..$HASH5 &&\n'> <'\ttest "$HASH6" = "$(git rev-parse --verify HEAD)" &&\n'> 
          <'\ttest_must_fail git bisect bad > my_bisect_log.txt &&\n'> <'\tgrep "first bad commit could be any of" my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect skip many ranges'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start $HASH7 $HASH1 &&\n'> 
          <'\ttest "$HASH4" = "$(git rev-parse --verify HEAD)" &&\n'> <'\tgit bisect skip $HASH2 $HASH2.. ..$HASH5 &&\n'> 
          <'\ttest "$HASH6" = "$(git rev-parse --verify HEAD)" &&\n'> <'\ttest_must_fail git bisect bad > my_bisect_log.txt &&\n'> 
          <'\tgrep "first bad commit could be any of" my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect starting with a detached HEAD'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit checkout master^ &&\n'> 
          <'\tHEAD=$(git rev-parse --verify HEAD) &&\n'> <'\tgit bisect start &&\n'> <'\ttest $HEAD = $(cat .git/BISECT_START) &&\n'> 
          <'\tgit bisect reset &&\n'> <'\ttest $HEAD = $(git rev-parse --verify HEAD)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect errors out if bad and good are mistaken'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\ttest_must_fail git bisect start $HASH2 $HASH4 2> rev_list_error &&\n'> <'\ttest_i18ngrep "mistook good and bad" rev_list_error &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect does not create a "bisect" branch'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start $HASH7 $HASH1 &&\n'> 
          <'\tgit branch bisect &&\n'> <'\trev_hash4=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$rev_hash4" = "$HASH4" &&\n'> 
          <'\tgit branch -D bisect &&\n'> <'\tgit bisect good &&\n'> <'\tgit branch bisect &&\n'> 
          <'\trev_hash6=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$rev_hash6" = "$HASH6" &&\n'> <'\tgit bisect good > my_bisect_log.txt &&\n'> 
          <'\tgrep "$HASH7 is the first bad commit" my_bisect_log.txt &&\n'> <'\tgit bisect reset &&\n'> <'\trev_hash6=$(git rev-parse --verify bisect) &&\n'> 
          <'\ttest "$rev_hash6" = "$HASH6" &&\n'> <'\tgit branch -D bisect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'side branch creation'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit checkout -b side $HASH4 &&\n'> 
          <'\tadd_line_into_file "5(side): first line on a side branch" hello2 &&\n'> <'\tSIDE_HASH5=$(git rev-parse --verify HEAD) &&\n'> 
          <'\tadd_line_into_file "6(side): second line on a side branch" hello2 &&\n'> <'\tSIDE_HASH6=$(git rev-parse --verify HEAD) &&\n'> 
          <'\tadd_line_into_file "7(side): third line on a side branch" hello2 &&\n'> <'\tSIDE_HASH7=$(git rev-parse --verify HEAD)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'good merge base when good and bad are siblings'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&\n'> 
          <'\ttest_i18ngrep "merge base must be tested" my_bisect_log.txt &&\n'> <'\tgrep $HASH4 my_bisect_log.txt &&\n'> <'\tgit bisect good > my_bisect_log.txt &&\n'> 
          <'\ttest_must_fail grep "merge base must be tested" my_bisect_log.txt &&\n'> <'\tgrep $HASH6 my_bisect_log.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'skipped merge base when good and bad are siblings'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start "$SIDE_HASH7" "$HASH7" > my_bisect_log.txt &&\n'> 
          <'\ttest_i18ngrep "merge base must be tested" my_bisect_log.txt &&\n'> <'\tgrep $HASH4 my_bisect_log.txt &&\n'> <'\tgit bisect skip > my_bisect_log.txt 2>&1 &&\n'> 
          <'\tgrep "warning" my_bisect_log.txt &&\n'> <'\tgrep $SIDE_HASH6 my_bisect_log.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bad merge base when good and bad are siblings'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start "$HASH7" HEAD > my_bisect_log.txt &&\n'> 
          <'\ttest_i18ngrep "merge base must be tested" my_bisect_log.txt &&\n'> <'\tgrep $HASH4 my_bisect_log.txt &&\n'> 
          <'\ttest_must_fail git bisect bad > my_bisect_log.txt 2>&1 &&\n'> <'\ttest_i18ngrep "merge base $HASH4 is bad" my_bisect_log.txt &&\n'> 
          <'\ttest_i18ngrep "fixed between $HASH4 and \\[$SIDE_HASH7\\]" my_bisect_log.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'many merge bases creation'>)} 
      {
        (SQ <'\n'> <'\tgit checkout "$SIDE_HASH5" &&\n'> 
          <'\tgit merge -m "merge HASH5 and SIDE_HASH5" "$HASH5" &&\n'> <'\tA_HASH=$(git rev-parse --verify HEAD) &&\n'> <'\tgit checkout side &&\n'> 
          <'\tgit merge -m "merge HASH7 and SIDE_HASH7" "$HASH7" &&\n'> <'\tB_HASH=$(git rev-parse --verify HEAD) &&\n'> 
          <'\tgit merge-base --all "$A_HASH" "$B_HASH" > merge_bases.txt &&\n'> <'\ttest_line_count = 2 merge_bases.txt &&\n'> <'\tgrep "$HASH5" merge_bases.txt &&\n'> 
          <'\tgrep "$SIDE_HASH5" merge_bases.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'good merge bases when good and bad are siblings'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start "$B_HASH" "$A_HASH" > my_bisect_log.txt &&\n'> 
          <'\ttest_i18ngrep "merge base must be tested" my_bisect_log.txt &&\n'> <'\tgit bisect good > my_bisect_log2.txt &&\n'> 
          <'\ttest_i18ngrep "merge base must be tested" my_bisect_log2.txt &&\n'> <'\t{\n'> <'\t\t{\n'> <'\t\t\tgrep "$SIDE_HASH5" my_bisect_log.txt &&\n'> 
          <'\t\t\tgrep "$HASH5" my_bisect_log2.txt\n'> <'\t\t} || {\n'> <'\t\t\tgrep "$SIDE_HASH5" my_bisect_log2.txt &&\n'> 
          <'\t\t\tgrep "$HASH5" my_bisect_log.txt\n'> <'\t\t}\n'> <'\t} &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'optimized merge base checks'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&\n'> 
          <'\ttest_i18ngrep "merge base must be tested" my_bisect_log.txt &&\n'> <'\tgrep "$HASH4" my_bisect_log.txt &&\n'> <'\tgit bisect good > my_bisect_log2.txt &&\n'> 
          <'\ttest -f ".git/BISECT_ANCESTORS_OK" &&\n'> <'\ttest "$HASH6" = $(git rev-parse --verify HEAD) &&\n'> 
          <'\tgit bisect bad > my_bisect_log3.txt &&\n'> <'\tgit bisect good "$A_HASH" > my_bisect_log4.txt &&\n'> 
          <'\ttest_i18ngrep "merge base must be tested" my_bisect_log4.txt &&\n'> <'\ttest_must_fail test -f ".git/BISECT_ANCESTORS_OK"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"parallel" side branch creation'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit checkout -b parallel $HASH1 &&\n'> 
          <'\tmkdir dir1 dir2 &&\n'> <'\tadd_line_into_file "1(para): line 1 on parallel branch" dir1/file1 &&\n'> 
          <'\tPARA_HASH1=$(git rev-parse --verify HEAD) &&\n'> <'\tadd_line_into_file "2(para): line 2 on parallel branch" dir2/file2 &&\n'> 
          <'\tPARA_HASH2=$(git rev-parse --verify HEAD) &&\n'> <'\tadd_line_into_file "3(para): line 3 on parallel branch" dir2/file3 &&\n'> 
          <'\tPARA_HASH3=$(git rev-parse --verify HEAD) &&\n'> <'\tgit merge -m "merge HASH4 and PARA_HASH3" "$HASH4" &&\n'> 
          <'\tPARA_HASH4=$(git rev-parse --verify HEAD) &&\n'> <'\tadd_line_into_file "5(para): add line on parallel branch" dir1/file1 &&\n'> 
          <'\tPARA_HASH5=$(git rev-parse --verify HEAD) &&\n'> <'\tadd_line_into_file "6(para): add line on parallel branch" dir2/file2 &&\n'> 
          <'\tPARA_HASH6=$(git rev-parse --verify HEAD) &&\n'> <'\tgit merge -m "merge HASH7 and PARA_HASH6" "$HASH7" &&\n'> 
          <'\tPARA_HASH7=$(git rev-parse --verify HEAD)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'restricting bisection on one dir'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start HEAD $HASH1 -- dir1 &&\n'> 
          <'\tpara1=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$para1" = "$PARA_HASH1" &&\n'> <'\tgit bisect bad > my_bisect_log.txt &&\n'> 
          <'\tgrep "$PARA_HASH1 is the first bad commit" my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'restricting bisection on one dir and a file'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start HEAD $HASH1 -- dir1 hello &&\n'> 
          <'\tpara4=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$para4" = "$PARA_HASH4" &&\n'> <'\tgit bisect bad &&\n'> 
          <'\thash3=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$hash3" = "$HASH3" &&\n'> <'\tgit bisect good &&\n'> 
          <'\thash4=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$hash4" = "$HASH4" &&\n'> <'\tgit bisect good &&\n'> 
          <'\tpara1=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$para1" = "$PARA_HASH1" &&\n'> <'\tgit bisect good > my_bisect_log.txt &&\n'> 
          <'\tgrep "$PARA_HASH4 is the first bad commit" my_bisect_log.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'skipping away from skipped commit'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start $PARA_HASH7 $HASH1 &&\n'> 
          <'\tpara4=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$para4" = "$PARA_HASH4" &&\n'> <'        git bisect skip &&\n'> 
          <'\thash7=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$hash7" = "$HASH7" &&\n'> <'        git bisect skip &&\n'> 
          <'\tpara3=$(git rev-parse --verify HEAD) &&\n'> <'\ttest "$para3" = "$PARA_HASH3"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'erroring out when using bad path parameters'>)} 
      {
        (SQ <'\n'> 
          <'\ttest_must_fail git bisect start $PARA_HASH7 $HASH1 -- foobar 2> error.txt &&\n'> <'\ttest_i18ngrep "bad path parameters" error.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'test bisection on bare repo - --no-checkout specified'>)} 
      {
        (SQ <'\n'> <'\tgit clone --bare . bare.nocheckout &&\n'> <'\t(\n'> 
          <'\t\tcd bare.nocheckout &&\n'> <'\t\tgit bisect start --no-checkout &&\n'> <'\t\tgit bisect good $HASH1 &&\n'> 
          <'\t\tgit bisect bad $HASH4 &&\n'> <'\t\tgit bisect run eval \\\n'> 
          <'\t\t\t"test \\$(git rev-list BISECT_HEAD ^$HASH2 --max-count=1 | wc -l) = 0" \\\n'> <'\t\t\t>../nocheckout.log\n'> <'\t) &&\n'> 
          <'\tgrep "$HASH3 is the first bad commit" nocheckout.log\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'test bisection on bare repo - --no-checkout defaulted'>)} 
      {
        (SQ <'\n'> <'\tgit clone --bare . bare.defaulted &&\n'> <'\t(\n'> <'\t\tcd bare.defaulted &&\n'> 
          <'\t\tgit bisect start &&\n'> <'\t\tgit bisect good $HASH1 &&\n'> <'\t\tgit bisect bad $HASH4 &&\n'> <'\t\tgit bisect run eval \\\n'> 
          <'\t\t\t"test \\$(git rev-list BISECT_HEAD ^$HASH2 --max-count=1 | wc -l) = 0" \\\n'> <'\t\t\t>../defaulted.log\n'> <'\t) &&\n'> <'\tgrep "$HASH3 is the first bad commit" defaulted.log\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'broken branch creation'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit checkout -b broken $HASH4 &&\n'> 
          <'\tgit tag BROKEN_HASH4 $HASH4 &&\n'> <'\tadd_line_into_file "5(broken): first line on a broken branch" hello2 &&\n'> 
          <'\tgit tag BROKEN_HASH5 &&\n'> <'\tmkdir missing &&\n'> <'\t:> missing/MISSING &&\n'> <'\tgit add missing/MISSING &&\n'> 
          <'\tgit commit -m "6(broken): Added file that will be deleted" &&\n'> <'\tgit tag BROKEN_HASH6 &&\n'> 
          <'\tadd_line_into_file "7(broken): second line on a broken branch" hello2 &&\n'> <'\tgit tag BROKEN_HASH7 &&\n'> 
          <'\tadd_line_into_file "8(broken): third line on a broken branch" hello2 &&\n'> <'\tgit tag BROKEN_HASH8 &&\n'> <'\tgit rm missing/MISSING &&\n'> 
          <'\tgit commit -m "9(broken): Remove missing file" &&\n'> <'\tgit tag BROKEN_HASH9 &&\n'> <'\trm .git/objects/39/f7e61a724187ab767d2e08442d9b6b9dab587d\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(echo)} {(DQ )}]
      redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expected.ok)} spids:[1260])]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir
          op_id: Redir_Great
          fd: 16777215
          arg_word: {(expected.missing-tree.default)}
          spids: [1266]
        )
        (HereDoc
          op_id: Redir_DLess
          fd: 16777215
          body: {(DQ ('fatal: unable to read tree 39f7e61a724187ab767d2e08442d9b6b9dab587d\n'))}
          do_expansion: True
          here_end: EOF
          was_filled: T
          spids: [1270]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'bisect fails if tree is broken on start commit'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\ttest_must_fail git bisect start BROKEN_HASH7 BROKEN_HASH4 2>error.txt &&\n'> <'\ttest_cmp expected.missing-tree.default error.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect fails if tree is broken on trial commit'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\ttest_must_fail git bisect start BROKEN_HASH9 BROKEN_HASH4 2>error.txt &&\n'> <'\tgit reset --hard broken &&\n'> <'\tgit checkout broken &&\n'> 
          <'\ttest_cmp expected.missing-tree.default error.txt\n'>
        )
      }
    )
    (FuncDef
      name: check_same
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp]
              children: [
                (C {(echo)} 
                  {(DQ ('Checking ') ($ VSub_Number '$1') (' is the same as ') ($ VSub_Number '$2'))}
                )
                (C {(test_cmp_rev)} {(DQ ($ VSub_Number '$1'))} {(DQ ($ VSub_Number '$2'))})
              ]
            )
          ]
          spids: [1310]
        )
      spids: [1306 1309]
    )
    (C {(test_expect_success)} {(SQ <'bisect: --no-checkout - start commit bad'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start BROKEN_HASH7 BROKEN_HASH4 --no-checkout &&\n'> <'\tcheck_same BROKEN_HASH6 BISECT_HEAD &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect: --no-checkout - trial commit bad'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start broken BROKEN_HASH4 --no-checkout &&\n'> <'\tcheck_same BROKEN_HASH6 BISECT_HEAD &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect: --no-checkout - target before breakage'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start broken BROKEN_HASH4 --no-checkout &&\n'> <'\tcheck_same BROKEN_HASH6 BISECT_HEAD &&\n'> <'\tgit bisect bad BISECT_HEAD &&\n'> 
          <'\tcheck_same BROKEN_HASH5 BISECT_HEAD &&\n'> <'\tgit bisect bad BISECT_HEAD &&\n'> <'\tcheck_same BROKEN_HASH5 bisect/bad &&\n'> 
          <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect: --no-checkout - target in breakage'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start broken BROKEN_HASH4 --no-checkout &&\n'> <'\tcheck_same BROKEN_HASH6 BISECT_HEAD &&\n'> <'\tgit bisect bad BISECT_HEAD &&\n'> 
          <'\tcheck_same BROKEN_HASH5 BISECT_HEAD &&\n'> <'\tgit bisect good BISECT_HEAD &&\n'> <'\tcheck_same BROKEN_HASH6 bisect/bad &&\n'> 
          <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect: --no-checkout - target after breakage'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start broken BROKEN_HASH4 --no-checkout &&\n'> <'\tcheck_same BROKEN_HASH6 BISECT_HEAD &&\n'> <'\tgit bisect good BISECT_HEAD &&\n'> 
          <'\tcheck_same BROKEN_HASH8 BISECT_HEAD &&\n'> <'\tgit bisect good BISECT_HEAD &&\n'> <'\tcheck_same BROKEN_HASH9 bisect/bad &&\n'> 
          <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect: demonstrate identification of damage boundary'>)} 
      {
        (DQ ('\n') ('\tgit bisect reset &&\n') ('\tgit checkout broken &&\n') 
          ('\tgit bisect start broken master --no-checkout &&\n') ('\tgit bisect run ') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) (SHELL_PATH) (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (" -c '\n") ('\t\tGOOD=') 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) ('(git for-each-ref ') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ('--format=%(objectname)') 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (' refs/bisect/good-*) &&\n') ('\t\tgit rev-list --objects BISECT_HEAD --not ') 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) ('GOOD >tmp.') (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) (' &&\n') ('\t\tgit pack-objects --stdout >/dev/null < tmp.') 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) ('\n') ('\t\trc=') 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) ('?\n') ('\t\trm -f tmp.') (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) 
          (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) ('\n') ('\t\ttest ') (EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) ("rc = 0' &&\n") 
          ('\tcheck_same BROKEN_HASH6 bisect/bad &&\n') ('\tgit bisect reset\n')
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:16777215 arg_word:{(expected.bisect-log)} spids:[1476])
        (HereDoc
          op_id: Redir_DLess
          fd: 16777215
          body: 
            {
              (DQ 
                (
'# bad: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.\n'
                ) ('# good: [7b7f204a749c3125d5224ed61ea2ae1187ad046f] Add <2: A new day for git> into <hello>.\n') 
                (
"git bisect start '32a594a3fdac2d57cf6d02987e30eec68511498c' '7b7f204a749c3125d5224ed61ea2ae1187ad046f'\n"
                ) 
                (
'# good: [3de952f2416b6084f557ec417709eac740c6818c] Add <3: Another new day for git> into <hello>.\n'
                ) ('git bisect good 3de952f2416b6084f557ec417709eac740c6818c\n') 
                (
'# first bad commit: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.\n'
                )
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: T
          spids: [1480]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'bisect log: successful result'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start $HASH4 $HASH2 &&\n'> 
          <'\tgit bisect good &&\n'> <'\tgit bisect log >bisect-log.txt &&\n'> <'\ttest_cmp expected.bisect-log bisect-log.txt &&\n'> 
          <'\tgit bisect reset\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir
          op_id: Redir_Great
          fd: 16777215
          arg_word: {(expected.bisect-skip-log)}
          spids: [1510]
        )
        (HereDoc
          op_id: Redir_DLess
          fd: 16777215
          body: 
            {
              (DQ 
                (
'# bad: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.\n'
                ) ('# good: [7b7f204a749c3125d5224ed61ea2ae1187ad046f] Add <2: A new day for git> into <hello>.\n') 
                (
"git bisect start '32a594a3fdac2d57cf6d02987e30eec68511498c' '7b7f204a749c3125d5224ed61ea2ae1187ad046f'\n"
                ) 
                (
'# skip: [3de952f2416b6084f557ec417709eac740c6818c] Add <3: Another new day for git> into <hello>.\n'
                ) ('git bisect skip 3de952f2416b6084f557ec417709eac740c6818c\n') 
                ('# only skipped commits left to test\n') 
                (
'# possible first bad commit: [32a594a3fdac2d57cf6d02987e30eec68511498c] Add <4: Ciao for now> into <hello>.\n'
                ) 
                (
'# possible first bad commit: [3de952f2416b6084f557ec417709eac740c6818c] Add <3: Another new day for git> into <hello>.\n'
                )
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: T
          spids: [1514]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'bisect log: only skip commits left'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start $HASH4 $HASH2 &&\n'> 
          <'\ttest_must_fail git bisect skip &&\n'> <'\tgit bisect log >bisect-skip-log.txt &&\n'> 
          <'\ttest_cmp expected.bisect-skip-log bisect-skip-log.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git bisect bad HEAD" behaves as "git bisect bad"'>)} 
      {
        (SQ <'\n'> <'\tgit checkout parallel &&\n'> <'\tgit bisect start HEAD $HASH1 &&\n'> 
          <'\tgit bisect good HEAD &&\n'> <'\tgit bisect bad HEAD &&\n'> <'\ttest "$HASH6" = $(git rev-parse --verify HEAD) &&\n'> 
          <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect starts with only one new'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect new $HASH4 &&\n'> <'\tgit bisect next\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect does not start with only one old'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect old $HASH1 &&\n'> <'\ttest_must_fail git bisect next\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start with one new and old'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start &&\n'> 
          <'\tgit bisect old $HASH1 &&\n'> <'\tgit bisect new $HASH4 &&\n'> <'\tgit bisect new &&\n'> <'\tgit bisect new >bisect_result &&\n'> 
          <'\tgrep "$HASH2 is the first new commit" bisect_result &&\n'> <'\tgit bisect log >log_to_replay.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect replay with old and new'>)} 
      {
        (SQ <'\n'> <'\tgit bisect replay log_to_replay.txt >bisect_result &&\n'> 
          <'\tgrep "$HASH2 is the first new commit" bisect_result &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect cannot mix old/new and good/bad'>)} 
      {
        (SQ <'\n'> <'\tgit bisect start &&\n'> <'\tgit bisect bad $HASH4 &&\n'> 
          <'\ttest_must_fail git bisect old $HASH1\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect terms needs 0 or 1 argument'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\ttest_must_fail git bisect terms only-one &&\n'> 
          <'\ttest_must_fail git bisect terms 1 2 &&\n'> <'\ttest_must_fail git bisect terms 2>actual &&\n'> <'\techo "no terms defined" >expected &&\n'> 
          <'\ttest_i18ncmp expected actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect terms shows good/bad after start'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start HEAD $HASH1 &&\n'> 
          <'\tgit bisect terms --term-good >actual &&\n'> <'\techo good >expected &&\n'> <'\ttest_cmp expected actual &&\n'> 
          <'\tgit bisect terms --term-bad >actual &&\n'> <'\techo bad >expected &&\n'> <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start with one term1 and term2'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start --term-old term2 --term-new term1 &&\n'> <'\tgit bisect term2 $HASH1 &&\n'> <'\tgit bisect term1 $HASH4 &&\n'> <'\tgit bisect term1 &&\n'> 
          <'\tgit bisect term1 >bisect_result &&\n'> <'\tgrep "$HASH2 is the first term1 commit" bisect_result &&\n'> 
          <'\tgit bisect log >log_to_replay.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect replay with term1 and term2'>)} 
      {
        (SQ <'\n'> <'\tgit bisect replay log_to_replay.txt >bisect_result &&\n'> 
          <'\tgrep "$HASH2 is the first term1 commit" bisect_result &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start term1 term2'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start --term-new term1 --term-old term2 $HASH4 $HASH1 &&\n'> <'\tgit bisect term1 &&\n'> <'\tgit bisect term1 >bisect_result &&\n'> 
          <'\tgrep "$HASH2 is the first term1 commit" bisect_result &&\n'> <'\tgit bisect log >log_to_replay.txt &&\n'> <'\tgit bisect reset\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect cannot mix terms'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start --term-good term1 --term-bad term2 $HASH4 $HASH1 &&\n'> <'\ttest_must_fail git bisect a &&\n'> <'\ttest_must_fail git bisect b &&\n'> 
          <'\ttest_must_fail git bisect bad &&\n'> <'\ttest_must_fail git bisect good &&\n'> <'\ttest_must_fail git bisect new &&\n'> 
          <'\ttest_must_fail git bisect old\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect terms rejects invalid terms'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\ttest_must_fail git bisect start --term-good invalid..term &&\n'> <'\ttest_must_fail git bisect terms --term-bad invalid..term &&\n'> 
          <'\ttest_must_fail git bisect terms --term-good bad &&\n'> <'\ttest_must_fail git bisect terms --term-good old &&\n'> 
          <'\ttest_must_fail git bisect terms --term-good skip &&\n'> <'\ttest_must_fail git bisect terms --term-good reset &&\n'> 
          <'\ttest_path_is_missing .git/BISECT_TERMS\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start --term-* does store terms'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> 
          <'\tgit bisect start --term-bad=one --term-good=two &&\n'> <'\tgit bisect terms >actual &&\n'> <'\tcat <<-EOF >expected &&\n'> 
          <'\tYour current terms are two for the old state\n'> <'\tand one for the new state.\n'> <'\tEOF\n'> <'\ttest_i18ncmp expected actual &&\n'> 
          <'\tgit bisect terms --term-bad >actual &&\n'> <'\techo one >expected &&\n'> <'\ttest_cmp expected actual &&\n'> 
          <'\tgit bisect terms --term-good >actual &&\n'> <'\techo two >expected &&\n'> <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'bisect start takes options and revs in any order'>)} 
      {
        (SQ <'\n'> <'\tgit bisect reset &&\n'> <'\tgit bisect start --term-good one $HASH4 \\\n'> 
          <'\t\t--term-good two --term-bad bad-term \\\n'> <'\t\t$HASH1 --term-good three -- &&\n'> 
          <'\t(git bisect terms --term-bad && git bisect terms --term-good) >actual &&\n'> <'\tprintf "%s\\n%s\\n" bad-term three >expected &&\n'> <'\ttest_cmp expected actual\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)