diff options
Diffstat (limited to 'sha1_name.c')
-rw-r--r-- | sha1_name.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/sha1_name.c b/sha1_name.c index 03ffc2caaa..5d81ea0564 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -856,10 +856,22 @@ int interpret_branch_name(const char *name, struct strbuf *buf) len = cp + tmp_len - name; cp = xstrndup(name, cp - name); upstream = branch_get(*cp ? cp : NULL); - if (!upstream - || !upstream->merge - || !upstream->merge[0]->dst) - return error("No upstream branch found for '%s'", cp); + /* + * Upstream can be NULL only if cp refers to HEAD and HEAD + * points to something different than a branch. + */ + if (!upstream) + return error(_("HEAD does not point to a branch")); + if (!upstream->merge || !upstream->merge[0]->dst) { + if (!ref_exists(upstream->refname)) + return error(_("No such branch: '%s'"), cp); + if (!upstream->merge) + return error(_("No upstream configured for branch '%s'"), + upstream->name); + return error( + _("Upstream branch '%s' not stored as a remote-tracking branch"), + upstream->merge[0]->src); + } free(cp); cp = shorten_unambiguous_ref(upstream->merge[0]->dst, 0); strbuf_reset(buf); @@ -1115,7 +1127,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1, if (new_filename) filename = new_filename; ret = get_tree_entry(tree_sha1, filename, sha1, &oc->mode); - if (only_to_die) { + if (ret && only_to_die) { diagnose_invalid_sha1_path(prefix, filename, tree_sha1, object_name); free(object_name); |