(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: 'Revision traversal vs grafts and path limiter'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:20) 
          (Token id:Id.Lit_Chars val:'\tmkdir subdir &&\n' span_id:21) (Token id:Id.Lit_Chars val:'\techo >fileA fileA &&\n' span_id:22) 
          (Token id:Id.Lit_Chars val:'\techo >subdir/fileB fileB &&\n' span_id:23) (Token id:Id.Lit_Chars val:'\tgit add fileA subdir/fileB &&\n' span_id:24) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Initial in one history." &&\n'
            span_id: 25
          ) (Token id:Id.Lit_Chars val:'\tA0=$(git rev-parse --verify HEAD) &&\n' span_id:26) 
          (Token id:Id.Lit_Chars val:'\n' span_id:27) (Token id:Id.Lit_Chars val:'\techo >fileA fileA modified &&\n' span_id:28) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Second in one history." &&\n'
            span_id: 29
          ) (Token id:Id.Lit_Chars val:'\tA1=$(git rev-parse --verify HEAD) &&\n' span_id:30) 
          (Token id:Id.Lit_Chars val:'\n' span_id:31) (Token id:Id.Lit_Chars val:'\techo >subdir/fileB fileB modified &&\n' span_id:32) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Third in one history." &&\n'
            span_id: 33
          ) (Token id:Id.Lit_Chars val:'\tA2=$(git rev-parse --verify HEAD) &&\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\n' span_id:35) (Token id:Id.Lit_Chars val:'\trm -f .git/refs/heads/master .git/index &&\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\n' span_id:37) (Token id:Id.Lit_Chars val:'\techo >fileA fileA again &&\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\techo >subdir/fileB fileB again &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tgit add fileA subdir/fileB &&\n' span_id:40) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Initial in alternate history." &&\n'
            span_id: 41
          ) (Token id:Id.Lit_Chars val:'\tB0=$(git rev-parse --verify HEAD) &&\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\n' span_id:43) (Token id:Id.Lit_Chars val:'\techo >fileA fileA modified in alternate history &&\n' span_id:44) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Second in alternate history." &&\n'
            span_id: 45
          ) (Token id:Id.Lit_Chars val:'\tB1=$(git rev-parse --verify HEAD) &&\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\n' span_id:47) 
          (Token
            id: Id.Lit_Chars
            val: '\techo >subdir/fileB fileB modified in alternate history &&\n'
            span_id: 48
          ) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "Third in alternate history." &&\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\tB2=$(git rev-parse --verify HEAD) &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t: done\n' span_id:51)
        )
      }
    )
    (command.ShFunction
      name: check
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:type)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [63]
                )
              ]
            )
            (C {(shift)})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:arg)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [71]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:which)
                  op: assign_op.Equal
                  rhs: {(arg)}
                  spids: [74]
                )
              ]
            )
            (C {(rm)} {(-f)} {(test.expect)})
            (command.ForEach
              iter_name: a
              do_arg_iter: T
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(test)} {(DQ (z) ($ Id.VSub_DollarName '$a'))} {(Id.Lit_Equals '=')} 
                              {(z--)}
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:which)
                                  op: assign_op.Equal
                                  rhs: {(expect)}
                                  spids: [110]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:child)
                                  op: assign_op.Equal
                                  rhs: (word.Empty)
                                  spids: [114]
                                )
                              ]
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Continue val:continue span_id:117)
                            )
                          ]
                          spids: [93 107]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(test)} {(DQ ($ Id.VSub_DollarName '$which'))} {(Id.Lit_Equals '=')} 
                              {(arg)}
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:arg)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ ($ Id.VSub_DollarName '$arg') ($ Id.VSub_DollarName '$a') 
                                        (' ')
                                      )
                                    }
                                  spids: [139]
                                )
                              ]
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Continue val:continue span_id:147)
                            )
                          ]
                          spids: [123 136]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(test)} {(DQ ($ Id.VSub_DollarName '$type'))} {(Id.Lit_Equals '=')} 
                              {(basic)}
                            )
                          ]
                          action: [(C {(echo)} {(DQ ($ Id.VSub_DollarName '$a'))})]
                          spids: [153 166]
                        )
                      ]
                      else_action: [
                        (command.If
                          arms: [
                            (if_arm
                              cond: [
                                (C {(test)} {(DQ (z) ($ Id.VSub_DollarName '$child'))} 
                                  {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(z)}
                                )
                              ]
                              action: [
                                (C {(echo)} 
                                  {
                                    (DQ ($ Id.VSub_DollarName '$child') (' ') 
                                      ($ Id.VSub_DollarName '$a')
                                    )
                                  }
                                )
                              ]
                              spids: [179 194]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:child)
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_DollarName '$a'))}
                              spids: [209]
                            )
                          ]
                        )
                      ]
                    )
                  ]
                )
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:220)
                  fd: -1
                  arg_word: {(test.expect)}
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {(test)} {(DQ ($ Id.VSub_DollarName '$type'))} 
                          {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(basic)}
                        )
                        (C {(test)} {(DQ (z) ($ Id.VSub_DollarName '$child'))} 
                          {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(z)}
                        )
                      ]
                    )
                  ]
                  action: [
                    (command.Simple
                      words: [{(echo)} {($ Id.VSub_DollarName '$child')}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_DGreat val:'>>' span_id:257)
                          fd: -1
                          arg_word: {(test.expect)}
                        )
                      ]
                    )
                  ]
                  spids: [224 252]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [(C {(test)} {($ Id.VSub_DollarName '$type')} {(Id.Lit_Equals '=')} {(basic)})]
                  action: [
                    (command.Simple
                      words: [{(git)} {(rev-list)} {($ Id.VSub_DollarName '$arg')}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:286)
                          fd: -1
                          arg_word: {(test.actual)}
                        )
                      ]
                    )
                  ]
                  spids: [266 277]
                )
                (if_arm
                  cond: [
                    (C {(test)} {($ Id.VSub_DollarName '$type')} {(Id.Lit_Equals '=')} {(parents)})
                  ]
                  action: [
                    (command.Simple
                      words: [{(git)} {(rev-list)} {(--parents)} {($ Id.VSub_DollarName '$arg')}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:312)
                          fd: -1
                          arg_word: {(test.actual)}
                        )
                      ]
                    )
                  ]
                  spids: [290 301]
                )
                (if_arm
                  cond: [
                    (C {(test)} {($ Id.VSub_DollarName '$type')} {(Id.Lit_Equals '=')} {(parents-raw)})
                  ]
                  action: [
                    (command.Pipeline
                      children: [
                        (C {(git)} {(rev-list)} {(--parents)} {(--pretty) (Id.Lit_Equals '=') (raw)} 
                          {($ Id.VSub_DollarName '$arg')}
                        )
                        (command.Simple
                          words: [
                            {(sed)}
                            {(-n)}
                            {(-e)}
                            {(SQ (Token id:Id.Lit_Chars val:'s/^commit //p' span_id:352))}
                          ]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:355)
                              fd: -1
                              arg_word: {(test.actual)}
                            )
                          ]
                        )
                      ]
                      negated: F
                    )
                  ]
                  spids: [316 327]
                )
              ]
            )
            (C {(test_cmp)} {(test.expect)} {(test.actual)})
          ]
        )
    )
    (command.ForEach
      iter_name: type
      iter_words: [{(basic)} {(parents)} {(parents-raw)}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'without grafts' span_id:389))} 
              {
                (DQ ('\n') ('\t\trm -f .git/info/grafts &&\n') ('\t\tcheck ') 
                  ($ Id.VSub_DollarName '$type') (' ') ($ Id.VSub_DollarName '$B2') (' -- ') ($ Id.VSub_DollarName '$B2') (' ') 
                  ($ Id.VSub_DollarName '$B1') (' ') ($ Id.VSub_DollarName '$B0') ('\n') ('\t')
                )
              }
            )
            (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with grafts' span_id:414))} 
              {
                (DQ ('\n') ("\t\techo '") ($ Id.VSub_DollarName '$B0') (' ') ($ Id.VSub_DollarName '$A2') 
                  ("' >.git/info/grafts &&\n") ('\t\tcheck ') ($ Id.VSub_DollarName '$type') (' ') ($ Id.VSub_DollarName '$B2') (' -- ') 
                  ($ Id.VSub_DollarName '$B2') (' ') ($ Id.VSub_DollarName '$B1') (' ') ($ Id.VSub_DollarName '$B0') (' ') ($ Id.VSub_DollarName '$A2') 
                  (' ') ($ Id.VSub_DollarName '$A1') (' ') ($ Id.VSub_DollarName '$A0') ('\n') ('\t')
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'without grafts, with pathlimit' span_id:449))} 
              {
                (DQ ('\n') ('\t\trm -f .git/info/grafts &&\n') ('\t\tcheck ') 
                  ($ Id.VSub_DollarName '$type') (' ') ($ Id.VSub_DollarName '$B2') (' subdir -- ') ($ Id.VSub_DollarName '$B2') (' ') 
                  ($ Id.VSub_DollarName '$B0') ('\n') ('\t')
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'with grafts, with pathlimit' span_id:472))} 
              {
                (DQ ('\n') ("\t\techo '") ($ Id.VSub_DollarName '$B0') (' ') ($ Id.VSub_DollarName '$A2') 
                  ("' >.git/info/grafts &&\n") ('\t\tcheck ') ($ Id.VSub_DollarName '$type') (' ') ($ Id.VSub_DollarName '$B2') (' subdir -- ') 
                  ($ Id.VSub_DollarName '$B2') (' ') ($ Id.VSub_DollarName '$B0') (' ') ($ Id.VSub_DollarName '$A2') (' ') ($ Id.VSub_DollarName '$A0') 
                  ('\n') ('\t')
                )
              }
            )
          ]
        )
    )
    (C {(test_done)})
  ]
)