(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <'Test merging of notes trees in multiple worktrees'>)} spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <'setup commit'>)} {(SQ <'\n'> <'\ttest_commit tantrum\n'>)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:commit_tantrum) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (C {(git)} {(rev-parse)} {(tantrum) (Lit_Other '^') (Lit_LBrace '{') (commit) (Lit_RBrace '}')} ) ] ) left_token: <Left_CommandSub '$('> spids: [37 47] ) } spids: [36] ) ] spids: [36] ) (C {(test_expect_success)} {(SQ <'setup notes ref (x)'>)} { (SQ <'\n'> <'\tgit config core.notesRef refs/notes/x &&\n'> <'\tgit notes add -m "x notes on tantrum" tantrum\n'> ) } ) (C {(test_expect_success)} {(SQ <'setup local branch (y)'>)} { (SQ <'\n'> <'\tgit update-ref refs/notes/y refs/notes/x &&\n'> <'\tgit config core.notesRef refs/notes/y &&\n'> <'\tgit notes remove tantrum\n'> ) } ) (C {(test_expect_success)} {(SQ <'setup remote branch (z)'>)} { (SQ <'\n'> <'\tgit update-ref refs/notes/z refs/notes/x &&\n'> <'\tgit config core.notesRef refs/notes/z &&\n'> <'\tgit notes add -f -m "conflicting notes on tantrum" tantrum\n'> ) } ) (C {(test_expect_success)} {(SQ <'modify notes ref ourselves (x)'>)} { (SQ <'\n'> <'\tgit config core.notesRef refs/notes/x &&\n'> <'\tgit notes add -f -m "more conflicting notes on tantrum" tantrum\n'> ) } ) (C {(test_expect_success)} {(SQ <'create some new worktrees'>)} { (SQ <'\n'> <'\tgit worktree add -b newbranch worktree master &&\n'> <'\tgit worktree add -b newbranch2 worktree2 master\n'> ) } ) (C {(test_expect_success)} {(SQ <'merge z into y fails and sets NOTES_MERGE_REF'>)} { (SQ <'\n'> <'\tgit config core.notesRef refs/notes/y &&\n'> <'\ttest_must_fail git notes merge z &&\n'> <'\techo "ref: refs/notes/y" >expect &&\n'> <'\ttest_cmp .git/NOTES_MERGE_REF expect\n'> ) } ) (C {(test_expect_success)} {(SQ <'merge z into y while mid-merge in another workdir fails'>)} { (SQ <'\n'> <'\t(\n'> <'\t\tcd worktree &&\n'> <'\t\tgit config core.notesRef refs/notes/y &&\n'> <'\t\ttest_must_fail git notes merge z 2>err &&\n'> <'\t\ttest_i18ngrep "a notes merge into refs/notes/y is already in-progress at" err\n'> <'\t) &&\n'> <'\ttest_path_is_missing .git/worktrees/worktree/NOTES_MERGE_REF\n'> ) } ) (C {(test_expect_success)} {(SQ <'merge z into x while mid-merge on y succeeds'>)} { (SQ <'\n'> <'\t(\n'> <'\t\tcd worktree2 &&\n'> <'\t\tgit config core.notesRef refs/notes/x &&\n'> <'\t\ttest_must_fail git notes merge z 2>&1 >out &&\n'> <'\t\ttest_i18ngrep "Automatic notes merge failed" out &&\n'> <'\t\tgrep -v "A notes merge into refs/notes/x is already in-progress in" out\n'> <'\t) &&\n'> <'\techo "ref: refs/notes/x" >expect &&\n'> <'\ttest_cmp .git/worktrees/worktree2/NOTES_MERGE_REF expect\n'> ) } ) (C {(test_done)}) ] )