(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:--ancestry-path span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: test_merge
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (C {(test_tick)})
                (C {(git)} {(merge)} {(-s)} {(ours)} {(-m)} {(DQ ($ Id.VSub_Number '$2'))} 
                  {(DQ ($ Id.VSub_Number '$1'))}
                )
                (C {(git)} {(tag)} {(DQ ($ Id.VSub_Number '$2'))})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:120) 
          (Token id:Id.Lit_Chars val:'\ttest_commit A &&\n' span_id:121) (Token id:Id.Lit_Chars val:'\ttest_commit B &&\n' span_id:122) 
          (Token id:Id.Lit_Chars val:'\ttest_commit C &&\n' span_id:123) (Token id:Id.Lit_Chars val:'\ttest_commit D &&\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\ttest_commit E &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\ttest_commit F &&\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard C &&\n' span_id:127) (Token id:Id.Lit_Chars val:'\ttest_commit G &&\n' span_id:128) 
          (Token id:Id.Lit_Chars val:'\ttest_merge E H &&\n' span_id:129) (Token id:Id.Lit_Chars val:'\ttest_commit I &&\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\ttest_merge F J &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\tgit reset --hard A &&\n' span_id:132) 
          (Token id:Id.Lit_Chars val:'\ttest_commit K &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\ttest_merge J L &&\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\ttest_commit M\n' span_id:135)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list D..M' span_id:142))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:146) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor c in E F G H I J K L M; do echo $c; done >expect &&\n'
            span_id: 147
          ) (Token id:Id.Lit_Chars val:'\tgit rev-list --format=%s D..M |\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" |\n' span_id:149) (Token id:Id.Lit_Chars val:'\tsort >actual &&\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:151)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list --ancestry-path D..M' span_id:158))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:162) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor c in E F H I J L M; do echo $c; done >expect &&\n'
            span_id: 163
          ) (Token id:Id.Lit_Chars val:'\tgit rev-list --ancestry-path --format=%s D..M |\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" |\n' span_id:165) (Token id:Id.Lit_Chars val:'\tsort >actual &&\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:167)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list D..M -- M.t' span_id:174))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:178) 
          (Token id:Id.Lit_Chars val:'\techo M >expect &&\n' span_id:179) (Token id:Id.Lit_Chars val:'\tgit rev-list --format=%s D..M -- M.t |\n' span_id:180) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" >actual &&\n' span_id:181) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:182)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list --ancestry-path D..M -- M.t' span_id:189))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:193) 
          (Token id:Id.Lit_Chars val:'\techo M >expect &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\tgit rev-list --ancestry-path --format=%s D..M -- M.t |\n' span_id:195) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" >actual &&\n' span_id:196) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:197)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list F...I' span_id:204))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:208) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor c in F G H I; do echo $c; done >expect &&\n'
            span_id: 209
          ) (Token id:Id.Lit_Chars val:'\tgit rev-list --format=%s F...I |\n' span_id:210) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" |\n' span_id:211) (Token id:Id.Lit_Chars val:'\tsort >actual &&\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:213)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list --ancestry-path F...I' span_id:220))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:224) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor c in F H I; do echo $c; done >expect &&\n'
            span_id: 225
          ) (Token id:Id.Lit_Chars val:'\tgit rev-list --ancestry-path --format=%s F...I |\n' span_id:226) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" |\n' span_id:227) (Token id:Id.Lit_Chars val:'\tsort >actual &&\n' span_id:228) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:229)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rev-list G..M -- G.t' span_id:239))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:243) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\tgit rev-list --format=%s G..M -- G.t |\n' span_id:245) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" >actual &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:247)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rev-list --ancestry-path G..M -- G.t' span_id:254))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:258) 
          (Token id:Id.Lit_Chars val:'\techo L >expect &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\tgit rev-list --ancestry-path --format=%s G..M -- G.t |\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" >actual &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:262)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rev-list --ancestry-path --simplify-merges G^..M -- G.t'
            span_id: 269
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:273) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor c in G L; do echo $c; done >expect &&\n'
            span_id: 274
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-list --ancestry-path --simplify-merges --format=%s G^..M -- G.t |\n'
            span_id: 275
          ) (Token id:Id.Lit_Chars val:'\tsed -e "/^commit /d" |\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\tsort >actual &&\n' span_id:277) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:278)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup criss-cross' span_id:309))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'\tmkdir criss-cross &&\n' span_id:314) (Token id:Id.Lit_Chars val:'\t(cd criss-cross &&\n' span_id:315) 
          (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:316) (Token id:Id.Lit_Chars val:'\t test_commit A &&\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b xb master &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\t test_commit B &&\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b xc master &&\n' span_id:320) (Token id:Id.Lit_Chars val:'\t test_commit C &&\n' span_id:321) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b xbc xb -- &&\n' span_id:322) (Token id:Id.Lit_Chars val:'\t git merge xc &&\n' span_id:323) 
          (Token id:Id.Lit_Chars val:'\t git checkout -b xcb xc -- &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\t git merge xb &&\n' span_id:325) 
          (Token id:Id.Lit_Chars val:'\t git checkout master)\n' span_id:326)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'criss-cross: rev-list --ancestry-path cb..bc' span_id:336))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:340) 
          (Token id:Id.Lit_Chars val:'\t(cd criss-cross &&\n' span_id:341) (Token id:Id.Lit_Chars val:'\t git rev-list --ancestry-path xcb..xbc > actual &&\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\t test -z "$(cat actual)")\n' span_id:343)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'criss-cross: rev-list --ancestry-path --all ^cb' span_id:353))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\t(cd criss-cross &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\t git rev-list --ancestry-path --all ^xcb > actual &&\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\t test -z "$(cat actual)")\n' span_id:360)
        )
      }
    )
    (C {(test_done)})
  ]
)