diff options
author | Johan Herland <johan@herland.net> | 2010-11-09 22:49:54 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-11-17 13:22:49 -0800 |
commit | 6cfd6a9dea889707fa207ee2003010c3b56b2131 (patch) | |
tree | c0596682504898624057f102066fe4beddea3e5f /builtin/notes.c | |
parent | 443259cf929c0041310e3c77946252cbfc3f787d (diff) | |
download | git-6cfd6a9dea889707fa207ee2003010c3b56b2131.tar.gz |
git notes merge: --commit should fail if underlying notes ref has moved
When manually resolving a notes merge, if the merging ref has moved since
the merge started, we should fail to complete the merge, and alert the user
to what's going on.
This situation may arise if you start a 'git notes merge' which results in
conflicts, and you then update the current notes ref (using for example
'git notes add/copy/amend/edit/remove/prune', 'git update-ref', etc.),
before you get around to resolving the notes conflicts and calling
'git notes merge --commit'.
We detect this situation by comparing the first parent of the partial merge
commit (which was created when the merge started) to the current value of the
merging notes ref (pointed to by the .git/NOTES_MERGE_REF symref).
If we don't fail in this situation, the notes merge commit would overwrite
the updated notes ref, thus losing the changes that happened in the meantime.
The patch includes a testcase verifying that we fail correctly in this
situation.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/notes.c')
-rw-r--r-- | builtin/notes.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/builtin/notes.c b/builtin/notes.c index ee1df7030c..710a89da28 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -786,7 +786,7 @@ static int merge_abort(struct notes_merge_options *o) static int merge_commit(struct notes_merge_options *o) { struct strbuf msg = STRBUF_INIT; - unsigned char sha1[20]; + unsigned char sha1[20], parent_sha1[20]; struct notes_tree *t; struct commit *partial; struct pretty_print_context pretty_ctx; @@ -803,6 +803,11 @@ static int merge_commit(struct notes_merge_options *o) else if (parse_commit(partial)) die("Could not parse commit from NOTES_MERGE_PARTIAL."); + if (partial->parents) + hashcpy(parent_sha1, partial->parents->item->object.sha1); + else + hashclr(parent_sha1); + t = xcalloc(1, sizeof(struct notes_tree)); init_notes(t, "NOTES_MERGE_PARTIAL", combine_notes_overwrite, 0); @@ -818,7 +823,9 @@ static int merge_commit(struct notes_merge_options *o) format_commit_message(partial, "%s", &msg, &pretty_ctx); strbuf_trim(&msg); strbuf_insert(&msg, 0, "notes: ", 7); - update_ref(msg.buf, o->local_ref, sha1, NULL, 0, DIE_ON_ERR); + update_ref(msg.buf, o->local_ref, sha1, + is_null_sha1(parent_sha1) ? NULL : parent_sha1, + 0, DIE_ON_ERR); free_notes(t); strbuf_release(&msg); |