Currently interpret_branch_name() tries to parse various things, and
finally falls back to parsing <branch>@{u[pstream]}.  It dies if the
input string contained an "@{u[pstream]}" but an upstream could not be
found.  The logic can be generalized to check for any branch property
after branch_get().  In preparation for introducing more special @{...}
forms, factor out die_no_upstream().

Signed-off-by: Ramkumar Ramachandra <artag...@gmail.com>
---
 sha1_name.c | 40 ++++++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 18 deletions(-)

diff --git a/sha1_name.c b/sha1_name.c
index 766e4e9..7aabd94 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -998,6 +998,24 @@ int get_sha1_mb(const char *name, unsigned char *sha1)
        return st;
 }
 
+static void die_no_upstream(struct branch *upstream, char *name) {
+       /*
+        * Upstream can be NULL only if cp refers to HEAD and HEAD
+        * points to something different than a branch.
+        */
+       if (!upstream)
+               die(_("HEAD does not point to a branch"));
+       if (!upstream->merge || !upstream->merge[0]->dst) {
+               if (!ref_exists(upstream->refname))
+                       die(_("No such branch: '%s'"), name);
+               if (!upstream->merge)
+                       die(_("No upstream configured for branch '%s'"),
+                               upstream->name);
+               die(_("Upstream branch '%s' not stored as a remote-tracking 
branch"),
+                       upstream->merge[0]->src);
+       }
+}
+
 /*
  * This reads short-hand syntax that not only evaluates to a commit
  * object name, but also can act as if the end user spelled the name
@@ -1022,7 +1040,7 @@ int get_sha1_mb(const char *name, unsigned char *sha1)
 int interpret_branch_name(const char *name, struct strbuf *buf)
 {
        char *cp;
-       struct branch *upstream;
+       struct branch *branch;
        int namelen = strlen(name);
        int len = interpret_nth_prior_checkout(name, buf);
        int tmp_len;
@@ -1059,24 +1077,10 @@ int interpret_branch_name(const char *name, struct 
strbuf *buf)
                return -1;
        len = cp + tmp_len - name;
        cp = xstrndup(name, cp - name);
-       upstream = branch_get(*cp ? cp : NULL);
-       /*
-        * Upstream can be NULL only if cp refers to HEAD and HEAD
-        * points to something different than a branch.
-        */
-       if (!upstream)
-               die(_("HEAD does not point to a branch"));
-       if (!upstream->merge || !upstream->merge[0]->dst) {
-               if (!ref_exists(upstream->refname))
-                       die(_("No such branch: '%s'"), cp);
-               if (!upstream->merge)
-                       die(_("No upstream configured for branch '%s'"),
-                               upstream->name);
-               die(_("Upstream branch '%s' not stored as a remote-tracking 
branch"),
-                       upstream->merge[0]->src);
-       }
+       branch = branch_get(*cp ? cp : NULL);
+       die_no_upstream(branch, cp);
        free(cp);
-       cp = shorten_unambiguous_ref(upstream->merge[0]->dst, 0);
+       cp = shorten_unambiguous_ref(branch->merge[0]->dst, 0);
        strbuf_reset(buf);
        strbuf_addstr(buf, cp);
        free(cp);
-- 
1.8.3.rc3.17.gd95ec6c.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to