revert: refactor merge recursive code into its own function
The code that is used to do a recursive merge is extracted from the revert_or_cherry_pick() function and put into a new do_recursive_merge() function. Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
bc84a7fbac
commit
ae8c79fd8f
106
builtin/revert.c
106
builtin/revert.c
@ -279,18 +279,69 @@ static NORETURN void die_dirty_index(const char *me)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void do_recursive_merge(struct commit *base, struct commit *next,
|
||||||
|
const char *base_label, const char *next_label,
|
||||||
|
unsigned char *head, struct strbuf *msgbuf,
|
||||||
|
char *defmsg)
|
||||||
|
{
|
||||||
|
struct merge_options o;
|
||||||
|
struct tree *result, *next_tree, *base_tree, *head_tree;
|
||||||
|
int clean, index_fd;
|
||||||
|
static struct lock_file index_lock;
|
||||||
|
|
||||||
|
index_fd = hold_locked_index(&index_lock, 1);
|
||||||
|
|
||||||
|
read_cache();
|
||||||
|
init_merge_options(&o);
|
||||||
|
o.ancestor = base ? base_label : "(empty tree)";
|
||||||
|
o.branch1 = "HEAD";
|
||||||
|
o.branch2 = next ? next_label : "(empty tree)";
|
||||||
|
|
||||||
|
head_tree = parse_tree_indirect(head);
|
||||||
|
next_tree = next ? next->tree : empty_tree();
|
||||||
|
base_tree = base ? base->tree : empty_tree();
|
||||||
|
|
||||||
|
clean = merge_trees(&o,
|
||||||
|
head_tree,
|
||||||
|
next_tree, base_tree, &result);
|
||||||
|
|
||||||
|
if (active_cache_changed &&
|
||||||
|
(write_cache(index_fd, active_cache, active_nr) ||
|
||||||
|
commit_locked_index(&index_lock)))
|
||||||
|
die("%s: Unable to write new index file", me);
|
||||||
|
rollback_lock_file(&index_lock);
|
||||||
|
|
||||||
|
if (!clean) {
|
||||||
|
int i;
|
||||||
|
strbuf_addstr(msgbuf, "\nConflicts:\n\n");
|
||||||
|
for (i = 0; i < active_nr;) {
|
||||||
|
struct cache_entry *ce = active_cache[i++];
|
||||||
|
if (ce_stage(ce)) {
|
||||||
|
strbuf_addch(msgbuf, '\t');
|
||||||
|
strbuf_addstr(msgbuf, ce->name);
|
||||||
|
strbuf_addch(msgbuf, '\n');
|
||||||
|
while (i < active_nr && !strcmp(ce->name,
|
||||||
|
active_cache[i]->name))
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
write_message(msgbuf, defmsg);
|
||||||
|
fprintf(stderr, "Automatic %s failed.%s\n",
|
||||||
|
me, help_msg(commit_name));
|
||||||
|
rerere(allow_rerere_auto);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
write_message(msgbuf, defmsg);
|
||||||
|
fprintf(stderr, "Finished one %s.\n", me);
|
||||||
|
}
|
||||||
|
|
||||||
static int revert_or_cherry_pick(int argc, const char **argv)
|
static int revert_or_cherry_pick(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
unsigned char head[20];
|
unsigned char head[20];
|
||||||
struct commit *base, *next, *parent;
|
struct commit *base, *next, *parent;
|
||||||
const char *base_label, *next_label;
|
const char *base_label, *next_label;
|
||||||
int i, index_fd, clean;
|
|
||||||
struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
|
struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
|
||||||
|
|
||||||
char *defmsg = git_pathdup("MERGE_MSG");
|
char *defmsg = git_pathdup("MERGE_MSG");
|
||||||
struct merge_options o;
|
|
||||||
struct tree *result, *next_tree, *base_tree, *head_tree;
|
|
||||||
static struct lock_file index_lock;
|
|
||||||
struct strbuf msgbuf = STRBUF_INIT;
|
struct strbuf msgbuf = STRBUF_INIT;
|
||||||
|
|
||||||
git_config(git_default_config, NULL);
|
git_config(git_default_config, NULL);
|
||||||
@ -321,8 +372,6 @@ static int revert_or_cherry_pick(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
discard_cache();
|
discard_cache();
|
||||||
|
|
||||||
index_fd = hold_locked_index(&index_lock, 1);
|
|
||||||
|
|
||||||
if (!commit->parents) {
|
if (!commit->parents) {
|
||||||
if (action == REVERT)
|
if (action == REVERT)
|
||||||
die ("Cannot revert a root commit");
|
die ("Cannot revert a root commit");
|
||||||
@ -395,47 +444,8 @@ static int revert_or_cherry_pick(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
read_cache();
|
do_recursive_merge(base, next, base_label, next_label,
|
||||||
init_merge_options(&o);
|
head, &msgbuf, defmsg);
|
||||||
o.ancestor = base ? base_label : "(empty tree)";
|
|
||||||
o.branch1 = "HEAD";
|
|
||||||
o.branch2 = next ? next_label : "(empty tree)";
|
|
||||||
|
|
||||||
head_tree = parse_tree_indirect(head);
|
|
||||||
next_tree = next ? next->tree : empty_tree();
|
|
||||||
base_tree = base ? base->tree : empty_tree();
|
|
||||||
|
|
||||||
clean = merge_trees(&o,
|
|
||||||
head_tree,
|
|
||||||
next_tree, base_tree, &result);
|
|
||||||
|
|
||||||
if (active_cache_changed &&
|
|
||||||
(write_cache(index_fd, active_cache, active_nr) ||
|
|
||||||
commit_locked_index(&index_lock)))
|
|
||||||
die("%s: Unable to write new index file", me);
|
|
||||||
rollback_lock_file(&index_lock);
|
|
||||||
|
|
||||||
if (!clean) {
|
|
||||||
strbuf_addstr(&msgbuf, "\nConflicts:\n\n");
|
|
||||||
for (i = 0; i < active_nr;) {
|
|
||||||
struct cache_entry *ce = active_cache[i++];
|
|
||||||
if (ce_stage(ce)) {
|
|
||||||
strbuf_addch(&msgbuf, '\t');
|
|
||||||
strbuf_addstr(&msgbuf, ce->name);
|
|
||||||
strbuf_addch(&msgbuf, '\n');
|
|
||||||
while (i < active_nr && !strcmp(ce->name,
|
|
||||||
active_cache[i]->name))
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
write_message(&msgbuf, defmsg);
|
|
||||||
fprintf(stderr, "Automatic %s failed.%s\n",
|
|
||||||
me, help_msg(commit_name));
|
|
||||||
rerere(allow_rerere_auto);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
write_message(&msgbuf, defmsg);
|
|
||||||
fprintf(stderr, "Finished one %s.\n", me);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user