(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_description='> name:test_description) op: assign_op.Equal rhs: {(SQ <'test git fast-import of notes objects'>)} spids: [13] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] 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 left:<Id.Lit_VarLike 'commit4='> name:commit4) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<git>} {<rev-parse>} {<'refs/heads/master'>}) right: <Id.Eof_RParen _> ) } spids: [134] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'commit3='> name:commit3) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<git>} {<rev-parse>} {(DQ ($ Id.VSub_DollarName commit4) <'^'>)}) right: <Id.Eof_RParen _> ) } spids: [143] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'commit2='> 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'>)}) right: <Id.Eof_RParen _> ) } spids: [155] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'commit1='> 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'>)}) right: <Id.Eof_RParen _> ) } spids: [167] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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 stderr_indices: [] ) right: <Id.Eof_RParen _> ) <'\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 stderr_indices: [] ) right: <Id.Eof_RParen _> ) <'\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_BadBackslash '\\'> <'(..'> <Id.Lit_BadBackslash '\\'> <')'> <Id.Lit_BadBackslash '\\'> <'(..'> <Id.Lit_BadBackslash '\\'> <')|'> <Id.Lit_BadBackslash '\\'> <'1/'> <Id.Lit_BadBackslash '\\'> <'2/|'> ) } ) ] negated: F stderr_indices: [] ) right: <Id.Eof_RParen _> ) <'\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'> ] ) ) ] more_env: [] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'whitespace='> name:whitespace) op: assign_op.Equal rhs: {(DQ <' '>)} spids: [547] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc here_begin: {<EXPECT_END>} here_end_span_id: 638 stdin_parts: [ <' fourth commit\n'> <' third commit\n'> <' second commit\n'> <' first commit\n'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] 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 left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'my_ref='> name:my_ref) op: assign_op.Equal rhs: {($ Id.VSub_Number 1)} spids: [754] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'my_num_commits='> name:my_num_commits) op: assign_op.Equal rhs: {($ Id.VSub_Number 2)} spids: [758] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'my_append_to_file='> name: my_append_to_file ) op: assign_op.Equal rhs: {($ Id.VSub_Number 3)} spids: [762] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'my_i='> name:my_i) op: assign_op.Equal rhs: {<0>} spids: [766] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (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 left:<Id.Lit_VarLike 'my_i='> 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] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) ] ) redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name: fast_import_notes body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'my_notes_ref='> name:my_notes_ref) op: assign_op.Equal rhs: {($ Id.VSub_Number 1)} spids: [856] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'my_num_commits='> name:my_num_commits) op: assign_op.Equal rhs: {($ Id.VSub_Number 2)} spids: [860] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left: <Id.Lit_VarLike 'my_append_to_file='> name: my_append_to_file ) op: assign_op.Equal rhs: {($ Id.VSub_Number 3)} spids: [864] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'my_note_append='> name:my_note_append) op: assign_op.Equal rhs: {($ Id.VSub_Number 4)} spids: [868] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'my_i='> name:my_i) op: assign_op.Equal rhs: {<0>} spids: [905] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (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 left:<Id.Lit_VarLike 'my_i='> 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] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) ] ) redirects: [] ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (C {<rm>} {<input>} {<expect>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'num_commits='> name:num_commits) op: assign_op.Equal rhs: {<400>} spids: [969] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> name:i) op: assign_op.Equal rhs: {($ Id.VSub_DollarName num_commits)} spids: [1043] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands:[(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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> 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] ) ] redirects: [] ) ] ) redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc here_begin: {<EOF>} here_end_span_id: 1152 stdin_parts: [<'Non-note file\n'>] ) ) ] more_env: [] 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.HereDoc here_begin: {<EOF>} here_end_span_id: 1165 stdin_parts: [<'Another non-note file\n'>] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) (C {<rm>} {<expect>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> name:i) op: assign_op.Equal rhs: {($ Id.VSub_DollarName num_commits)} spids: [1218] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'j='> name:j) op: assign_op.Equal rhs: {<0>} spids: [1221] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands:[(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.HereDoc 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'> ] ) ) ] more_env: [] 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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> 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] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'j='> 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] ) ] redirects: [] ) ] ) redirects: [] ) (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 left:<Id.Lit_VarLike 'remaining_notes='> name:remaining_notes) op: assign_op.Equal rhs: {<10>} spids: [1336] ) ] redirects: [] ) (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.HereDoc 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'> ] ) ) ] more_env: [] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> 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] ) ] redirects: [] ) (command.ForEach iter_names: [sha1] iterable: (for_iter.Words words: [ { (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<git>} {<rev-list>} {<-n>} {($ Id.VSub_DollarName i)} {<'refs/heads/many_commits'>}) right: <Id.Eof_RParen _> ) } ] ) 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.HereDoc here_begin: {<INPUT_END>} here_end_span_id: 1409 stdin_parts: [ <'N 0000000000000000000000000000000000000000 '> ($ Id.VSub_DollarName sha1) <'\n'> ] ) ) ] more_env: [] do_fork: T ) ] ) redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> name:i) op: assign_op.Equal rhs: {($ Id.VSub_DollarName num_commits)} spids: [1413] ) ] redirects: [] ) (C {<rm>} {<expect>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands:[(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.HereDoc here_begin: {<EXPECT_END>} here_end_span_id: 1445 stdin_parts: [<' commit #'> ($ Id.VSub_DollarName i) <'\n'>] ) ) ] more_env: [] do_fork: T ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (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.HereDoc here_begin: {<EXPECT_END>} here_end_span_id: 1473 stdin_parts: [<' note for commit #'> ($ Id.VSub_DollarName i) <'\n'>] ) ) ] more_env: [] do_fork: T ) ] spids: [1447 1458] ) ] else_action: [] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> 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] ) ] redirects: [] ) ] ) redirects: [] ) (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 left:<Id.Lit_VarLike 'num_notes_refs='> name:num_notes_refs) op: assign_op.Equal rhs: {<10>} spids: [1561] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'num_commits='> name:num_commits) op: assign_op.Equal rhs: {<16>} spids: [1564] ) ] redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'some_commits='> name:some_commits) op: assign_op.Equal rhs: {<8>} spids: [1567] ) ] redirects: [] ) (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 left:<Id.Lit_VarLike 'i='> name:i) op: assign_op.Equal rhs: {<0>} spids: [1586] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (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 left:<Id.Lit_VarLike 'i='> 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] ) ] redirects: [] ) (C {<fast_import_notes>} {(DQ <'refs/notes/more_notes_'> ($ Id.VSub_DollarName i))} {($ Id.VSub_DollarName num_commits)} {<input>} ) ] ) redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> name:i) op: assign_op.Equal rhs: {<0>} spids: [1629] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (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 left:<Id.Lit_VarLike 'i='> 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] ) ] redirects: [] ) (C {<fast_import_notes>} {(DQ <'refs/notes/more_notes_'> ($ Id.VSub_DollarName i))} {($ Id.VSub_DollarName some_commits)} {<input>} {(DQ <' (2)'>)} ) ] ) redirects: [] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> name:i) op: assign_op.Equal rhs: {($ Id.VSub_DollarName num_commits)} spids: [1676] ) ] redirects: [] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands:[(C {<test>} {($ Id.VSub_DollarName i)} {<-gt>} {<0>})]) body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'note_data='> name:note_data) op: assign_op.Equal rhs: {(DQ <'note for commit #'> ($ Id.VSub_DollarName i))} spids: [1692] ) ] redirects: [] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (C {<test>} {($ Id.VSub_DollarName i)} {<-le>} {($ Id.VSub_DollarName some_commits)} ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'note_data='> name:note_data) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName note_data) <' (2)'>)} spids: [1713] ) ] redirects: [] ) ] spids: [1699 1710] ) ] else_action: [] redirects: [] ) (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.HereDoc here_begin: {<EXPECT_END>} here_end_span_id: 1738 stdin_parts: [ <' commit #'> ($ Id.VSub_DollarName i) <'\n'> <' '> ($ Id.VSub_DollarName note_data) <'\n'> ] ) ) ] more_env: [] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> 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] ) ] redirects: [] ) ] ) redirects: [] ) (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>}) ] )