(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'TREESAME and limiting'>)}
          spids: [37]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShFunction
      name: note
      body: (BraceGroup children:[(C {<git>} {<tag>} {(DQ ($ Id.VSub_Number '$1'))})])
    )
    (command.ShFunction
      name: unnote
      body: 
        (BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {<git>} {<name-rev>} {<--tags>} {<--stdin>})
                (C {<sed>} {<-e>} 
                  {
                    (DQ <'s|'> ($ Id.VSub_DollarName '$_x40') <' (tags/'> <Id.Lit_BadBackslash '\\'> 
                      <'([^)]*'> <Id.Lit_BadBackslash '\\'> <'))'> <Id.Lit_BadBackslash '\\'> <'([ \t]'> <Id.Lit_BadBackslash '\\'> <')|'> 
                      <Id.Lit_BadBackslash '\\'> <1> <Id.Lit_BadBackslash '\\'> <'2|g'>
                    )
                  }
                )
              ]
              negated: F
            )
          ]
        )
    )
    (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.ShFunction
      name: check_outcome
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:outcome)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [167]
                )
              ]
            )
            (C {<shift>})
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Case
                  to_match: {(DQ ($ Id.VSub_Number '$1'))}
                  arms: [
                    (case_arm
                      pat_list: [{<Id.Lit_Star '*'> (DQ <'('>) <Id.Lit_Star '*'>}]
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:FMT)
                              op: assign_op.Equal
                              rhs: {(DQ <'%P\t%H | %s'>)}
                              spids: [192]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:munge_actual)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ <'\n'> <'\t\t\ts/^'> <Id.Lit_BadBackslash '\\'> <'([^\t]*'> 
                                    <Id.Lit_BadBackslash '\\'> <')\t'> <Id.Lit_BadBackslash '\\'> <'([^ ]*'> <Id.Lit_BadBackslash '\\'> <') .*/('> 
                                    <Id.Lit_BadBackslash '\\'> <'1)'> <Id.Lit_BadBackslash '\\'> <'2/\n'> <'\t\t\ts/ //g\n'> <'\t\t\ts/()//\n'> <'\t\t'>
                                  )
                                }
                              spids: [198]
                            )
                          ]
                        )
                      ]
                      spids: [184 189 220 -1]
                    )
                    (case_arm
                      pat_list: [{<Id.Lit_Star '*'>}]
                      action: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:FMT)
                              op: assign_op.Equal
                              rhs: {(DQ <'%H | %s'>)}
                              spids: [227]
                            )
                          ]
                        )
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:munge_actual)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ <'s/^'> <Id.Lit_BadBackslash '\\'> <'([^ ]*'> 
                                    <Id.Lit_BadBackslash '\\'> <') .*/'> <Id.Lit_BadBackslash '\\'> <'1/'>
                                  )
                                }
                              spids: [233]
                            )
                          ]
                        )
                      ]
                      spids: [223 224 245 -1]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {<printf>}
                    {(DQ <'%s'> <Id.Lit_BadBackslash '\\'> <n>)}
                    {($ Id.VSub_Number '$1')}
                  ]
                  redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})]
                  do_fork: T
                )
                (C {<shift>})
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:param)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Star '$*'))}
                      spids: [273]
                    )
                  ]
                )
                (C {<test_expect_> ($ Id.VSub_DollarName '$outcome')} 
                  {(DQ <'log '> ($ Id.VSub_DollarName '$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'>
                    )
                  }
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_result
      body: (BraceGroup children:[(C {<check_outcome>} {<success>} {(DQ ($ Id.VSub_At '$@'))})])
    )
    (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>} {<Id.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>})
  ]
)