(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'Test commit notes index (expensive!)' span_id:15))} spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: create_repo body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:number_of_commits) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [32] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:nr) op: assign_op.Equal rhs: {(0)} spids: [36] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test)} {(-d)} {(.git)}) (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (C {(git)} {(init)}) (command.Pipeline children: [ (command.Subshell command_list: (command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:61) cond: [ (C {(test)} {($ Id.VSub_DollarName '$nr')} {(-lt)} {($ Id.VSub_DollarName '$number_of_commits')} ) ] body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:nr) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$nr')} ) right: (arith_expr.ArithWord w: {(Id.Lit_Digits 1)} ) ) ) } spids: [75] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:mark) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$nr')} ) right: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$nr')} ) ) ) } spids: [84] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:notemark) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.ArithWord w: { ($ Id.VSub_DollarName '$mark') } ) right: (arith_expr.ArithWord w: {(Id.Lit_Digits 1)} ) ) ) } spids: [93] ) ] ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (C {(test_tick)}) (command.Simple words: [{(cat)}] redirects: [ (redir.HereDoc op: (Token id: Id.Redir_DLessDash val: '<<-' span_id: 109 ) fd: -1 here_begin: {(INPUT_END)} here_end_span_id: 149 stdin_parts: [ ('commit refs/heads/master\n') ('mark :') ($ Id.VSub_DollarName '$mark') ('\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 '$nr') ('\n') ('COMMIT\n') ('\n') ('M 644 inline file\n') ('data <<EOF\n') ('file in commit #') ($ Id.VSub_DollarName '$nr') ('\n') ('EOF\n') ('\n') ('blob\n') ('mark :') ($ Id.VSub_DollarName '$notemark') ('\n') ('data <<EOF\n') ('note for commit #') ($ Id.VSub_DollarName '$nr') ('\n') ('EOF\n') ('\n') ] ) ] ) (command.Simple words: [ {(echo)} { (DQ ('N :') ($ Id.VSub_DollarName '$notemark') (' :') ($ Id.VSub_DollarName '$mark') ) } ] redirects: [ (redir.Redir op: (Token id: Id.Redir_DGreat val: '>>' span_id: 160 ) fd: -1 arg_word: {(note_commit)} ) ] ) ] ) ] ) ) (C {(test_tick)}) (command.Simple words: [{(cat)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:176) fd: -1 here_begin: {(INPUT_END)} here_end_span_id: 194 stdin_parts: [ ('commit refs/notes/commits\n') ('committer ') ($ Id.VSub_DollarName '$GIT_COMMITTER_NAME') (' <') ($ Id.VSub_DollarName '$GIT_COMMITTER_EMAIL') ('> ') ($ Id.VSub_DollarName '$GIT_COMMITTER_DATE') ('\n') ('data <<COMMIT\n') ('notes\n') ('COMMIT\n') ('\n') ] ) ] ) (C {(cat)} {(note_commit)}) ] ) ] ) ) (C {(git)} {(fast-import)} {(--quiet)}) ] negated: F ) (C {(git)} {(config)} {(core.notesRef)} {(refs/notes/commits)}) ] ) ] ) ] ) ] ) ) (command.ShFunction name: test_notes body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:count) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [238] ) ] ) (C {(git)} {(config)} {(core.notesRef)} {(refs/notes/commits)}) (command.Pipeline children: [ (C {(git)} {(log)}) (command.Simple words: [{(grep)} {(DQ ('^ '))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:267) fd: -1 arg_word: {(output)} ) ] ) ] negated: F ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:i) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$count')} spids: [273] ) ] ) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:279) cond: [(C {(test)} {($ Id.VSub_DollarName '$i')} {(-gt)} {(0)})] body: (command.DoGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (C {(echo)} {(DQ (' commit #') ($ Id.VSub_DollarName '$i'))}) (C {(echo)} {(DQ (' note for commit #') ($ Id.VSub_DollarName '$i'))}) (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: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$i')} ) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) } spids: [313] ) ] ) ] ) ] ) redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:324) fd: -1 arg_word: {(expect)} ) ] ) (C {(test_cmp)} {(expect)} {(output)}) ] ) ] ) ) (command.Simple words: [{(write_script)} {(time_notes)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:343) fd: -1 here_begin: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:344)) (OF) } here_end_span_id: 363 stdin_parts: [ ('\tmode=$1\n') ('\ti=1\n') ('\twhile test $i -lt $2\n') ('\tdo\n') ('\t\tcase $1 in\n') ('\t\tno-notes)\n') ('\t\t\tGIT_NOTES_REF=non-existing\n') ('\t\t\texport GIT_NOTES_REF\n') ('\t\t\t;;\n') ('\t\tnotes)\n') ('\t\t\tunset GIT_NOTES_REF\n') ('\t\t\t;;\n') ('\t\tesac\n') ('\t\tgit log\n') ('\t\ti=$(($i+1))\n') ('\tdone >/dev/null\n') ] ) ] ) (command.ShFunction name: time_notes body: (command.BraceGroup children: [ (command.ForEach iter_name: mode iter_words: [{(no-notes)} {(notes)}] do_arg_iter: F body: (command.DoGroup children: [ (C {(echo)} {($ Id.VSub_DollarName '$mode')}) (C {(/usr/bin/time)} {(../time_notes)} {($ Id.VSub_DollarName '$mode')} {($ Id.VSub_Number '$1')} ) ] ) ) ] ) ) (command.ShFunction name: do_tests body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:count) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [414] ) (assign_pair lhs: (sh_lhs_expr.Name name:pr) op: assign_op.Equal rhs: { (braced_var_sub token: (Token id:Id.VSub_Number val:2 span_id:419) suffix_op: (suffix_op.Unary op_id:Id.VTest_Hyphen arg_word:{}) ) } spids: [417] ) ] ) (C {(test_expect_success)} {($ Id.VSub_DollarName '$pr')} {(DQ ('setup ') ($ Id.VSub_DollarName '$count'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:435) (Token id:Id.Lit_Chars val:'\t\tmkdir "$count" &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:437) (Token id:Id.Lit_Chars val:'\t\t\tcd "$count" &&\n' span_id:438) (Token id:Id.Lit_Chars val:'\t\t\tcreate_repo "$count"\n' span_id:439) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:440) (Token id:Id.Lit_Chars val:'\t' span_id:441) ) } ) (C {(test_expect_success)} {($ Id.VSub_DollarName '$pr')} {(SQ (Token id:Id.Lit_Chars val:'notes work' span_id:451))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:455) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:456) (Token id:Id.Lit_Chars val:'\t\t\tcd "$count" &&\n' span_id:457) (Token id: Id.Lit_Chars val: '\t\t\ttest_notes "$count"\n' span_id: 458 ) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:459) (Token id:Id.Lit_Chars val:'\t' span_id:460) ) } ) (C {(test_expect_success)} { (DQ (USR_BIN_TIME) (braced_var_sub token: (Token id:Id.VSub_Name val:pr span_id:470) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonPlus arg_word: {(',') ($ Id.VSub_DollarName '$pr')} ) ) ) } {(SQ (Token id:Id.Lit_Chars val:'notes timing with /usr/bin/time' span_id:478))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:482) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:483) (Token id:Id.Lit_Chars val:'\t\t\tcd "$count" &&\n' span_id:484) (Token id:Id.Lit_Chars val:'\t\t\ttime_notes 100\n' span_id:485) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:486) (Token id:Id.Lit_Chars val:'\t' span_id:487) ) } ) ] ) ) (C {(do_tests)} {(10)}) (command.ForEach iter_name: count iter_words: [{(100)} {(1000)} {(10000)}] do_arg_iter: F body: (command.DoGroup children: [(C {(do_tests)} {(DQ ($ Id.VSub_DollarName '$count'))} {(EXPENSIVE)})] ) ) (C {(test_done)}) ] )