(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ 
                (Token
                  id: Id.Lit_Chars
                  val: 'Test git rev-parse with different parent options'
                  span_id: 15
                )
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: test_cmp_rev_output
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(git)} {(rev-parse)} {(--verify)} {(DQ ($ Id.VSub_Number '$1'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:42)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(eval)} {(DQ ($ Id.VSub_Number '$2'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:54)
                      fd: -1
                      arg_word: {(actual)}
                    )
                  ]
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:72))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:76) 
          (Token id:Id.Lit_Chars val:'\ttest_commit start &&\n' span_id:77) (Token id:Id.Lit_Chars val:'\ttest_commit second &&\n' span_id:78) 
          (Token id:Id.Lit_Chars val:'\tgit checkout --orphan tmp &&\n' span_id:79) (Token id:Id.Lit_Chars val:'\ttest_commit start2 &&\n' span_id:80) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:81) (Token id:Id.Lit_Chars val:'\tgit merge -m next --allow-unrelated-histories start2 &&\n' span_id:82) 
          (Token id:Id.Lit_Chars val:'\ttest_commit final &&\n' span_id:83) (Token id:Id.Lit_Chars val:'\n' span_id:84) (Token id:Id.Lit_Chars val:'\ttest_seq 40 |\n' span_id:85) 
          (Token id:Id.Lit_Chars val:'\twhile read i\n' span_id:86) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout --orphan "b$i" &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:89) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit --allow-empty -m "$i" &&\n'
            span_id: 90
          ) (Token id:Id.Lit_Chars val:'\t\tcommit=$(git rev-parse --verify HEAD) &&\n' span_id:91) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "$commit " >>.git/info/grafts\n'
            span_id: 92
          ) (Token id:Id.Lit_Chars val:'\tdone\n' span_id:93)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'start is valid' span_id:100))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:104) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse start | grep "^[0-9a-f]\\{40\\}$"\n'
            span_id: 105
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'start^0' span_id:112))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:116) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev_output tags/start "git rev-parse start^0"\n'
            span_id: 117
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'start^1 not valid' span_id:124))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:128) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify start^1\n'
            span_id: 129
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'second^1 = second^' span_id:136))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:140) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev_output second^ "git rev-parse second^1"\n'
            span_id: 141
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^1^1' span_id:148))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:152) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev_output start "git rev-parse final^1^1^1"\n'
            span_id: 153
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^1^1 = final^^^' span_id:160))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:164) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev_output final^^^ "git rev-parse final^1^1^1"\n'
            span_id: 165
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^2' span_id:172))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:176) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev_output start2 "git rev-parse final^1^2"\n'
            span_id: 177
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^2 != final^1^1' span_id:184))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:188) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $(git rev-parse final^1^2) != $(git rev-parse final^1^1)\n'
            span_id: 189
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final^1^3 not valid' span_id:196))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:200) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify final^1^3\n'
            span_id: 201
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--verify start2^1' span_id:208))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:212) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --verify start2^1\n'
            span_id: 213
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--verify start2^0' span_id:220))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:224) 
          (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify start2^0\n' span_id:225)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'final^1^@ = final^1^1 final^1^2' span_id:232))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:236) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse final^1^1 final^1^2 >expect &&\n'
            span_id: 237
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse final^1^@ >actual &&\n' span_id:238) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:239)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'final^1^! = final^1 ^final^1^1 ^final^1^2' span_id:246))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse final^1 ^final^1^1 ^final^1^2 >expect &&\n'
            span_id: 251
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse final^1^! >actual &&\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:253)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'large graft octopus' span_id:260))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:264) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp_rev_output b31 "git rev-parse --verify b1^30"\n'
            span_id: 265
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'repack for next test' span_id:272))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\tgit repack -a -d\n' span_id:277)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'short SHA-1 works' span_id:284))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) 
          (Token
            id: Id.Lit_Chars
            val: '\tstart=$(git rev-parse --verify start) &&\n'
            span_id: 289
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_rev_output start "git rev-parse ${start%?}"\n' span_id:290)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup for rev^- tests' span_id:301))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:305) 
          (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:307) 
          (Token id:Id.Lit_Chars val:'\ttest_commit three &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\n' span_id:309) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Merge in a branch for testing rev^-\n'
            span_id: 310
          ) (Token id:Id.Lit_Chars val:'\tgit checkout -b branch &&\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^^ &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tgit merge -m merge --no-edit --no-ff branch &&\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b merge\n' span_id:314)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list --count merge^- = merge^..merge' span_id:324))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:328) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-list --count merge^..merge >expect &&\n'
            span_id: 329
          ) (Token id:Id.Lit_Chars val:'\techo 3 >actual &&\n' span_id:330) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:331)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^- = merge^..merge' span_id:342))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:346) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse merge^..merge >expect &&\n'
            span_id: 347
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse merge^- >actual &&\n' span_id:348) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:349)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-1 = merge^..merge' span_id:356))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:360) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse merge^1..merge >expect &&\n'
            span_id: 361
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse merge^-1 >actual &&\n' span_id:362) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:363)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-2 = merge^2..merge' span_id:370))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse merge^2..merge >expect &&\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse merge^-2 >actual &&\n' span_id:376) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:377)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-0 (invalid parent)' span_id:384))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:388) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse merge^-0\n'
            span_id: 389
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-3 (invalid parent)' span_id:396))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:400) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse merge^-3\n'
            span_id: 401
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-^ (garbage after ^-)' span_id:408))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse merge^-^\n'
            span_id: 413
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-parse merge^-1x (garbage after ^-1)' span_id:420))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:424) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse merge^-1x\n'
            span_id: 425
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^- = merge^..merge' span_id:439))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:443) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-list merge^..merge >expect &&\n'
            span_id: 444
          ) (Token id:Id.Lit_Chars val:'\tgit rev-list merge^- >actual &&\n' span_id:445) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:446)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-1 = merge^1..merge' span_id:453))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:457) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-list merge^1..merge >expect &&\n'
            span_id: 458
          ) (Token id:Id.Lit_Chars val:'\tgit rev-list merge^-1 >actual &&\n' span_id:459) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:460)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-2 = merge^2..merge' span_id:467))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:471) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-list merge^2..merge >expect &&\n'
            span_id: 472
          ) (Token id:Id.Lit_Chars val:'\tgit rev-list merge^-2 >actual &&\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:474)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-0 (invalid parent)' span_id:481))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:485) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-list merge^-0\n'
            span_id: 486
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-3 (invalid parent)' span_id:493))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:497) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-list merge^-3\n'
            span_id: 498
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-^ (garbage after ^-)' span_id:505))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:509) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-list merge^-^\n'
            span_id: 510
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list merge^-1x (garbage after ^-1)' span_id:517))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:521) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-list merge^-1x\n'
            span_id: 522
          )
        )
      }
    )
    (C {(test_done)})
  ]
)