(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Test notes trees that also contain non-notes">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:number_of_commits) op:Equal rhs:{(100)} spids:[15])] spids: [15] ) (FuncDef name: start_note_commit body: (BraceGroup children: [ (AndOr children: [ (C {(test_tick)}) (SimpleCommand words: [{(cat)}] redirects: [ (HereDoc op_id: Redir_DLess fd: -1 body: { (DQ ("commit refs/notes/commits\n") ("committer ") ($ VSub_Name "$GIT_COMMITTER_NAME") (" <") ($ VSub_Name "$GIT_COMMITTER_EMAIL") ("> ") ($ VSub_Name "$GIT_COMMITTER_DATE") ("\n") ("data <<COMMIT\n") ("notes\n") ("COMMIT\n") ("\n") ("from refs/notes/commits^0\n") ("deleteall\n") ) } do_expansion: True here_end: INPUT_END was_filled: True spids: [34] ) ] ) ] op_id: Op_DAmp ) ] spids: [24] ) spids: [19 23] ) (FuncDef name: verify_notes body: (BraceGroup children: [ (AndOr children: [ (Pipeline children: [ (C {(git)} {(log)}) (SimpleCommand words: [{(grep)} {(DQ ("^ "))}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(output)} spids:[75])] ) ] negated: False ) (AndOr children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:i) op: Equal rhs: {($ VSub_Name "$number_of_commits")} spids: [82] ) ] spids: [82] ) (AndOr children: [ (While cond: [ (Sentence child: (C {(Lit_Other "[")} {($ VSub_Name "$i")} {(-gt)} {(0)} {(Lit_Other "]")}) terminator: <Op_Semi ";"> ) ] body: (DoGroup children: [ (Sentence child: (AndOr children: [ (C {(echo)} {(DQ (" commit #") ($ VSub_Name "$i"))}) (AndOr children: [ (C {(echo)} {(DQ (" note for commit #") ($ VSub_Name "$i"))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:i) op: Equal rhs: { (ArithSubPart anode: (ArithBinary op_id: Arith_Minus left: (ArithWord w:{($ VSub_Name "$i")}) right: (ArithWord w:{(Lit_Digits 1)}) ) spids: [125 130] ) } spids: [124] ) ] spids: [124] ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) terminator: <Op_Semi ";"> ) ] spids: [101 134] ) redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[136])] ) (C {(test_cmp)} {(expect)} {(output)}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [60] ) spids: [55 59] ) (C {(test_expect_success)} {(DQ ("setup: create a couple of commits"))} { (SQ <"\n"> <"\n"> <"\ttest_tick &&\n"> <"\tcat <<INPUT_END >input &&\n"> <"commit refs/heads/master\n"> <"committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"data <<COMMIT\n"> <"commit #1\n"> <"COMMIT\n"> <"\n"> <"M 644 inline file\n"> <"data <<EOF\n"> <"file in commit #1\n"> <"EOF\n"> <"\n"> <"INPUT_END\n"> <"\n"> <"\ttest_tick &&\n"> <"\tcat <<INPUT_END >>input &&\n"> <"commit refs/heads/master\n"> <"committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"data <<COMMIT\n"> <"commit #2\n"> <"COMMIT\n"> <"\n"> <"M 644 inline file\n"> <"data <<EOF\n"> <"file in commit #2\n"> <"EOF\n"> <"\n"> <"INPUT_END\n"> <"\tgit fast-import --quiet <input\n"> ) } ) (C {(test_expect_success)} {(DQ ("create a notes tree with both notes and non-notes"))} { (SQ <"\n"> <"\n"> <"\tcommit1=$(git rev-parse refs/heads/master^) &&\n"> <"\tcommit2=$(git rev-parse refs/heads/master) &&\n"> <"\ttest_tick &&\n"> <"\tcat <<INPUT_END >input &&\n"> <"commit refs/notes/commits\n"> <"committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"data <<COMMIT\n"> <"notes commit #1\n"> <"COMMIT\n"> <"\n"> <"N inline $commit1\n"> <"data <<EOF\n"> <"note for commit #1\n"> <"EOF\n"> <"\n"> <"N inline $commit2\n"> <"data <<EOF\n"> <"note for commit #2\n"> <"EOF\n"> <"\n"> <"INPUT_END\n"> <"\ttest_tick &&\n"> <"\tcat <<INPUT_END >>input &&\n"> <"commit refs/notes/commits\n"> <"committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"data <<COMMIT\n"> <"notes commit #2\n"> <"COMMIT\n"> <"\n"> <"M 644 inline foobar/non-note.txt\n"> <"data <<EOF\n"> <"A non-note in a notes tree\n"> <"EOF\n"> <"\n"> <"N inline $commit2\n"> <"data <<EOF\n"> <"edited note for commit #2\n"> <"EOF\n"> <"\n"> <"INPUT_END\n"> <"\ttest_tick &&\n"> <"\tcat <<INPUT_END >>input &&\n"> <"commit refs/notes/commits\n"> <"committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE\n"> <"data <<COMMIT\n"> <"notes commit #3\n"> <"COMMIT\n"> <"\n"> <"N inline $commit1\n"> <"data <<EOF\n"> <"edited note for commit #1\n"> <"EOF\n"> <"\n"> <"M 644 inline deadbeef\n"> <"data <<EOF\n"> <"non-note with SHA1-like name\n"> <"EOF\n"> <"\n"> <"M 644 inline de/adbeef\n"> <"data <<EOF\n"> <"another non-note with SHA1-like name\n"> <"EOF\n"> <"\n"> <"M 644 inline de/adbeefdeadbeefdeadbeefdeadbeefdeadbeef\n"> <"data <<EOF\n"> <"This is actually a valid note, albeit to a non-existing object.\n"> <"It is needed in order to trigger the \"mishandling\" of the dead/beef non-note.\n"> <"EOF\n"> <"\n"> <"M 644 inline dead/beef\n"> <"data <<EOF\n"> <"yet another non-note with SHA1-like name\n"> <"EOF\n"> <"\n"> <"INPUT_END\n"> <"\tgit fast-import --quiet <input &&\n"> <"\tgit config core.notesRef refs/notes/commits\n"> ) } ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[285]) (HereDoc op_id: Redir_DLess fd: -1 body: { (DQ (" commit #2\n") (" edited note for commit #2\n") (" commit #1\n") (" edited note for commit #1\n") ) } do_expansion: True here_end: EXPECT_END was_filled: True spids: [288] ) ] ) (C {(test_expect_success)} {(DQ ("verify contents of notes"))} { (SQ <"\n"> <"\n"> <"\tgit log | grep \"^ \" > actual &&\n"> <"\ttest_cmp expect actual\n">) } ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(expect_nn1)} spids:[312]) (HereDoc op_id: Redir_DLess fd: -1 body: {(DQ ("A non-note in a notes tree\n"))} do_expansion: True here_end: EXPECT_END was_filled: True spids: [315] ) ] ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(expect_nn2)} spids:[321]) (HereDoc op_id: Redir_DLess fd: -1 body: {(DQ ("non-note with SHA1-like name\n"))} do_expansion: True here_end: EXPECT_END was_filled: True spids: [324] ) ] ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(expect_nn3)} spids:[330]) (HereDoc op_id: Redir_DLess fd: -1 body: {(DQ ("another non-note with SHA1-like name\n"))} do_expansion: True here_end: EXPECT_END was_filled: True spids: [333] ) ] ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(expect_nn4)} spids:[339]) (HereDoc op_id: Redir_DLess fd: -1 body: {(DQ ("yet another non-note with SHA1-like name\n"))} do_expansion: True here_end: EXPECT_END was_filled: True spids: [342] ) ] ) (C {(test_expect_success)} {(DQ ("verify contents of non-notes"))} { (SQ <"\n"> <"\n"> <"\tgit cat-file -p refs/notes/commits:foobar/non-note.txt > actual_nn1 &&\n"> <"\ttest_cmp expect_nn1 actual_nn1 &&\n"> <"\tgit cat-file -p refs/notes/commits:deadbeef > actual_nn2 &&\n"> <"\ttest_cmp expect_nn2 actual_nn2 &&\n"> <"\tgit cat-file -p refs/notes/commits:de/adbeef > actual_nn3 &&\n"> <"\ttest_cmp expect_nn3 actual_nn3 &&\n"> <"\tgit cat-file -p refs/notes/commits:dead/beef > actual_nn4 &&\n"> <"\ttest_cmp expect_nn4 actual_nn4\n"> ) } ) (C {(test_expect_success)} {(DQ ("git-notes preserves non-notes"))} {(SQ <"\n"> <"\n"> <"\ttest_tick &&\n"> <"\tgit notes add -f -m \"foo bar\"\n">)} ) (C {(test_expect_success)} {(DQ ("verify contents of non-notes after git-notes"))} { (SQ <"\n"> <"\n"> <"\tgit cat-file -p refs/notes/commits:foobar/non-note.txt > actual_nn1 &&\n"> <"\ttest_cmp expect_nn1 actual_nn1 &&\n"> <"\tgit cat-file -p refs/notes/commits:deadbeef > actual_nn2 &&\n"> <"\ttest_cmp expect_nn2 actual_nn2 &&\n"> <"\tgit cat-file -p refs/notes/commits:de/adbeef > actual_nn3 &&\n"> <"\ttest_cmp expect_nn3 actual_nn3 &&\n"> <"\tgit cat-file -p refs/notes/commits:dead/beef > actual_nn4 &&\n"> <"\ttest_cmp expect_nn4 actual_nn4\n"> ) } ) (C {(test_done)}) ] )