(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'test git fast-import of notes objects'>)}
          spids: [13]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 118
              stdin_parts: [
                <'commit refs/heads/master\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'first commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'M 644 inline foo\n'>
                <'data <<EOF\n'>
                <'file foo in first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'M 755 inline bar\n'>
                <'data <<EOF\n'>
                <'file bar in first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'M 644 inline baz/xyzzy\n'>
                <'data <<EOF\n'>
                <'file baz/xyzzy in first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'commit refs/heads/master\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'second commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'M 644 inline foo\n'>
                <'data <<EOF\n'>
                <'file foo in second commit\n'>
                <'EOF\n'>
                <'\n'>
                <'M 755 inline baz/xyzzy\n'>
                <'data <<EOF\n'>
                <'file baz/xyzzy in second commit\n'>
                <'EOF\n'>
                <'\n'>
                <'commit refs/heads/master\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'third commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'M 644 inline foo\n'>
                <'data <<EOF\n'>
                <'file foo in third commit\n'>
                <'EOF\n'>
                <'\n'>
                <'commit refs/heads/master\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'fourth commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'M 755 inline bar\n'>
                <'data <<EOF\n'>
                <'file bar in fourth commit\n'>
                <'EOF\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'set up master branch'>)} 
      {(SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> <'\tgit whatchanged master\n'>)}
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit4)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<git>} {<rev-parse>} {<'refs/heads/master'>})
              )
            }
          spids: [134]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit3)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<git>} {<rev-parse>} {(DQ ($ Id.VSub_DollarName '$commit4') <'^'>)})
              )
            }
          spids: [143]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit2)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<git>} {<rev-parse>} {(DQ ($ Id.VSub_DollarName '$commit4') <'~2'>)})
              )
            }
          spids: [155]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:commit1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<git>} {<rev-parse>} {(DQ ($ Id.VSub_DollarName '$commit4') <'~3'>)})
              )
            }
          spids: [167]
        )
      ]
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 217
              stdin_parts: [
                <'commit refs/notes/test\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'first notes commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'M 644 inline '>
                ($ Id.VSub_DollarName '$commit1')
                <'\n'>
                <'data <<EOF\n'>
                <'first note for first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'M 755 inline '>
                ($ Id.VSub_DollarName '$commit2')
                <'\n'>
                <'data <<EOF\n'>
                <'first note for second commit\n'>
                <'EOF\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EXPECT_END>}
              here_end_span_id: 234
              stdin_parts: [
                <'    fourth commit\n'>
                <'    third commit\n'>
                <'    second commit\n'>
                <'    first note for second commit\n'>
                <'    first commit\n'>
                <'    first note for first commit\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'add notes with simple M command'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/test git log | grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 291
              stdin_parts: [
                <'feature notes\n'>
                <'commit refs/notes/test\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'second notes commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'from refs/notes/test^0\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit3')
                <'\n'>
                <'data <<EOF\n'>
                <'first note for third commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit4')
                <'\n'>
                <'data <<EOF\n'>
                <'first note for fourth commit\n'>
                <'EOF\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EXPECT_END>}
              here_end_span_id: 310
              stdin_parts: [
                <'    fourth commit\n'>
                <'    first note for fourth commit\n'>
                <'    third commit\n'>
                <'    first note for third commit\n'>
                <'    second commit\n'>
                <'    first note for second commit\n'>
                <'    first commit\n'>
                <'    first note for first commit\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'add notes with simple N command'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/test git log | grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 380
              stdin_parts: [
                <'commit refs/notes/test\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'third notes commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'from refs/notes/test^0\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit1')
                <'\n'>
                <'data <<EOF\n'>
                <'second note for first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit2')
                <'\n'>
                <'data <<EOF\n'>
                <'second note for second commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit3')
                <'\n'>
                <'data <<EOF\n'>
                <'second note for third commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit4')
                <'\n'>
                <'data <<EOF\n'>
                <'second note for fourth commit\n'>
                <'EOF\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EXPECT_END>}
              here_end_span_id: 399
              stdin_parts: [
                <'    fourth commit\n'>
                <'    second note for fourth commit\n'>
                <'    third commit\n'>
                <'    second note for third commit\n'>
                <'    second commit\n'>
                <'    second note for second commit\n'>
                <'    first commit\n'>
                <'    second note for first commit\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'update existing notes with N command'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/test git log | grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 545
              stdin_parts: [
                <'commit refs/notes/test\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'fourth notes commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'from refs/notes/test^0\n'>
                <'M 644 inline '>
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Pipeline
                      children: [
                        (C {<echo>} {(DQ ($ Id.VSub_DollarName '$commit3'))})
                        (C {<sed>} {(DQ <'s|^..|&/|'>)})
                      ]
                      negated: F
                    )
                )
                <'\n'>
                <'data <<EOF\n'>
                <'prefix of note for third commit\n'>
                <'EOF\n'>
                <'\n'>
                <'M 644 inline '>
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Pipeline
                      children: [
                        (C {<echo>} {(DQ ($ Id.VSub_DollarName '$commit4'))})
                        (C {<sed>} {(DQ <'s|^..|&/|'>)})
                      ]
                      negated: F
                    )
                )
                <'\n'>
                <'data <<EOF\n'>
                <'prefix of note for fourth commit\n'>
                <'EOF\n'>
                <'\n'>
                <'M 644 inline '>
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Pipeline
                      children: [
                        (C {<echo>} {(DQ ($ Id.VSub_DollarName '$commit4'))})
                        (C {<sed>} 
                          {
                            (DQ <'s|^'> <Id.Lit_Other '\\'> <'(..'> <Id.Lit_Other '\\'> <')'> 
                              <Id.Lit_Other '\\'> <'(..'> <Id.Lit_Other '\\'> <')|'> <Id.Lit_Other '\\'> <'1/'> <Id.Lit_Other '\\'> <'2/|'>
                            )
                          }
                        )
                      ]
                      negated: F
                    )
                )
                <'\n'>
                <'data <<EOF\n'>
                <'pre-prefix of note for fourth commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit1')
                <'\n'>
                <'data <<EOF\n'>
                <'third note for first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit2')
                <'\n'>
                <'data <<EOF\n'>
                <'third note for second commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit3')
                <'\n'>
                <'data <<EOF\n'>
                <'third note for third commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit4')
                <'\n'>
                <'data <<EOF\n'>
                <'third note for fourth commit\n'>
                <'EOF\n'>
                <'\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:whitespace)
          op: assign_op.Equal
          rhs: {(DQ <'    '>)}
          spids: [547]
        )
      ]
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EXPECT_END>}
              here_end_span_id: 579
              stdin_parts: [
                <'    fourth commit\n'>
                <'    pre-prefix of note for fourth commit\n'>
                ($ Id.VSub_DollarName '$whitespace')
                <'\n'>
                <'    prefix of note for fourth commit\n'>
                ($ Id.VSub_DollarName '$whitespace')
                <'\n'>
                <'    third note for fourth commit\n'>
                <'    third commit\n'>
                <'    prefix of note for third commit\n'>
                ($ Id.VSub_DollarName '$whitespace')
                <'\n'>
                <'    third note for third commit\n'>
                <'    second commit\n'>
                <'    third note for second commit\n'>
                <'    first commit\n'>
                <'    third note for first commit\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'add concatentation notes with M command'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/test git log | grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 623
              stdin_parts: [
                <'commit refs/notes/test\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'fifth notes commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'from refs/notes/test^0\n'>
                <'deleteall\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EXPECT_END>}
              here_end_span_id: 638
              stdin_parts: [
                <'    fourth commit\n'>
                <'    third commit\n'>
                <'    second commit\n'>
                <'    first commit\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'verify that deleteall also removes notes'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/test git log | grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 708
              stdin_parts: [
                <'commit refs/notes/test\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'sixth notes commit\n'>
                <'COMMIT\n'>
                <'\n'>
                <'from refs/notes/test^0\n'>
                <'M 644 inline '>
                ($ Id.VSub_DollarName '$commit1')
                <'\n'>
                <'data <<EOF\n'>
                <'third note for first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'M 644 inline '>
                ($ Id.VSub_DollarName '$commit3')
                <'\n'>
                <'data <<EOF\n'>
                <'third note for third commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit1')
                <'\n'>
                <'data <<EOF\n'>
                <'fourth note for first commit\n'>
                <'EOF\n'>
                <'\n'>
                <'N inline '>
                ($ Id.VSub_DollarName '$commit3')
                <'\n'>
                <'data <<EOF\n'>
                <'fourth note for third commit\n'>
                <'EOF\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expect>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EXPECT_END>}
              here_end_span_id: 725
              stdin_parts: [
                <'    fourth commit\n'>
                <'    third commit\n'>
                <'    fourth note for third commit\n'>
                <'    second commit\n'>
                <'    first commit\n'>
                <'    fourth note for first commit\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'verify that later N commands override earlier M commands'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/test git log | grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (command.ShFunction
      name: fast_import_commits
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_ref)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [754]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_num_commits)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [758]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_append_to_file)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$3')}
                  spids: [762]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_i)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [766]
                )
              ]
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: [
                (C {<test>} {($ Id.VSub_DollarName '$my_i')} {<-lt>} 
                  {($ Id.VSub_DollarName '$my_num_commits')}
                )
              ]
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:my_i)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Plus
                                    left: {($ Id.VSub_DollarName '$my_i')}
                                    right: {<Id.Lit_Digits 1>}
                                  )
                              )
                            }
                          spids: [784]
                        )
                      ]
                    )
                    (C {<test_tick>})
                    (command.Simple
                      words: [{<cat>}]
                      redirects: [
                        (redir
                          op: <Id.Redir_DGreat '>>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {(DQ ($ Id.VSub_DollarName '$my_append_to_file'))}
                        )
                        (redir
                          op: <Id.Redir_DLess '<<'>
                          loc: (redir_loc.Fd fd:0)
                          arg: 
                            (redir_param.MultiLine
                              here_begin: {<INPUT_END>}
                              here_end_span_id: 835
                              stdin_parts: [
                                <'commit '>
                                ($ Id.VSub_DollarName '$my_ref')
                                <'\n'>
                                <'mark :'>
                                ($ Id.VSub_DollarName '$my_i')
                                <'\n'>
                                <'committer '>
                                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                                <' <'>
                                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                                <'> '>
                                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                                <'\n'>
                                <'data <<COMMIT\n'>
                                <'commit #'>
                                ($ Id.VSub_DollarName '$my_i')
                                <'\n'>
                                <'COMMIT\n'>
                                <'\n'>
                                <'M 644 inline file\n'>
                                <'data <<EOF\n'>
                                <'file contents in commit #'>
                                ($ Id.VSub_DollarName '$my_i')
                                <'\n'>
                                <'EOF\n'>
                                <'\n'>
                              ]
                            )
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: fast_import_notes
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_notes_ref)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [856]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_num_commits)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [860]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_append_to_file)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$3')}
                  spids: [864]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_note_append)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$4')}
                  spids: [868]
                )
              ]
            )
            (C {<test_tick>})
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ ($ Id.VSub_DollarName '$my_append_to_file'))}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {<INPUT_END>}
                      here_end_span_id: 902
                      stdin_parts: [
                        <'commit '>
                        ($ Id.VSub_DollarName '$my_notes_ref')
                        <'\n'>
                        <'committer '>
                        ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                        <' <'>
                        ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                        <'> '>
                        ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                        <'\n'>
                        <'data <<COMMIT\n'>
                        <'committing '>
                        ($ Id.VSub_DollarName '$my_num_commits')
                        <' notes\n'>
                        <'COMMIT\n'>
                        <'\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:my_i)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [905]
                )
              ]
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: [
                (C {<test>} {($ Id.VSub_DollarName '$my_i')} {<-lt>} 
                  {($ Id.VSub_DollarName '$my_num_commits')}
                )
              ]
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:my_i)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Plus
                                    left: {($ Id.VSub_DollarName '$my_i')}
                                    right: {<Id.Lit_Digits 1>}
                                  )
                              )
                            }
                          spids: [923]
                        )
                      ]
                    )
                    (command.Simple
                      words: [{<cat>}]
                      redirects: [
                        (redir
                          op: <Id.Redir_DGreat '>>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {(DQ ($ Id.VSub_DollarName '$my_append_to_file'))}
                        )
                        (redir
                          op: <Id.Redir_DLess '<<'>
                          loc: (redir_loc.Fd fd:0)
                          arg: 
                            (redir_param.MultiLine
                              here_begin: {<INPUT_END>}
                              here_end_span_id: 955
                              stdin_parts: [
                                <'N inline :'>
                                ($ Id.VSub_DollarName '$my_i')
                                <'\n'>
                                <'data <<EOF\n'>
                                <'note for commit #'>
                                ($ Id.VSub_DollarName '$my_i')
                                ($ Id.VSub_DollarName '$my_note_append')
                                <'\n'>
                                <'EOF\n'>
                                <'\n'>
                              ]
                            )
                        )
                      ]
                      do_fork: T
                    )
                  ]
                )
            )
          ]
        )
    )
    (C {<rm>} {<input>} {<expect>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:num_commits)
          op: assign_op.Equal
          rhs: {<400>}
          spids: [969]
        )
      ]
    )
    (C {<fast_import_commits>} {(DQ <'refs/heads/many_commits'>)} 
      {($ Id.VSub_DollarName '$num_commits')} {<input>}
    )
    (C {<fast_import_notes>} {(DQ <'refs/notes/many_notes'>)} {($ Id.VSub_DollarName '$num_commits')} 
      {<input>}
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 1039
              stdin_parts: [
                <'commit refs/notes/many_notes\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'committing some non-notes to the notes tree\n'>
                <'COMMIT\n'>
                <'\n'>
                <'M 755 inline foobar/non-note.txt\n'>
                <'data <<EOF\n'>
                <'This is not a note, but rather a regular file residing in a notes tree\n'>
                <'EOF\n'>
                <'\n'>
                <'M 644 inline deadbeef\n'>
                <'data <<EOF\n'>
                <'Non-note file\n'>
                <'EOF\n'>
                <'\n'>
                <'M 644 inline de/adbeef\n'>
                <'data <<EOF\n'>
                <'Another non-note file\n'>
                <'EOF\n'>
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:i)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$num_commits')}
          spids: [1043]
        )
      ]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [(C {<test>} {($ Id.VSub_DollarName '$i')} {<-gt>} {<0>})]
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<expect>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {<EXPECT_END>}
                      here_end_span_id: 1074
                      stdin_parts: [
                        <'    commit #'>
                        ($ Id.VSub_DollarName '$i')
                        <'\n'>
                        <'    note for commit #'>
                        ($ Id.VSub_DollarName '$i')
                        <'\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Minus
                            left: {($ Id.VSub_DollarName '$i')}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [1076]
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'add lots of commits and notes'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |\n'> <'\t    grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'verify that lots of notes trigger a fanout scheme'>)} 
      {
        (SQ <'\n'> <'\n'> 
          <'\t# None of the entries in the top-level notes tree should be a full SHA1\n'> <'\tgit ls-tree --name-only refs/notes/many_notes |\n'> <'\twhile read path\n'> <'\tdo\n'> 
          <'\t\tif test $(expr length "$path") -ge 40\n'> <'\t\tthen\n'> <'\t\t\treturn 1\n'> <'\t\tfi\n'> <'\tdone\n'> <'\n'>
        )
      }
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<expect_non-note1>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 1139
              stdin_parts: [
                <'This is not a note, but rather a regular file residing in a notes tree\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<expect_non-note2>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 1152
              stdin_parts: [<'Non-note file\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<expect_non-note3>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<EOF>}
              here_end_span_id: 1165
              stdin_parts: [<'Another non-note file\n'>]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'verify that non-notes are untouched by a fanout change'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&\n'> 
          <'\ttest_cmp expect_non-note1 actual &&\n'> <'\tgit cat-file -p refs/notes/many_notes:deadbeef > actual &&\n'> 
          <'\ttest_cmp expect_non-note2 actual &&\n'> <'\tgit cat-file -p refs/notes/many_notes:de/adbeef > actual &&\n'> 
          <'\ttest_cmp expect_non-note3 actual\n'> <'\n'>
        )
      }
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 1212
              stdin_parts: [
                <'commit refs/notes/many_notes\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'changing notes for the top three commits\n'>
                <'COMMIT\n'>
                <'from refs/notes/many_notes^0\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<rm>} {<expect>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:i)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$num_commits')}
          spids: [1218]
        )
      ]
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:j) op:assign_op.Equal rhs:{<0>} spids:[1221])]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [(C {<test>} {($ Id.VSub_DollarName '$j')} {<-lt>} {<3>})]
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {<INPUT_END>}
                      here_end_span_id: 1254
                      stdin_parts: [
                        <'N inline refs/heads/many_commits~'>
                        ($ Id.VSub_DollarName '$j')
                        <'\n'>
                        <'data <<EOF\n'>
                        <'changed note for commit #'>
                        ($ Id.VSub_DollarName '$i')
                        <'\n'>
                        <'EOF\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<expect>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {<EXPECT_END>}
                      here_end_span_id: 1271
                      stdin_parts: [
                        <'    commit #'>
                        ($ Id.VSub_DollarName '$i')
                        <'\n'>
                        <'    changed note for commit #'>
                        ($ Id.VSub_DollarName '$i')
                        <'\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Minus
                            left: {($ Id.VSub_DollarName '$i')}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [1273]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:j)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: {($ Id.VSub_DollarName '$j')}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [1284]
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'change a few existing notes'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/many_notes git log -n3 refs/heads/many_commits |\n'> <'\t    grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'verify that changing notes respect existing fanout'>)} 
      {
        (SQ <'\n'> <'\n'> 
          <'\t# None of the entries in the top-level notes tree should be a full SHA1\n'> <'\tgit ls-tree --name-only refs/notes/many_notes |\n'> <'\twhile read path\n'> <'\tdo\n'> 
          <'\t\tif test $(expr length "$path") -ge 40\n'> <'\t\tthen\n'> <'\t\t\treturn 1\n'> <'\t\tfi\n'> <'\tdone\n'> <'\n'>
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:remaining_notes)
          op: assign_op.Equal
          rhs: {<10>}
          spids: [1336]
        )
      ]
    )
    (C {<test_tick>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {<INPUT_END>}
              here_end_span_id: 1364
              stdin_parts: [
                <'commit refs/notes/many_notes\n'>
                <'committer '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME')
                <' <'>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL')
                <'> '>
                ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE')
                <'\n'>
                <'data <<COMMIT\n'>
                <'removing all notes but '>
                ($ Id.VSub_DollarName '$remaining_notes')
                <'\n'>
                <'COMMIT\n'>
                <'from refs/notes/many_notes^0\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:i)
          op: assign_op.Equal
          rhs: 
            {
              (word_part.ArithSub
                anode: 
                  (arith_expr.Binary
                    op_id: Id.Arith_Minus
                    left: {($ Id.VSub_DollarName '$num_commits')}
                    right: {($ Id.VSub_DollarName '$remaining_notes')}
                  )
              )
            }
          spids: [1366]
        )
      ]
    )
    (command.ForEach
      iter_name: sha1
      iter_words: [
        {
          (command_sub
            left_token: <Id.Left_DollarParen '$('>
            child: 
              (C {<git>} {<rev-list>} {<-n>} {($ Id.VSub_DollarName '$i')} {<'refs/heads/many_commits'>})
          )
        }
      ]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<input>})
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {<INPUT_END>}
                      here_end_span_id: 1409
                      stdin_parts: [
                        <'N 0000000000000000000000000000000000000000 '>
                        ($ Id.VSub_DollarName '$sha1')
                        <'\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:i)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$num_commits')}
          spids: [1413]
        )
      ]
    )
    (C {<rm>} {<expect>})
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [(C {<test>} {($ Id.VSub_DollarName '$i')} {<-gt>} {<0>})]
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<expect>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {<EXPECT_END>}
                      here_end_span_id: 1445
                      stdin_parts: [<'    commit #'> ($ Id.VSub_DollarName '$i') <'\n'>]
                    )
                )
              ]
              do_fork: T
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (C {<test>} {($ Id.VSub_DollarName '$i')} {<-le>} 
                      {($ Id.VSub_DollarName '$remaining_notes')}
                    )
                  ]
                  action: [
                    (command.Simple
                      words: [{<cat>}]
                      redirects: [
                        (redir
                          op: <Id.Redir_DGreat '>>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<expect>}
                        )
                        (redir
                          op: <Id.Redir_DLess '<<'>
                          loc: (redir_loc.Fd fd:0)
                          arg: 
                            (redir_param.MultiLine
                              here_begin: {<EXPECT_END>}
                              here_end_span_id: 1473
                              stdin_parts: [
                                <'    note for commit #'>
                                ($ Id.VSub_DollarName '$i')
                                <'\n'>
                              ]
                            )
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  spids: [1447 1458]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Minus
                            left: {($ Id.VSub_DollarName '$i')}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [1478]
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'remove lots of notes'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/many_notes git log refs/heads/many_commits |\n'> <'\t    grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'verify that removing notes trigger fanout consolidation'>)} 
      {
        (SQ <'\n'> <'\n'> <'\t# All entries in the top-level notes tree should be a full SHA1\n'> 
          <'\tgit ls-tree --name-only -r refs/notes/many_notes |\n'> <'\twhile read path\n'> <'\tdo\n'> <'\t\t# Explicitly ignore the non-note paths\n'> 
          <'\t\ttest "$path" = "foobar/non-note.txt" && continue\n'> <'\t\ttest "$path" = "deadbeef" && continue\n'> <'\t\ttest "$path" = "de/adbeef" && continue\n'> <'\n'> 
          <'\t\tif test $(expr length "$path") -ne 40\n'> <'\t\tthen\n'> <'\t\t\treturn 1\n'> <'\t\tfi\n'> <'\tdone\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'verify that non-notes are untouched by a fanout change'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit cat-file -p refs/notes/many_notes:foobar/non-note.txt > actual &&\n'> 
          <'\ttest_cmp expect_non-note1 actual &&\n'> <'\tgit cat-file -p refs/notes/many_notes:deadbeef > actual &&\n'> 
          <'\ttest_cmp expect_non-note2 actual &&\n'> <'\tgit cat-file -p refs/notes/many_notes:de/adbeef > actual &&\n'> 
          <'\ttest_cmp expect_non-note3 actual\n'> <'\n'>
        )
      }
    )
    (C {<rm>} {<input>} {<expect>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:num_notes_refs)
          op: assign_op.Equal
          rhs: {<10>}
          spids: [1561]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:num_commits)
          op: assign_op.Equal
          rhs: {<16>}
          spids: [1564]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:some_commits)
          op: assign_op.Equal
          rhs: {<8>}
          spids: [1567]
        )
      ]
    )
    (C {<fast_import_commits>} {(DQ <'refs/heads/more_commits'>)} 
      {($ Id.VSub_DollarName '$num_commits')} {<input>}
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:i) op:assign_op.Equal rhs:{<0>} spids:[1586])]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [
        (C {<test>} {($ Id.VSub_DollarName '$i')} {<-lt>} {($ Id.VSub_DollarName '$num_notes_refs')})
      ]
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: {($ Id.VSub_DollarName '$i')}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [1602]
                )
              ]
            )
            (C {<fast_import_notes>} {(DQ <'refs/notes/more_notes_'> ($ Id.VSub_DollarName '$i'))} 
              {($ Id.VSub_DollarName '$num_commits')} {<input>}
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:i) op:assign_op.Equal rhs:{<0>} spids:[1629])]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [
        (C {<test>} {($ Id.VSub_DollarName '$i')} {<-lt>} {($ Id.VSub_DollarName '$num_notes_refs')})
      ]
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: {($ Id.VSub_DollarName '$i')}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [1645]
                )
              ]
            )
            (C {<fast_import_notes>} {(DQ <'refs/notes/more_notes_'> ($ Id.VSub_DollarName '$i'))} 
              {($ Id.VSub_DollarName '$some_commits')} {<input>} {(DQ <' (2)'>)}
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:i)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$num_commits')}
          spids: [1676]
        )
      ]
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [(C {<test>} {($ Id.VSub_DollarName '$i')} {<-gt>} {<0>})]
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:note_data)
                  op: assign_op.Equal
                  rhs: {(DQ <'note for commit #'> ($ Id.VSub_DollarName '$i'))}
                  spids: [1692]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (C {<test>} {($ Id.VSub_DollarName '$i')} {<-le>} 
                      {($ Id.VSub_DollarName '$some_commits')}
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:note_data)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName '$note_data') <' (2)'>)}
                          spids: [1713]
                        )
                      ]
                    )
                  ]
                  spids: [1699 1710]
                )
              ]
            )
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<expect>}
                )
                (redir
                  op: <Id.Redir_DLess '<<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      here_begin: {<EXPECT_END>}
                      here_end_span_id: 1738
                      stdin_parts: [
                        <'    commit #'>
                        ($ Id.VSub_DollarName '$i')
                        <'\n'>
                        <'    '>
                        ($ Id.VSub_DollarName '$note_data')
                        <'\n'>
                      ]
                    )
                )
              ]
              do_fork: T
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Minus
                            left: {($ Id.VSub_DollarName '$i')}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [1740]
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} 
      {
        (DQ <'add notes to '> ($ Id.VSub_DollarName '$num_commits') <' commits in each of '> 
          ($ Id.VSub_DollarName '$num_notes_refs') <' refs'>
        )
      } 
      {
        (SQ <'\n'> <'\n'> <'\tgit fast-import --active-branches=5 <input &&\n'> 
          <'\tGIT_NOTES_REF=refs/notes/more_notes_1 git log refs/heads/more_commits |\n'> <'\t    grep "^    " > actual &&\n'> <'\ttest_cmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)