Skip to content

Commit

Permalink
builtin/merge.c: collect other parents early
Browse files Browse the repository at this point in the history
Move the code around to populate remoteheads list early in the process
before any decision regarding twohead vs octopus and fast-forwardness is
made.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Apr 18, 2012
1 parent 4c57bd2 commit b5d887f
Showing 1 changed file with 27 additions and 13 deletions.
40 changes: 27 additions & 13 deletions builtin/merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -1137,6 +1137,21 @@ static int default_edit_option(void)
st_stdin.st_mode == st_stdout.st_mode);
}

static struct commit_list *collect_parents(int argc, const char **argv)
{
int i;
struct commit_list *remoteheads = NULL;
struct commit_list **remotes = &remoteheads;

for (i = 0; i < argc; i++) {
struct commit *commit = get_merge_parent(argv[i]);
if (!commit)
die(_("%s - not something we can merge"), argv[i]);
remotes = &commit_list_insert(commit, remotes)->next;
}
*remotes = NULL;
return remoteheads;
}

int cmd_merge(int argc, const char **argv, const char *prefix)
{
Expand All @@ -1150,8 +1165,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
int best_cnt = -1, merge_was_ok = 0, automerge_was_ok = 0;
struct commit_list *common = NULL;
const char *best_strategy = NULL, *wt_strategy = NULL;
struct commit_list *remoteheads = NULL;
struct commit_list **remotes = &remoteheads;
struct commit_list *remoteheads, *p;
void *branch_to_free;

if (argc == 2 && !strcmp(argv[1], "-h"))
Expand Down Expand Up @@ -1256,6 +1270,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
head_arg = argv[1];
argv += 2;
argc -= 2;
remoteheads = collect_parents(argc, argv);
} else if (!head_commit) {
struct commit *remote_head;
/*
Expand All @@ -1271,7 +1286,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
if (!allow_fast_forward)
die(_("Non-fast-forward commit does not make sense into "
"an empty head"));
remote_head = get_merge_parent(argv[0]);
remoteheads = collect_parents(argc, argv);
remote_head = remoteheads->item;
if (!remote_head)
die(_("%s - not something we can merge"), argv[0]);
read_empty(remote_head->object.sha1, 0);
Expand All @@ -1289,8 +1305,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
* the standard merge summary message to be appended
* to the given message.
*/
for (i = 0; i < argc; i++)
merge_name(argv[i], &merge_names);
remoteheads = collect_parents(argc, argv);
for (p = remoteheads; p; p = p->next)
merge_name(merge_remote_util(p->item)->name, &merge_names);

if (!have_message || shortlog_len) {
struct fmt_merge_msg_opts opts;
Expand All @@ -1309,19 +1326,16 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
builtin_merge_options);

strbuf_addstr(&buf, "merge");
for (i = 0; i < argc; i++)
strbuf_addf(&buf, " %s", argv[i]);
for (p = remoteheads; p; p = p->next)
strbuf_addf(&buf, " %s", merge_remote_util(p->item)->name);
setenv("GIT_REFLOG_ACTION", buf.buf, 0);
strbuf_reset(&buf);

for (i = 0; i < argc; i++) {
struct commit *commit = get_merge_parent(argv[i]);
if (!commit)
die(_("%s - not something we can merge"), argv[i]);
remotes = &commit_list_insert(commit, remotes)->next;
for (p = remoteheads; p; p = p->next) {
struct commit *commit = p->item;
strbuf_addf(&buf, "GITHEAD_%s",
sha1_to_hex(commit->object.sha1));
setenv(buf.buf, argv[i], 1);
setenv(buf.buf, merge_remote_util(commit)->name, 1);
strbuf_reset(&buf);
if (!fast_forward_only &&
merge_remote_util(commit) &&
Expand Down

0 comments on commit b5d887f

Please sign in to comment.