(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 merging of notes trees in multiple worktrees'>)} spids: [13] ) ] redirects: [] ) (C {<.>} {<'./test-lib.sh'>}) (C {<test_expect_success>} {(SQ <'setup commit'>)} {(SQ <'\n'> <'\ttest_commit tantrum\n'>)}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'commit_tantrum='> name:commit_tantrum) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<git>} {<rev-parse>} {<tantrum> <Id.Lit_Other '^'> <Id.Lit_LBrace '{'> <commit> <Id.Lit_RBrace '}'>} ) right: <Id.Eof_RParen _> ) } spids: [36] ) ] redirects: [] ) (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>}) ] )