Skip to content

Commit

Permalink
notes: teach git-notes about notes.<name>.mergeStrategy option
Browse files Browse the repository at this point in the history
Teach notes about a new "notes.<name>.mergeStrategy" option for
configuring the notes merge strategy when merging into
refs/notes/<name>. This option allows for the selection of merge
strategy for particular notes refs, rather than all notes ref merges, as
user may not want cat_sort_uniq for all refs, but only some. Note that
the <name> is the local reference we are merging into, not the remote
ref we merged from. The assumption is that users will mostly want to
configure separate local ref merge strategies rather than strategies
depending on which remote ref they merge from.

notes.<name>.mergeStrategy overrides the general behavior as it is more
specific.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jacob Keller authored and Junio C Hamano committed Aug 17, 2015
1 parent d2d68d9 commit 4f655e2
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 1 deletion.
6 changes: 6 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1892,6 +1892,12 @@ notes.mergeStrategy::
`cat_sort_uniq`. Defaults to `manual`. See "NOTES MERGE STRATEGIES"
section of linkgit:git-notes[1] for more information on each strategy.

notes.<name>.mergeStrategy::
Which merge strategy to choose when doing a notes merge into
refs/notes/<name>. This overrides the more general
"notes.mergeStrategy". See the "NOTES MERGE STRATEGIES" section in
linkgit:git-notes[1] for more information on the available strategies.

notes.displayRef::
The (fully qualified) refname from which to show notes when
showing commit messages. The value of this variable can be set
Expand Down
6 changes: 6 additions & 0 deletions Documentation/git-notes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,12 @@ notes.mergeStrategy::
+
This setting can be overridden by passing the `--strategy` option.

notes.<name>.mergeStrategy::
Which merge strategy to choose when doing a notes merge into
refs/notes/<name>. This overrides the more general
"notes.mergeStrategy". See the "NOTES MERGE STRATEGIES" section above
for more information on each available strategy.

notes.displayRef::
Which ref (or refs, if a glob or specified more than once), in
addition to the default set by `core.notesRef` or
Expand Down
14 changes: 13 additions & 1 deletion builtin/notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -816,7 +816,19 @@ static int merge(int argc, const char **argv, const char *prefix)
usage_with_options(git_notes_merge_usage, options);
}
} else {
git_config_get_notes_strategy("notes.mergeStrategy", &o.strategy);
struct strbuf merge_key = STRBUF_INIT;
const char *short_ref = NULL;

if (!skip_prefix(o.local_ref, "refs/notes/", &short_ref))
die("BUG: local ref %s is outside of refs/notes/",
o.local_ref);

strbuf_addf(&merge_key, "notes.%s.mergeStrategy", short_ref);

if (git_config_get_notes_strategy(merge_key.buf, &o.strategy))
git_config_get_notes_strategy("notes.mergeStrategy", &o.strategy);

strbuf_release(&merge_key);
}

strbuf_addf(&msg, "notes: Merged notes from %s into %s",
Expand Down
39 changes: 39 additions & 0 deletions t/t3309-notes-merge-auto-resolve.sh
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,17 @@ test_expect_success 'reset to pre-merge state (y)' '
verify_notes y y
'

test_expect_success 'merge z into y with "ours" per-ref configuration option => Non-conflicting 3-way merge' '
git -c notes.y.mergeStrategy="ours" notes merge z &&
verify_notes y ours
'

test_expect_success 'reset to pre-merge state (y)' '
git update-ref refs/notes/y refs/notes/y^1 &&
# Verify pre-merge state
verify_notes y y
'

cat <<EOF | sort >expect_notes_theirs
9b4b2c61f0615412da3c10f98ff85b57c04ec765 $commit_sha15
5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14
Expand Down Expand Up @@ -534,6 +545,34 @@ test_expect_success 'reset to pre-merge state (y)' '
verify_notes y y
'

test_expect_success 'merge z into y with "union" strategy overriding per-ref configuration => Non-conflicting 3-way merge' '
git -c notes.y.mergeStrategy="theirs" notes merge --strategy=union z &&
verify_notes y union
'

test_expect_success 'reset to pre-merge state (y)' '
git update-ref refs/notes/y refs/notes/y^1 &&
# Verify pre-merge state
verify_notes y y
'

test_expect_success 'merge z into y with "union" per-ref overriding general configuration => Non-conflicting 3-way merge' '
git -c notes.y.mergeStrategy="union" -c notes.mergeStrategy="theirs" notes merge z &&
verify_notes y union
'

test_expect_success 'reset to pre-merge state (y)' '
git update-ref refs/notes/y refs/notes/y^1 &&
# Verify pre-merge state
verify_notes y y
'

test_expect_success 'merge z into y with "manual" per-ref only checks specific ref configuration => Conflicting 3-way merge' '
test_must_fail git -c notes.z.mergeStrategy="union" notes merge z &&
git notes merge --abort &&
verify_notes y y
'

cat <<EOF | sort >expect_notes_union2
d682107b8bf7a7aea1e537a8d5cb6a12b60135f1 $commit_sha15
5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14
Expand Down

0 comments on commit 4f655e2

Please sign in to comment.