Re: [PATCH] Allow multiple merges to invalid HEAD
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:50:58
Timothy Chen [off-list ref] writes:
This patch will allow multiple branches to be passed in, and first updates current HEAD to the first branch's head then subsequently merge the rest of the branches.
I've questioned the motivation of the patch already, but let's comment on the mechanics as well while I am waiting for some builds to finish ;-)
quoted hunk
diff --git a/builtin/merge.c b/builtin/merge.c index d54e7dd..290e0d4 100644 --- a/builtin/merge.c +++ b/builtin/merge.c@@ -1090,9 +1090,6 @@ int cmd_merge(int argc, const char **argv, const char *prefix) * to forbid "git merge" into a branch yet to be born. * We do the same for "git pull". */ if (squash) die(_("Squash commit into empty head not supported yet")); if (!allow_fast_forward)@@ -1101,36 +1098,44 @@ int cmd_merge(int argc, const char **argv, const char *prefix) remote_head = peel_to_type(argv[0], 0, NULL, OBJ_COMMIT); if (!remote_head) die(_("%s - not something we can merge"), argv[0]); update_ref("initial pull", "HEAD", remote_head->sha1, NULL, 0, DIE_ON_ERR);
You are going to perform a series of operations that is a lot more complex than what we traditionally have done at this point. I do not think it is safe at all to update the ref this early before even knowing if the rest of the command succeeds.
+ if (argc < 2) + return 0; + + hashcpy(head, remote_head->sha1); + read_empty(remote_head->sha1, 0); + head_arg = argv[0]; + argc--; + argv++; + } + + struct strbuf merge_names = STRBUF_INIT;
Decl-after-statement.
+ /* We are invoked directly as the first-class UI. */ + if(!head_invalid)
SP after syntactic keyword and the open paren associated with it.
head_arg = "HEAD";
+ /*
+ * All the rest are the commits being merged;
+ * prepare the standard merge summary message to
+ * be appended to the given message. If remote
+ * is invalid we will die later in the common
+ * codepath so we discard the error in this
+ * loop.
+ */
+ for (i = 0; i < argc; i++)
+ merge_name(argv[i], &merge_names);
+
+ if (!have_message || shortlog_len) {
+ fmt_merge_msg(&merge_names, &merge_msg, !have_message,
+ shortlog_len);
+ if (merge_msg.len)
+ strbuf_setlen(&merge_msg, merge_msg.len - 1);
}
+ if (!argc)
usage_with_options(builtin_merge_usage,
builtin_merge_options);