fix parsing of @{-1}@{u} combination
authorJeff King <peff@peff.net>
Thu, 28 Jan 2010 09:52:22 +0000 (04:52 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 28 Jan 2010 20:12:42 +0000 (12:12 -0800)
Previously interpret_branch_name would see @{-1} and stop
parsing, leaving the @{u} as cruft that provoked an error.
Instead, we should recurse if there is more to parse.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_name.c
t/t1508-at-combinations.sh
index c7f1510ef102512f1270a064fbb7a842b1d9aed9..00fc4151780a4e66b70a78ac30d4798ad69b976e 100644 (file)
@@ -881,8 +881,28 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
 
        if (!len)
                return len; /* syntax Ok, not enough switches */
-       if (0 < len)
-               return len; /* consumed from the front */
+       if (0 < len && len == namelen)
+               return len; /* consumed all */
+       else if (0 < len) {
+               /* we have extra data, which might need further processing */
+               struct strbuf tmp = STRBUF_INIT;
+               int used = buf->len;
+               int ret;
+
+               strbuf_add(buf, name + len, namelen - len);
+               ret = interpret_branch_name(buf->buf, &tmp);
+               /* that data was not interpreted, remove our cruft */
+               if (ret < 0) {
+                       strbuf_setlen(buf, used);
+                       return len;
+               }
+               strbuf_reset(buf);
+               strbuf_addbuf(buf, &tmp);
+               strbuf_release(&tmp);
+               /* tweak for size of {-N} versus expanded ref name */
+               return ret - used + len;
+       }
+
        cp = strchr(name, '@');
        if (!cp)
                return -1;
index 59f04636f20e0f513cfcb5e4f1f867010856f3f5..2a46af24d6ae76dd057a88960a815c53b526d1b8 100755 (executable)
@@ -43,8 +43,8 @@ check "@{-1}" old-two
 check "@{-1}@{1}" old-one
 check "@{u}" upstream-two
 check "@{u}@{1}" upstream-one
-fail check "@{-1}@{u}" master-two
-fail check "@{-1}@{u}@{1}" master-one
+check "@{-1}@{u}" master-two
+check "@{-1}@{u}@{1}" master-one
 fail nonsense "@{u}@{-1}"
 nonsense "@{1}@{u}"