(command.CommandList
  children: [
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:test_description spids:[45])
          op: Equal
          rhs: {(SQ <'TREESAME and limiting'>)}
          spids: [45]
        )
      ]
      spids: [45]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.FuncDef
      name: note
      body: 
        (command.BraceGroup
          children: [(C {(git)} {(tag)} {(DQ ($ VSub_Number '$1'))})]
          spids: [61]
        )
      spids: [56 60]
    )
    (command.FuncDef
      name: unnote
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(git)} {(name-rev)} {(--tags)} {(--stdin)})
                (C {(sed)} {(-e)} 
                  {
                    (DQ ('s|') ($ VSub_Name '$_x40') (' (tags/') (Lit_Other '\\') ('([^)]*') 
                      (Lit_Other '\\') ('))') (Lit_Other '\\') ('([ \t]') (Lit_Other '\\') (')|') (Lit_Other '\\') (1) (Lit_Other '\\') ('2|g')
                    )
                  }
                )
              ]
              negated: F
            )
          ]
          spids: [80]
        )
      spids: [75 79]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'\ttest_commit "Initial file" file "Hi there" A &&\n'> 
          <'\tgit branch other-branch &&\n'> <'\n'> <'\ttest_commit "file=Hello" file "Hello" B &&\n'> <'\tgit branch third-branch &&\n'> <'\n'> 
          <'\tgit checkout other-branch &&\n'> <'\ttest_commit "Added other" other "Hello" C &&\n'> <'\n'> <'\tgit checkout master &&\n'> 
          <'\ttest_merge D other-branch &&\n'> <'\n'> <'\tgit checkout third-branch &&\n'> <'\ttest_commit "Third file" third "Nothing" E &&\n'> <'\n'> 
          <'\tgit checkout master &&\n'> <'\ttest_commit "file=Blah" file "Blah" F &&\n'> <'\n'> 
          <'\ttest_tick && git merge --no-commit third-branch &&\n'> <'\tgit checkout third-branch file &&\n'> <'\tgit commit &&\n'> <'\tnote G &&\n'> 
          <'\tgit branch fiddler-branch &&\n'> <'\n'> <'\tgit checkout -b part2-branch &&\n'> <'\ttest_commit "file=Part 2" file "Part 2" H &&\n'> 
          <'\n'> <'\tgit checkout fiddler-branch &&\n'> <'\ttest_commit "Bad commit" file "Silly" I &&\n'> <'\n'> 
          <'\ttest_tick && git revert I && note J &&\n'> <'\n'> <'\tgit checkout master &&\n'> <'\ttest_tick && git merge --no-ff fiddler-branch &&\n'> 
          <'\tnote K &&\n'> <'\n'> <'\ttest_commit "file=Part 1" file "Part 1" L &&\n'> <'\n'> 
          <'\ttest_tick && test_must_fail git merge part2-branch &&\n'> <'\ttest_commit M file "Parts 1+2"\n'>
        )
      }
    )
    (command.FuncDef
      name: check_outcome
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:outcome spids:[175])
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [175]
                )
              ]
              spids: [175]
            )
            (C {(shift)})
            (command.AndOr
              ops: [Op_DAmp Op_DAmp]
              children: [
                (command.Case
                  to_match: {(DQ ($ VSub_Number '$1'))}
                  arms: [
                    (case_arm
                      pat_list: [{(Lit_Other '*') (DQ ('(')) (Lit_Other '*')}]
                      action: [
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:FMT spids:[200])
                              op: Equal
                              rhs: {(DQ ('%P\t%H | %s'))}
                              spids: [200]
                            )
                          ]
                          spids: [200]
                        )
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:munge_actual spids:[206])
                              op: Equal
                              rhs: 
                                {
                                  (DQ ('\n') ('\t\t\ts/^') (Lit_Other '\\') ('([^\t]*') (Lit_Other '\\') 
                                    (')\t') (Lit_Other '\\') ('([^ ]*') (Lit_Other '\\') (') .*/(') (Lit_Other '\\') ('1)') (Lit_Other '\\') ('2/\n') 
                                    ('\t\t\ts/ //g\n') ('\t\t\ts/()//\n') ('\t\t')
                                  )
                                }
                              spids: [206]
                            )
                          ]
                          spids: [206]
                        )
                      ]
                      spids: [192 197 228 16777215]
                    )
                    (case_arm
                      pat_list: [{(Lit_Other '*')}]
                      action: [
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:FMT spids:[235])
                              op: Equal
                              rhs: {(DQ ('%H | %s'))}
                              spids: [235]
                            )
                          ]
                          spids: [235]
                        )
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:munge_actual spids:[241])
                              op: Equal
                              rhs: 
                                {
                                  (DQ ('s/^') (Lit_Other '\\') ('([^ ]*') (Lit_Other '\\') (') .*/') 
                                    (Lit_Other '\\') (1/)
                                  )
                                }
                              spids: [241]
                            )
                          ]
                          spids: [241]
                        )
                      ]
                      spids: [231 232 253 16777215]
                    )
                  ]
                  spids: [183 189 256]
                )
                (command.SimpleCommand
                  words: [{(printf)} {(DQ ('%s') (Lit_Other '\\') (n))} {($ VSub_Number '$1')}]
                  redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect)})]
                )
                (C {(shift)})
              ]
            )
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:param spids:[281])
                      op: Equal
                      rhs: {(DQ ($ VSub_Star '$*'))}
                      spids: [281]
                    )
                  ]
                  spids: [281]
                )
                (C {(test_expect_) ($ VSub_Name '$outcome')} {(DQ ('log ') ($ VSub_Name '$param'))} 
                  {
                    (SQ <'\n'> <'\t\tgit log --format="$FMT" $param |\n'> <'\t\tunnote >actual &&\n'> 
                      <'\t\tsed -e "$munge_actual" <actual >check &&\n'> <'\t\ttest_cmp expect check\n'> <'\t'>
                    )
                  }
                )
              ]
            )
          ]
          spids: [172]
        )
      spids: [167 171]
    )
    (command.FuncDef
      name: check_result
      body: 
        (command.BraceGroup
          children: [(C {(check_outcome)} {(success)} {(DQ ($ VSub_At '$@'))})]
          spids: [314]
        )
      spids: [309 313]
    )
    (C {(check_result)} {(SQ <'M L K J I H G F E D C B A'>)})
    (C {(check_result)} {(SQ <'(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G (D)F (B)E (BC)D (A)C (A)B A'>)})
    (C {(check_result)} {(SQ <'M H L K J I G E F D C B A'>)} {(--topo-order)})
    (C {(check_result)} {(SQ <'M L H B A'>)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(LH)M (B)L (B)H (A)B A'>)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L J I H G F D B A'>)} {(--full-history)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G (D)F (BA)D (A)B A'>)} 
      {(--full-history)} {(--parents)} {(--)} {(file)}
    )
    (C {(check_result)} {(SQ <'(LH)M (G)H (J)L (I)J (G)I (FB)G (B)F (A)B A'>)} {(--simplify-merges)} 
      {(--)} {(file)}
    )
    (C {(check_result)} {(SQ <'M L K G F D B A'>)} {(--first-parent)})
    (C {(check_result)} {(SQ <'M L G F B A'>)} {(--first-parent)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L K J I H G E'>)} {(F..M)})
    (C {(check_result)} {(SQ <'M H L K J I G E'>)} {(F..M)} {(--topo-order)})
    (C {(check_result)} {(SQ <'M L H'>)} {(F..M)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(LH)M (B)L (B)H'>)} {(--parents)} {(F..M)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L J I H G'>)} {(F..M)} {(--full-history)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G'>)} {(F..M)} {(--full-history)} 
      {(--parents)} {(--)} {(file)}
    )
    (C {(check_result)} {(SQ <'(LH)M (G)H (J)L (I)J (G)I (FB)G'>)} {(F..M)} {(--simplify-merges)} {(--)} 
      {(file)}
    )
    (C {(check_result)} {(SQ <'M L K J I H G'>)} {(F..M)} {(--ancestry-path)})
    (C {(check_result)} {(SQ <'M L J I H G'>)} {(F..M)} {(--ancestry-path)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G'>)} {(F..M)} {(--ancestry-path)} 
      {(--parents)} {(--)} {(file)}
    )
    (C {(check_result)} {(SQ <'(LH)M (G)H (J)L (I)J (G)I (FE)G'>)} {(F..M)} {(--ancestry-path)} 
      {(--simplify-merges)} {(--)} {(file)}
    )
    (C {(check_result)} {(SQ <'M L K G'>)} {(F..M)} {(--first-parent)})
    (C {(check_result)} {(SQ <'M L G'>)} {(F..M)} {(--first-parent)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L K J I H G'>)} {(E..M)} {(--ancestry-path)})
    (C {(check_result)} {(SQ <'M L J I H'>)} {(E..M)} {(--ancestry-path)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(LH)M (K)L (EJ)K (I)J (E)I (E)H'>)} {(E..M)} {(--ancestry-path)} 
      {(--parents)} {(--)} {(file)}
    )
    (C {(check_result)} {(SQ <'(LH)M (E)H (J)L (I)J (E)I'>)} {(E..M)} {(--ancestry-path)} 
      {(--simplify-merges)} {(--)} {(file)}
    )
    (C {(check_result)} {(SQ <'M L K J I H'>)} {(G..M)})
    (C {(check_result)} {(SQ <'M H L K J I'>)} {(G..M)} {(--topo-order)})
    (C {(check_result)} {(SQ <'M L H'>)} {(G..M)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(LH)M (G)L (G)H'>)} {(G..M)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L J I H'>)} {(G..M)} {(--full-history)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L K J I H'>)} {(G..M)} {(--full-history)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M H L J I'>)} {(G..M)} {(--simplify-merges)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L K J I H'>)} {(G..M)} {(--ancestry-path)})
    (C {(check_result)} {(SQ <'M L J I H'>)} {(G..M)} {(--ancestry-path)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M L K J I H'>)} {(G..M)} {(--ancestry-path)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'M H L J I'>)} {(G..M)} {(--ancestry-path)} {(--simplify-merges)} {(--)} 
      {(file)}
    )
    (C {(check_result)} {(SQ <'F D C'>)} {(B..F)})
    (C {(check_result)} {(SQ <F>)} {(B..F)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(B)F'>)} {(B..F)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D'>)} {(B..F)} {(--full-history)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(D)F (BA)D'>)} {(B..F)} {(--full-history)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(B)F'>)} {(B..F)} {(--simplify-merges)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D'>)} {(B..F)} {(--ancestry-path)})
    (C {(check_result)} {(SQ <F>)} {(B..F)} {(--ancestry-path)} {(--)} {(file)})
    (C {(check_result)} {(SQ <F>)} {(B..F)} {(--ancestry-path)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <F>)} {(B..F)} {(--ancestry-path)} {(--simplify-merges)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D'>)} {(B..F)} {(--first-parent)})
    (C {(check_result)} {(SQ <F>)} {(B..F)} {(--first-parent)} {(--)} {(file)})
    (C {(check_result)} {(SQ <F>)} {(E)} {(F)} {(Lit_Other '^') (B)} {(--)} {(file)})
    (C {(check_result)} {(SQ <F>)} {(E...F)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D B'>)} {(C..F)})
    (C {(check_result)} {(SQ <'F B'>)} {(C..F)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(B)F (A)B'>)} {(C..F)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D B'>)} {(C..F)} {(--full-history)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(D)F (BC)D (A)B'>)} {(C..F)} {(--full-history)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'(D)F (BC)D (A)B'>)} {(C..F)} {(--simplify-merges)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D'>)} {(C..F)} {(--ancestry-path)})
    (C {(check_result)} {(SQ <'F D'>)} {(C..F)} {(--ancestry-path)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D'>)} {(C..F)} {(--ancestry-path)} {(--parents)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D'>)} {(C..F)} {(--ancestry-path)} {(--simplify-merges)} {(--)} {(file)})
    (C {(check_result)} {(SQ <'F D B'>)} {(C..F)} {(--first-parent)})
    (C {(check_result)} {(SQ <'F B'>)} {(C..F)} {(--first-parent)} {(--)} {(file)})
    (C {(test_done)})
  ]
)