2010-11-09 21:49:46 +00:00
|
|
|
#ifndef NOTES_MERGE_H
|
|
|
|
#define NOTES_MERGE_H
|
|
|
|
|
|
|
|
enum notes_merge_verbosity {
|
|
|
|
NOTES_MERGE_VERBOSITY_DEFAULT = 2,
|
|
|
|
NOTES_MERGE_VERBOSITY_MAX = 5
|
|
|
|
};
|
|
|
|
|
|
|
|
struct notes_merge_options {
|
|
|
|
const char *local_ref;
|
|
|
|
const char *remote_ref;
|
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>
2010-11-14 23:54:11 +00:00
|
|
|
const char *commit_msg;
|
2010-11-09 21:49:46 +00:00
|
|
|
int verbosity;
|
|
|
|
};
|
|
|
|
|
|
|
|
void init_notes_merge_options(struct notes_merge_options *o);
|
|
|
|
|
2010-11-09 21:49:47 +00:00
|
|
|
/*
|
|
|
|
* Create new notes commit from the given notes tree
|
|
|
|
*
|
|
|
|
* Properties of the created commit:
|
|
|
|
* - tree: the result of converting t to a tree object with write_notes_tree().
|
|
|
|
* - parents: the given parents OR (if NULL) the commit referenced by t->ref.
|
|
|
|
* - author/committer: the default determined by commmit_tree().
|
|
|
|
* - commit message: msg
|
|
|
|
*
|
|
|
|
* The resulting commit SHA1 is stored in result_sha1.
|
|
|
|
*/
|
|
|
|
void create_notes_commit(struct notes_tree *t, struct commit_list *parents,
|
|
|
|
const char *msg, unsigned char *result_sha1);
|
|
|
|
|
2010-11-09 21:49:46 +00:00
|
|
|
/*
|
|
|
|
* Merge notes from o->remote_ref into o->local_ref
|
|
|
|
*
|
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>
2010-11-14 23:54:11 +00:00
|
|
|
* 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.
|
|
|
|
*
|
2010-11-09 21:49:46 +00:00
|
|
|
* 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
|
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>
2010-11-14 23:54:11 +00:00
|
|
|
* 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.
|
2010-11-09 21:49:46 +00:00
|
|
|
*
|
|
|
|
* 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
|
|
|
|
* that notes ref is interpreted as an empty notes tree, and the merge
|
|
|
|
* trivially results in what the other ref points to.
|
|
|
|
*/
|
|
|
|
int notes_merge(struct notes_merge_options *o,
|
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>
2010-11-14 23:54:11 +00:00
|
|
|
struct notes_tree *local_tree,
|
2010-11-09 21:49:46 +00:00
|
|
|
unsigned char *result_sha1);
|
|
|
|
|
|
|
|
#endif
|