(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 notes merging at various fanout levels'
                  span_id: 15
                )
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: verify_notes
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:notes_ref)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [32]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:commit)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$2'))}
                  spids: [38]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (C {(test)} {(-f)} {(DQ (expect_notes_) ($ Id.VSub_DollarName '$notes_ref'))})
                      ]
                      action: [
                        (command.AndOr
                          ops: [Id.Op_DAmp Id.Op_DPipe]
                          children: [
                            (command.Pipeline
                              children: [
                                (C {(git)} {(-c)} 
                                  {(core.notesRef) (Id.Lit_Equals '=') 
                                    (DQ (refs/notes/) ($ Id.VSub_DollarName '$notes_ref'))
                                  } {(notes)}
                                )
                                (command.Simple
                                  words: [{(sort)}]
                                  redirects: [
                                    (redir.Redir
                                      op: (Token id:Id.Redir_Great val:'>' span_id:77)
                                      fd: -1
                                      arg_word: 
                                        {(DQ (output_notes_) ($ Id.VSub_DollarName '$notes_ref'))}
                                    )
                                  ]
                                )
                              ]
                              negated: F
                            )
                            (C {(test_cmp)} {(DQ (expect_notes_) ($ Id.VSub_DollarName '$notes_ref'))} 
                              {(DQ (output_notes_) ($ Id.VSub_DollarName '$notes_ref'))}
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Return val:return span_id:101)
                              arg_word: {(1)}
                            )
                          ]
                        )
                      ]
                      spids: [44 56]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {(git)}
                    {(-c)}
                    {(core.notesRef) (Id.Lit_Equals '=') 
                      (DQ (refs/notes/) ($ Id.VSub_DollarName '$notes_ref'))
                    }
                    {(log)}
                    {(--format) (Id.Lit_Equals '=') (DQ ('%H %s%n%N'))}
                    {(DQ ($ Id.VSub_DollarName '$commit'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:136)
                      fd: -1
                      arg_word: {(DQ (output_log_) ($ Id.VSub_DollarName '$notes_ref'))}
                    )
                  ]
                )
                (C {(test_cmp)} {(DQ (expect_log_) ($ Id.VSub_DollarName '$notes_ref'))} 
                  {(DQ (output_log_) ($ Id.VSub_DollarName '$notes_ref'))}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: verify_fanout
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:notes_ref)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [168]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(git)}
                    {(rev-parse)}
                    {(--quiet)}
                    {(--verify)}
                    {(DQ (refs/notes/) ($ Id.VSub_DollarName '$notes_ref'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:191)
                      fd: -1
                      arg_word: {(/dev/null)}
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (C {(git)} {(ls-tree)} {(-r)} {(--name-only)} 
                      {(DQ (refs/notes/) ($ Id.VSub_DollarName '$notes_ref'))}
                    )
                    (command.WhileUntil
                      keyword: (Token id:Id.KW_While val:while span_id:213)
                      cond: [(C {(read)} {(path)})]
                      body: 
                        (command.DoGroup
                          children: [
                            (command.Case
                              to_match: {(DQ ($ Id.VSub_DollarName '$path'))}
                              arms: [
                                (case_arm
                                  pat_list: [
                                    {(Id.Lit_QMark '?') (Id.Lit_QMark '?') (/) (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?')
                                    }
                                  ]
                                  action: [(C {(Id.Lit_Other ':')} {(true)})]
                                  spids: [232 273 281 -1]
                                )
                                (case_arm
                                  pat_list: [{(Id.Lit_Star '*')}]
                                  action: [
                                    (command.AndOr
                                      ops: [Id.Op_DAmp]
                                      children: [
                                        (C {(echo)} 
                                          {
                                            (DQ ('Invalid path ') 
                                              (word_part.EscapedLiteral
                                                token: 
                                                  (Token
                                                    id: Id.Lit_EscapedChar
                                                    val: '\\"'
                                                    span_id: 292
                                                  )
                                              ) ($ Id.VSub_DollarName '$path') 
                                              (word_part.EscapedLiteral
                                                token: 
                                                  (Token
                                                    id: Id.Lit_EscapedChar
                                                    val: '\\"'
                                                    span_id: 294
                                                  )
                                              )
                                            )
                                          }
                                        )
                                        (command.ControlFlow
                                          token: 
                                            (Token
                                              id: Id.ControlFlow_Return
                                              val: return
                                              span_id: 300
                                            )
                                          arg_word: {(1)}
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [284 285 305 -1]
                                )
                              ]
                            )
                          ]
                        )
                    )
                  ]
                  negated: F
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: verify_no_fanout
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:notes_ref)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [324]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(git)}
                    {(rev-parse)}
                    {(--quiet)}
                    {(--verify)}
                    {(DQ (refs/notes/) ($ Id.VSub_DollarName '$notes_ref'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:347)
                      fd: -1
                      arg_word: {(/dev/null)}
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (C {(git)} {(ls-tree)} {(-r)} {(--name-only)} 
                      {(DQ (refs/notes/) ($ Id.VSub_DollarName '$notes_ref'))}
                    )
                    (command.WhileUntil
                      keyword: (Token id:Id.KW_While val:while span_id:369)
                      cond: [(C {(read)} {(path)})]
                      body: 
                        (command.DoGroup
                          children: [
                            (command.Case
                              to_match: {(DQ ($ Id.VSub_DollarName '$path'))}
                              arms: [
                                (case_arm
                                  pat_list: [
                                    {(Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') (Id.Lit_QMark '?') 
                                      (Id.Lit_QMark '?')
                                    }
                                  ]
                                  action: [(C {(Id.Lit_Other ':')} {(true)})]
                                  spids: [388 428 436 -1]
                                )
                                (case_arm
                                  pat_list: [{(Id.Lit_Star '*')}]
                                  action: [
                                    (command.AndOr
                                      ops: [Id.Op_DAmp]
                                      children: [
                                        (C {(echo)} 
                                          {
                                            (DQ ('Invalid path ') 
                                              (word_part.EscapedLiteral
                                                token: 
                                                  (Token
                                                    id: Id.Lit_EscapedChar
                                                    val: '\\"'
                                                    span_id: 447
                                                  )
                                              ) ($ Id.VSub_DollarName '$path') 
                                              (word_part.EscapedLiteral
                                                token: 
                                                  (Token
                                                    id: Id.Lit_EscapedChar
                                                    val: '\\"'
                                                    span_id: 449
                                                  )
                                              )
                                            )
                                          }
                                        )
                                        (command.ControlFlow
                                          token: 
                                            (Token
                                              id: Id.ControlFlow_Return
                                              val: return
                                              span_id: 455
                                            )
                                          arg_word: {(1)}
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [439 440 460 -1]
                                )
                              ]
                            )
                          ]
                        )
                    )
                  ]
                  negated: F
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'setup a few initial commits with notes (notes ref: x)'
            span_id: 477
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:481) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.notesRef refs/notes/x &&\n'
            span_id: 482
          ) (Token id:Id.Lit_Chars val:'\tfor i in 1 2 3 4 5\n' span_id:483) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:484) (Token id:Id.Lit_Chars val:'\t\ttest_commit "commit$i" >/dev/null &&\n' span_id:485) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit notes add -m "notes for commit$i" || return 1\n'
            span_id: 486
          ) (Token id:Id.Lit_Chars val:'\tdone\n' span_id:487)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit_sha1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:492)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(git)} {(rev-parse)} 
                        {(commit1) (Id.Lit_Other '^') (Id.Lit_LBrace '{') (commit) (Id.Lit_RBrace '}')}
                      )
                    ]
                  )
              )
            }
          spids: [491]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit_sha2)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:505)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(git)} {(rev-parse)} 
                        {(commit2) (Id.Lit_Other '^') (Id.Lit_LBrace '{') (commit) (Id.Lit_RBrace '}')}
                      )
                    ]
                  )
              )
            }
          spids: [504]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit_sha3)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:518)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(git)} {(rev-parse)} 
                        {(commit3) (Id.Lit_Other '^') (Id.Lit_LBrace '{') (commit) (Id.Lit_RBrace '}')}
                      )
                    ]
                  )
              )
            }
          spids: [517]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit_sha4)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:531)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(git)} {(rev-parse)} 
                        {(commit4) (Id.Lit_Other '^') (Id.Lit_LBrace '{') (commit) (Id.Lit_RBrace '}')}
                      )
                    ]
                  )
              )
            }
          spids: [530]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit_sha5)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:544)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(git)} {(rev-parse)} 
                        {(commit5) (Id.Lit_Other '^') (Id.Lit_LBrace '{') (commit) (Id.Lit_RBrace '}')}
                      )
                    ]
                  )
              )
            }
          spids: [543]
        )
      ]
    )
    (command.Pipeline
      children: [
        (command.Simple
          words: [{(cat)}]
          redirects: [
            (redir.HereDoc
              op: (Token id:Id.Redir_DLess val:'<<' span_id:559)
              fd: -1
              here_begin: {(EOF)}
              here_end_span_id: 585
              stdin_parts: [
                ('aed91155c7a72c2188e781fdf40e0f3761b299db ')
                ($ Id.VSub_DollarName '$commit_sha5')
                ('\n')
                ('99fab268f9d7ee7b011e091a436c78def8eeee69 ')
                ($ Id.VSub_DollarName '$commit_sha4')
                ('\n')
                ('953c20ae26c7aa0b428c20693fe38bc687f9d1a9 ')
                ($ Id.VSub_DollarName '$commit_sha3')
                ('\n')
                ('6358796131b8916eaa2dde6902642942a1cb37e1 ')
                ($ Id.VSub_DollarName '$commit_sha2')
                ('\n')
                ('b02d459c32f0e68f2fe0981033bb34f38776ba47 ')
                ($ Id.VSub_DollarName '$commit_sha1')
                ('\n')
              ]
            )
          ]
        )
        (command.Simple
          words: [{(sort)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:566)
              fd: -1
              arg_word: {(expect_notes_x)}
            )
          ]
        )
      ]
      negated: F
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:589)
          fd: -1
          arg_word: {(expect_log_x)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:592)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 616
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('notes for commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('notes for commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'sanity check (x)' span_id:621))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:625) 
          (Token id:Id.Lit_Chars val:'\tverify_notes x commit5 &&\n' span_id:626) (Token id:Id.Lit_Chars val:'\tverify_no_fanout x\n' span_id:627)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:num)
          op: assign_op.Equal
          rhs: {(300)}
          spids: [631]
        )
      ]
    )
    (C {(cp)} {(expect_log_x)} {(expect_log_y)})
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Add a few hundred commits w/notes to trigger fanout (x -> y)'
            span_id: 645
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:649) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/y refs/notes/x &&\n'
            span_id: 650
          ) (Token id:Id.Lit_Chars val:'\tgit config core.notesRef refs/notes/y &&\n' span_id:651) 
          (Token id:Id.Lit_Chars val:'\ti=5 &&\n' span_id:652) (Token id:Id.Lit_Chars val:'\twhile test $i -lt $num\n' span_id:653) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:654) (Token id:Id.Lit_Chars val:'\t\ti=$(($i + 1)) &&\n' span_id:655) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_commit "commit$i" >/dev/null &&\n'
            span_id: 656
          ) (Token id:Id.Lit_Chars val:'\t\tgit notes add -m "notes for commit$i" || return 1\n' span_id:657) 
          (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:658) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse refs/notes/y)" != "$(git rev-parse refs/notes/x)" &&\n'
            span_id: 659
          ) (Token id:Id.Lit_Chars val:'\t# Expected number of commits and notes\n' span_id:660) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $(git rev-list HEAD | wc -l) = $num &&\n'
            span_id: 661
          ) (Token id:Id.Lit_Chars val:'\ttest $(git notes list | wc -l) = $num &&\n' span_id:662) 
          (Token id:Id.Lit_Chars val:'\t# 5 first notes unchanged\n' span_id:663) (Token id:Id.Lit_Chars val:'\tverify_notes y commit5\n' span_id:664)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree has fanout (y)' span_id:671))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout y' span_id:675))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'No-op merge (already included) (x => y)' span_id:682))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:686) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/y &&\n'
            span_id: 687
          ) (Token id:Id.Lit_Chars val:'\tgit config core.notesRef refs/notes/m &&\n' span_id:688) 
          (Token id:Id.Lit_Chars val:'\tgit notes merge x &&\n' span_id:689) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse refs/notes/m)" = "$(git rev-parse refs/notes/y)"\n'
            span_id: 690
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Fast-forward merge (y => x)' span_id:697))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:701) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/x &&\n'
            span_id: 702
          ) (Token id:Id.Lit_Chars val:'\tgit notes merge y &&\n' span_id:703) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse refs/notes/m)" = "$(git rev-parse refs/notes/y)"\n'
            span_id: 704
          )
        )
      }
    )
    (command.Pipeline
      children: [
        (command.Simple
          words: [{(cat)}]
          redirects: [
            (redir.HereDoc
              op: (Token id:Id.Redir_DLess val:'<<' span_id:710)
              fd: -1
              here_begin: {(EOF)}
              here_end_span_id: 730
              stdin_parts: [
                ('9f506ee70e20379d7f78204c77b334f43d77410d ')
                ($ Id.VSub_DollarName '$commit_sha3')
                ('\n')
                ('23a47d6ea7d589895faf800752054818e1e7627b ')
                ($ Id.VSub_DollarName '$commit_sha2')
                ('\n')
                ('b02d459c32f0e68f2fe0981033bb34f38776ba47 ')
                ($ Id.VSub_DollarName '$commit_sha1')
                ('\n')
              ]
            )
          ]
        )
        (command.Simple
          words: [{(sort)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:717)
              fd: -1
              arg_word: {(expect_notes_z)}
            )
          ]
        )
      ]
      negated: F
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:734)
          fd: -1
          arg_word: {(expect_log_z)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:737)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 761
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('notes for commit3\n')
            ('\n')
            ('appended notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('new notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'change some of the initial 5 notes (x -> z)' span_id:766))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:770) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/z refs/notes/x &&\n'
            span_id: 771
          ) (Token id:Id.Lit_Chars val:'\tgit config core.notesRef refs/notes/z &&\n' span_id:772) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes add -f -m "new notes for commit2" commit2 &&\n'
            span_id: 773
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes append -m "appended notes for commit3" commit3 &&\n'
            span_id: 774
          ) (Token id:Id.Lit_Chars val:'\tgit notes remove commit4 &&\n' span_id:775) 
          (Token id:Id.Lit_Chars val:'\tgit notes remove commit5 &&\n' span_id:776) (Token id:Id.Lit_Chars val:'\tverify_notes z commit5\n' span_id:777)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree has no fanout (z)' span_id:784))} {(SQ (Token id:Id.Lit_Chars val:'verify_no_fanout z' span_id:788))}
    )
    (C {(cp)} {(expect_log_z)} {(expect_log_m)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'successful merge without conflicts (y => z)' span_id:802))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:806) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/z &&\n'
            span_id: 807
          ) (Token id:Id.Lit_Chars val:'\tgit config core.notesRef refs/notes/m &&\n' span_id:808) 
          (Token id:Id.Lit_Chars val:'\tgit notes merge y &&\n' span_id:809) (Token id:Id.Lit_Chars val:'\tverify_notes m commit5 &&\n' span_id:810) 
          (Token id:Id.Lit_Chars val:'\t# x/y/z unchanged\n' span_id:811) (Token id:Id.Lit_Chars val:'\tverify_notes x commit5 &&\n' span_id:812) 
          (Token id:Id.Lit_Chars val:'\tverify_notes y commit5 &&\n' span_id:813) (Token id:Id.Lit_Chars val:'\tverify_notes z commit5\n' span_id:814)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree still has fanout after merge (m)' span_id:821))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout m' span_id:825))}
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:831)
          fd: -1
          arg_word: {(expect_log_w)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:834)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 857
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('other notes for commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('other notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('other notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'introduce conflicting changes (y -> w)' span_id:862))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:866) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/w refs/notes/y &&\n'
            span_id: 867
          ) (Token id:Id.Lit_Chars val:'\tgit config core.notesRef refs/notes/w &&\n' span_id:868) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes add -f -m "other notes for commit1" commit1 &&\n'
            span_id: 869
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes add -f -m "other notes for commit3" commit3 &&\n'
            span_id: 870
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes add -f -m "other notes for commit4" commit4 &&\n'
            span_id: 871
          ) (Token id:Id.Lit_Chars val:'\tgit notes remove commit5 &&\n' span_id:872) 
          (Token id:Id.Lit_Chars val:'\tverify_notes w commit5\n' span_id:873)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:879)
          fd: -1
          arg_word: {(expect_log_m)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:882)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 905
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('other notes for commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('other notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('new notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('other notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'successful merge using "ours" strategy (z => w)' span_id:910))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:914) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/w &&\n'
            span_id: 915
          ) (Token id:Id.Lit_Chars val:'\tgit config core.notesRef refs/notes/m &&\n' span_id:916) 
          (Token id:Id.Lit_Chars val:'\tgit notes merge -s ours z &&\n' span_id:917) (Token id:Id.Lit_Chars val:'\tverify_notes m commit5 &&\n' span_id:918) 
          (Token id:Id.Lit_Chars val:'\t# w/x/y/z unchanged\n' span_id:919) (Token id:Id.Lit_Chars val:'\tverify_notes w commit5 &&\n' span_id:920) 
          (Token id:Id.Lit_Chars val:'\tverify_notes x commit5 &&\n' span_id:921) (Token id:Id.Lit_Chars val:'\tverify_notes y commit5 &&\n' span_id:922) 
          (Token id:Id.Lit_Chars val:'\tverify_notes z commit5\n' span_id:923)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree still has fanout after merge (m)' span_id:930))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout m' span_id:934))}
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:940)
          fd: -1
          arg_word: {(expect_log_m)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:943)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 967
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('notes for commit3\n')
            ('\n')
            ('appended notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('new notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('other notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'successful merge using "theirs" strategy (z => w)'
            span_id: 972
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:976) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/w &&\n'
            span_id: 977
          ) (Token id:Id.Lit_Chars val:'\tgit notes merge -s theirs z &&\n' span_id:978) 
          (Token id:Id.Lit_Chars val:'\tverify_notes m commit5 &&\n' span_id:979) (Token id:Id.Lit_Chars val:'\t# w/x/y/z unchanged\n' span_id:980) 
          (Token id:Id.Lit_Chars val:'\tverify_notes w commit5 &&\n' span_id:981) (Token id:Id.Lit_Chars val:'\tverify_notes x commit5 &&\n' span_id:982) 
          (Token id:Id.Lit_Chars val:'\tverify_notes y commit5 &&\n' span_id:983) (Token id:Id.Lit_Chars val:'\tverify_notes z commit5\n' span_id:984)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree still has fanout after merge (m)' span_id:991))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout m' span_id:995))}
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1001)
          fd: -1
          arg_word: {(expect_log_m)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1004)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1031
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('other notes for commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('other notes for commit3\n')
            ('\n')
            ('notes for commit3\n')
            ('\n')
            ('appended notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('new notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('other notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'successful merge using "union" strategy (z => w)'
            span_id: 1036
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1040) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/w &&\n'
            span_id: 1041
          ) (Token id:Id.Lit_Chars val:'\tgit notes merge -s union z &&\n' span_id:1042) 
          (Token id:Id.Lit_Chars val:'\tverify_notes m commit5 &&\n' span_id:1043) (Token id:Id.Lit_Chars val:'\t# w/x/y/z unchanged\n' span_id:1044) 
          (Token id:Id.Lit_Chars val:'\tverify_notes w commit5 &&\n' span_id:1045) (Token id:Id.Lit_Chars val:'\tverify_notes x commit5 &&\n' span_id:1046) 
          (Token id:Id.Lit_Chars val:'\tverify_notes y commit5 &&\n' span_id:1047) (Token id:Id.Lit_Chars val:'\tverify_notes z commit5\n' span_id:1048)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree still has fanout after merge (m)' span_id:1055))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout m' span_id:1059))}
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1065)
          fd: -1
          arg_word: {(expect_log_m)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1068)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1093
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('other notes for commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('appended notes for commit3\n')
            ('notes for commit3\n')
            ('other notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('new notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('other notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'successful merge using "cat_sort_uniq" strategy (z => w)'
            span_id: 1098
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1102) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/w &&\n'
            span_id: 1103
          ) (Token id:Id.Lit_Chars val:'\tgit notes merge -s cat_sort_uniq z &&\n' span_id:1104) 
          (Token id:Id.Lit_Chars val:'\tverify_notes m commit5 &&\n' span_id:1105) (Token id:Id.Lit_Chars val:'\t# w/x/y/z unchanged\n' span_id:1106) 
          (Token id:Id.Lit_Chars val:'\tverify_notes w commit5 &&\n' span_id:1107) (Token id:Id.Lit_Chars val:'\tverify_notes x commit5 &&\n' span_id:1108) 
          (Token id:Id.Lit_Chars val:'\tverify_notes y commit5 &&\n' span_id:1109) (Token id:Id.Lit_Chars val:'\tverify_notes z commit5\n' span_id:1110)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree still has fanout after merge (m)' span_id:1117))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout m' span_id:1121))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'fails to merge using "manual" strategy (z => w)'
            span_id: 1156
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1160) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-ref refs/notes/m refs/notes/w &&\n'
            span_id: 1161
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git notes merge z\n' span_id:1162)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree still has fanout after merge (m)' span_id:1169))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout m' span_id:1173))}
    )
    (command.Pipeline
      children: [
        (command.Simple
          words: [{(cat)}]
          redirects: [
            (redir.HereDoc
              op: (Token id:Id.Redir_DLess val:'<<' span_id:1179)
              fd: -1
              here_begin: {(EOF)}
              here_end_span_id: 1194
              stdin_parts: [
                ($ Id.VSub_DollarName '$commit_sha3')
                ('\n')
                ($ Id.VSub_DollarName '$commit_sha4')
                ('\n')
              ]
            )
          ]
        )
        (command.Simple
          words: [{(sort)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:1186)
              fd: -1
              arg_word: {(expect_conflicts)}
            )
          ]
        )
      ]
      negated: F
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1198)
          fd: -1
          arg_word: {(expect_conflict_) ($ Id.VSub_DollarName '$commit_sha3')}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1202)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1213
          stdin_parts: [
            ('<<<<<<< refs/notes/m\n')
            ('other notes for commit3\n')
            ('=======\n')
            ('notes for commit3\n')
            ('\n')
            ('appended notes for commit3\n')
            ('>>>>>>> refs/notes/z\n')
          ]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1217)
          fd: -1
          arg_word: {(expect_conflict_) ($ Id.VSub_DollarName '$commit_sha4')}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1221)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1226
          stdin_parts: [('other notes for commit4\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'verify conflict entries (with no fanout)' span_id:1231))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1235) 
          (Token
            id: Id.Lit_Chars
            val: '\tls .git/NOTES_MERGE_WORKTREE >output_conflicts &&\n'
            span_id: 1236
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect_conflicts output_conflicts &&\n' span_id:1237) 
          (Token
            id: Id.Lit_Chars
            val: '\t( for f in $(cat expect_conflicts); do\n'
            span_id: 1238
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "expect_conflict_$f" ".git/NOTES_MERGE_WORKTREE/$f" ||\n'
            span_id: 1239
          ) (Token id:Id.Lit_Chars val:'\t\texit 1\n' span_id:1240) 
          (Token id:Id.Lit_Chars val:'\tdone ) &&\n' span_id:1241) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Verify that current notes tree (pre-merge) has not changed (m == w)\n'
            span_id: 1242
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse refs/notes/m)" = "$(git rev-parse refs/notes/w)"\n'
            span_id: 1243
          )
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1249)
          fd: -1
          arg_word: {(expect_log_m)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1252)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1277
          stdin_parts: [
            ($ Id.VSub_DollarName '$commit_sha5')
            (' commit5\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha4')
            (' commit4\n')
            ('other notes for commit4\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha3')
            (' commit3\n')
            ('other notes for commit3\n')
            ('\n')
            ('appended notes for commit3\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha2')
            (' commit2\n')
            ('new notes for commit2\n')
            ('\n')
            ($ Id.VSub_DollarName '$commit_sha1')
            (' commit1\n')
            ('other notes for commit1\n')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'resolve and finalize merge (z => w)' span_id:1282))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1286) 
          (Token
            id: Id.Lit_Chars
            val: '\tcat >.git/NOTES_MERGE_WORKTREE/$commit_sha3 <<EOF &&\n'
            span_id: 1287
          ) (Token id:Id.Lit_Chars val:'other notes for commit3\n' span_id:1288) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1289) (Token id:Id.Lit_Chars val:'appended notes for commit3\n' span_id:1290) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:1291) (Token id:Id.Lit_Chars val:'\tgit notes merge --commit &&\n' span_id:1292) 
          (Token id:Id.Lit_Chars val:'\tverify_notes m commit5 &&\n' span_id:1293) (Token id:Id.Lit_Chars val:'\t# w/x/y/z unchanged\n' span_id:1294) 
          (Token id:Id.Lit_Chars val:'\tverify_notes w commit5 &&\n' span_id:1295) (Token id:Id.Lit_Chars val:'\tverify_notes x commit5 &&\n' span_id:1296) 
          (Token id:Id.Lit_Chars val:'\tverify_notes y commit5 &&\n' span_id:1297) (Token id:Id.Lit_Chars val:'\tverify_notes z commit5\n' span_id:1298)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'notes tree still has fanout after merge (m)' span_id:1305))} {(SQ (Token id:Id.Lit_Chars val:'verify_fanout m' span_id:1309))}
    )
    (C {(test_done)})
  ]
)