diff options
author | Johan Herland <johan@herland.net> | 2010-11-15 00:54:11 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-11-17 13:21:34 -0800 |
commit | 2085b16aefdbb1dc081aa40c62eb8110a222731d (patch) | |
tree | 449621162a4f8ba7d76b393d09b888c5564e7c9f /notes-merge.h | |
parent | 56881843d4d916a166ac4c6ba1803e5ceba9c44d (diff) | |
download | git-2085b16aefdbb1dc081aa40c62eb8110a222731d.tar.gz |
git notes merge: Handle real, non-conflicting notes merges
This continuation of the 'git notes merge' implementation teaches notes-merge
to properly do real merges between notes trees: Two diffs are performed, one
from $base to $remote, and another from $base to $local. The paths in each
diff are normalized to SHA1 object names. The two diffs are then consolidated
into a single list of change pairs to be evaluated. Each change pair consist
of:
- The annotated object's SHA1
- The $base SHA1 (i.e. the common ancestor notes for this object)
- The $local SHA1 (i.e. the current notes for this object)
- The $remote SHA1 (i.e. the to-be-merged notes for this object)
From the pair ($base -> $local, $base -> $remote), we can determine the merge
result using regular 3-way rules. If conflicts are encountered in this
process, we fail loudly and exit (conflict handling to be added in a future
patch), If we can complete the merge without conflicts, the resulting
notes tree is committed, and the current notes ref updated.
The patch includes added testcases verifying that we can successfully do real
conflict-less merges.
This patch has been improved by the following contributions:
- Jonathan Nieder: Future-proof by always checking add_note() return value
- Stephen Boyd: Use test_commit
- Jonathan Nieder: Use trace_printf(...) instead of OUTPUT(o, 5, ...)
- Junio C Hamano: fixup minor style issues
Thanks-to: Jonathan Nieder <jrnieder@gmail.com>
Thanks-to: Stephen Boyd <bebarino@gmail.com>
Thanks-to: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'notes-merge.h')
-rw-r--r-- | notes-merge.h | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/notes-merge.h b/notes-merge.h index 49e1b3a0f2..577cfb33cd 100644 --- a/notes-merge.h +++ b/notes-merge.h @@ -9,6 +9,7 @@ enum notes_merge_verbosity { struct notes_merge_options { const char *local_ref; const char *remote_ref; + const char *commit_msg; int verbosity; }; @@ -31,13 +32,20 @@ void create_notes_commit(struct notes_tree *t, struct commit_list *parents, /* * Merge notes from o->remote_ref into o->local_ref * + * The given notes_tree 'local_tree' must be the notes_tree referenced by the + * o->local_ref. This is the notes_tree in which the object-level merge is + * performed. + * * The commits given by the two refs are merged, producing one of the following * outcomes: * * 1. The merge trivially results in an existing commit (e.g. fast-forward or - * already-up-to-date). The SHA1 of the result is written into 'result_sha1' - * and 0 is returned. - * 2. The merge fails. result_sha1 is set to null_sha1, and non-zero returned. + * already-up-to-date). 'local_tree' is untouched, the SHA1 of the result + * is written into 'result_sha1' and 0 is returned. + * 2. The merge successfully completes, producing a merge commit. local_tree + * contains the updated notes tree, the SHA1 of the resulting commit is + * written into 'result_sha1', and 1 is returned. + * 3. The merge fails. result_sha1 is set to null_sha1, and -1 is returned. * * Both o->local_ref and o->remote_ref must be given (non-NULL), but either ref * (although not both) may refer to a non-existing notes ref, in which case @@ -45,6 +53,7 @@ void create_notes_commit(struct notes_tree *t, struct commit_list *parents, * trivially results in what the other ref points to. */ int notes_merge(struct notes_merge_options *o, + struct notes_tree *local_tree, unsigned char *result_sha1); #endif |