t/README: justify why "! grep foo" is sufficient
[gitweb.git] / sha1_name.c
index afdff2f1d55414858624fdf7e6cbe758f3b00c82..15854e35eced2c8b0c3e796aedcfbe553c6ac38f 100644 (file)
@@ -1095,6 +1095,9 @@ static int interpret_upstream_mark(const char *name, int namelen,
        if (!len)
                return -1;
 
+       if (memchr(name, ':', at))
+               return -1;
+
        set_shortened_ref(buf, get_upstream_branch(name, at));
        return len + at;
 }
@@ -1123,6 +1126,7 @@ static int interpret_upstream_mark(const char *name, int namelen,
 int interpret_branch_name(const char *name, int namelen, struct strbuf *buf)
 {
        char *at;
+       const char *start;
        int len = interpret_nth_prior_checkout(name, namelen, buf);
 
        if (!namelen)
@@ -1137,17 +1141,18 @@ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf)
                        return reinterpret(name, namelen, len, buf);
        }
 
-       at = memchr(name, '@', namelen);
-       if (!at)
-               return -1;
+       for (start = name;
+            (at = memchr(start, '@', namelen - (start - name)));
+            start = at + 1) {
 
-       len = interpret_empty_at(name, namelen, at - name, buf);
-       if (len > 0)
-               return reinterpret(name, namelen, len, buf);
+               len = interpret_empty_at(name, namelen, at - name, buf);
+               if (len > 0)
+                       return reinterpret(name, namelen, len, buf);
 
-       len = interpret_upstream_mark(name, namelen, at - name, buf);
-       if (len > 0)
-               return len;
+               len = interpret_upstream_mark(name, namelen, at - name, buf);
+               if (len > 0)
+                       return len;
+       }
 
        return -1;
 }