Merge branch 'jk/notes-merge-from-anywhere'
"git notes merge" used to limit the source of the merged notes tree to somewhere under refs/notes/ hierarchy, which was too limiting when inventing a workflow to exchange notes with remote repositories using remote-tracking notes trees (located in e.g. refs/remote-notes/ or somesuch). * jk/notes-merge-from-anywhere: notes: allow merging from arbitrary references
This commit is contained in:
commit
1cb3ed308d
@ -809,7 +809,7 @@ static int merge(int argc, const char **argv, const char *prefix)
|
||||
|
||||
o.local_ref = default_notes_ref();
|
||||
strbuf_addstr(&remote_ref, argv[0]);
|
||||
expand_notes_ref(&remote_ref);
|
||||
expand_loose_notes_ref(&remote_ref);
|
||||
o.remote_ref = remote_ref.buf;
|
||||
|
||||
t = init_notes_check("merge", NOTES_INIT_WRITABLE);
|
||||
|
10
notes.c
10
notes.c
@ -1306,3 +1306,13 @@ void expand_notes_ref(struct strbuf *sb)
|
||||
else
|
||||
strbuf_insert(sb, 0, "refs/notes/", 11);
|
||||
}
|
||||
|
||||
void expand_loose_notes_ref(struct strbuf *sb)
|
||||
{
|
||||
unsigned char object[20];
|
||||
|
||||
if (get_sha1(sb->buf, object)) {
|
||||
/* fallback to expand_notes_ref */
|
||||
expand_notes_ref(sb);
|
||||
}
|
||||
}
|
||||
|
7
notes.h
7
notes.h
@ -302,4 +302,11 @@ void string_list_add_refs_from_colon_sep(struct string_list *list,
|
||||
/* Expand inplace a note ref like "foo" or "notes/foo" into "refs/notes/foo" */
|
||||
void expand_notes_ref(struct strbuf *sb);
|
||||
|
||||
/*
|
||||
* Similar to expand_notes_ref, but will check whether the ref can be located
|
||||
* via get_sha1 first, and only falls back to expand_notes_ref in the case
|
||||
* where get_sha1 fails.
|
||||
*/
|
||||
void expand_loose_notes_ref(struct strbuf *sb);
|
||||
|
||||
#endif
|
||||
|
@ -18,7 +18,9 @@ test_expect_success setup '
|
||||
git notes add -m "Notes on 1st commit" 1st &&
|
||||
git notes add -m "Notes on 2nd commit" 2nd &&
|
||||
git notes add -m "Notes on 3rd commit" 3rd &&
|
||||
git notes add -m "Notes on 4th commit" 4th
|
||||
git notes add -m "Notes on 4th commit" 4th &&
|
||||
# Copy notes to remote-notes
|
||||
git fetch . refs/notes/*:refs/remote-notes/origin/*
|
||||
'
|
||||
|
||||
commit_sha1=$(git rev-parse 1st^{commit})
|
||||
@ -66,7 +68,9 @@ test_expect_success 'verify initial notes (x)' '
|
||||
'
|
||||
|
||||
cp expect_notes_x expect_notes_y
|
||||
cp expect_notes_x expect_notes_v
|
||||
cp expect_log_x expect_log_y
|
||||
cp expect_log_x expect_log_v
|
||||
|
||||
test_expect_success 'fail to merge empty notes ref into empty notes ref (z => y)' '
|
||||
test_must_fail git -c "core.notesRef=refs/notes/y" notes merge z
|
||||
@ -84,16 +88,12 @@ test_expect_success 'fail to merge into various non-notes refs' '
|
||||
test_must_fail git -c "core.notesRef=refs/notes/foo^{bar" notes merge x
|
||||
'
|
||||
|
||||
test_expect_success 'fail to merge various non-note-trees' '
|
||||
git config core.notesRef refs/notes/y &&
|
||||
test_must_fail git notes merge refs/notes &&
|
||||
test_must_fail git notes merge refs/notes/ &&
|
||||
test_must_fail git notes merge refs/notes/dir &&
|
||||
test_must_fail git notes merge refs/notes/dir/ &&
|
||||
test_must_fail git notes merge refs/heads/master &&
|
||||
test_must_fail git notes merge x: &&
|
||||
test_must_fail git notes merge x:foo &&
|
||||
test_must_fail git notes merge foo^{bar
|
||||
test_expect_success 'merge non-notes ref into empty notes ref (remote-notes/origin/x => v)' '
|
||||
git config core.notesRef refs/notes/v &&
|
||||
git notes merge refs/remote-notes/origin/x &&
|
||||
verify_notes v &&
|
||||
# refs/remote-notes/origin/x and v should point to the same notes commit
|
||||
test "$(git rev-parse refs/remote-notes/origin/x)" = "$(git rev-parse refs/notes/v)"
|
||||
'
|
||||
|
||||
test_expect_success 'merge notes into empty notes ref (x => y)' '
|
||||
|
Loading…
Reference in New Issue
Block a user