path: root/notes-merge.h
diff options
authorJohan Herland <>2010-11-14 23:54:11 (GMT)
committerJunio C Hamano <>2010-11-17 21:21:34 (GMT)
commit2085b16aefdbb1dc081aa40c62eb8110a222731d (patch)
tree449621162a4f8ba7d76b393d09b888c5564e7c9f /notes-merge.h
parent56881843d4d916a166ac4c6ba1803e5ceba9c44d (diff)
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 <> Thanks-to: Stephen Boyd <> Thanks-to: Junio C Hamano <> Signed-off-by: Johan Herland <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'notes-merge.h')
1 files changed, 12 insertions, 3 deletions
diff --git a/notes-merge.h b/notes-merge.h
index 49e1b3a..577cfb3 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);