Allow git merge ":/<pattern>"
authorJunio C Hamano <gitster@pobox.com>
Wed, 7 Sep 2011 18:16:03 +0000 (11:16 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 15 Sep 2011 23:52:43 +0000 (16:52 -0700)
It probably is not such a good idea to use ":/<pattern>" to specify which
commit to merge, as ":/<pattern>" can often hit unexpected commits, but
somebody tried it and got a nonsense error message:

fatal: ':/Foo bar' does not point to a commit

So here is a for-the-sake-of-consistency update that is fairly useless
that allows users to carefully try not shooting in the foot.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge.c
sha1_name.c

index 325891edb610945d01899b102993202af279bf3f..e2e981feda6f241623c4799881b27e4e21987525 100644 (file)
@@ -405,6 +405,16 @@ static void finish(const unsigned char *new_head, const char *msg)
        strbuf_release(&reflog_message);
 }
 
+static struct object *want_commit(const char *name)
+{
+       struct object *obj;
+       unsigned char sha1[20];
+       if (get_sha1(name, sha1))
+               return NULL;
+       obj = parse_object(sha1);
+       return peel_to_type(name, 0, obj, OBJ_COMMIT);
+}
+
 /* Get the name for the merge commit's message. */
 static void merge_name(const char *remote, struct strbuf *msg)
 {
@@ -420,7 +430,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
        remote = bname.buf;
 
        memset(branch_head, 0, sizeof(branch_head));
-       remote_head = peel_to_type(remote, 0, NULL, OBJ_COMMIT);
+       remote_head = want_commit(remote);
        if (!remote_head)
                die(_("'%s' does not point to a commit"), remote);
 
@@ -1130,7 +1140,7 @@ 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 = peel_to_type(argv[0], 0, NULL, OBJ_COMMIT);
+               remote_head = want_commit(argv[0]);
                if (!remote_head)
                        die(_("%s - not something we can merge"), argv[0]);
                read_empty(remote_head->sha1, 0);
@@ -1176,7 +1186,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                struct object *o;
                struct commit *commit;
 
-               o = peel_to_type(argv[i], 0, NULL, OBJ_COMMIT);
+               o = want_commit(argv[i]);
                if (!o)
                        die(_("%s - not something we can merge"), argv[i]);
                commit = lookup_commit(o->sha1);
@@ -1244,8 +1254,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                if (have_message)
                        strbuf_addstr(&msg,
                                " (no commit created; -m option ignored)");
-               o = peel_to_type(sha1_to_hex(remoteheads->item->object.sha1),
-                       0, NULL, OBJ_COMMIT);
+               o = want_commit(sha1_to_hex(remoteheads->item->object.sha1));
                if (!o)
                        return 1;
 
index ff5992acc971ac5a67fa3d4def1e0c064b90519f..653b0659be8416a220268ed2bc60694140c8d472 100644 (file)
@@ -501,12 +501,6 @@ struct object *peel_to_type(const char *name, int namelen,
 {
        if (name && !namelen)
                namelen = strlen(name);
-       if (!o) {
-               unsigned char sha1[20];
-               if (get_sha1_1(name, namelen, sha1))
-                       return NULL;
-               o = parse_object(sha1);
-       }
        while (1) {
                if (!o || (!o->parsed && !parse_object(o->sha1)))
                        return NULL;