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 <artagnon@xxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html