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