Merge branch 'zj/upstream-error-message'
authorJunio C Hamano <gitster@pobox.com>
Tue, 24 Apr 2012 21:41:08 +0000 (14:41 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 24 Apr 2012 21:41:08 +0000 (14:41 -0700)
Error message given when @{u} is used for a branch without its
upstream configured have been clatified.

By Zbigniew Jędrzejewski-Szmek
* zj/upstream-error-message:
i18n: mark @{upstream} error messages for translation
Be more specific if upstream branch is not tracked
Provide better message for barnhc_wiht_tpyo@{u}
Provide branch name in error message when using @{u}
t1507: add tests to document @{upstream} behaviour

sha1_name.c
t/t1507-rev-parse-upstream.sh
index 03ffc2caaa6524a3361bc47a89e101ced2f0e987..c6331136d19c5224078fa78b6e5e794fcc587fe2 100644 (file)
@@ -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);
index a4555510c37276d36387d4c5c818503bb286dbd1..d6e576192fcd014ed5f570ceeab1152b93d91d1f 100755 (executable)
@@ -15,10 +15,18 @@ test_expect_success 'setup' '
        test_commit 3 &&
        (cd clone &&
         test_commit 4 &&
-        git branch --track my-side origin/side)
-
+        git branch --track my-side origin/side &&
+        git branch --track local-master master &&
+        git remote add -t master master-only .. &&
+        git fetch master-only &&
+        git branch bad-upstream &&
+        git config branch.bad-upstream.remote master-only &&
+        git config branch.bad-upstream.merge refs/heads/side
+       )
 '
 
+sq="'"
+
 full_name () {
        (cd clone &&
         git rev-parse --symbolic-full-name "$@")
@@ -29,6 +37,11 @@ commit_subject () {
         git show -s --pretty=format:%s "$@")
 }
 
+error_message () {
+       (cd clone &&
+        test_must_fail git rev-parse --verify "$@")
+}
+
 test_expect_success '@{upstream} resolves to correct full name' '
        test refs/remotes/origin/master = "$(full_name @{upstream})"
 '
@@ -78,7 +91,6 @@ test_expect_success 'checkout -b new my-side@{u} forks from the same' '
 
 test_expect_success 'merge my-side@{u} records the correct name' '
 (
-       sq="'\''" &&
        cd clone || exit
        git checkout master || exit
        git branch -D new ;# can fail but is ok
@@ -107,6 +119,69 @@ test_expect_success 'checkout other@{u}' '
        test_cmp expect actual
 '
 
+test_expect_success 'branch@{u} works when tracking a local branch' '
+       test refs/heads/master = "$(full_name local-master@{u})"
+'
+
+test_expect_success 'branch@{u} error message when no upstream' '
+       cat >expect <<-EOF &&
+       error: No upstream configured for branch ${sq}non-tracking${sq}
+       fatal: Needed a single revision
+       EOF
+       error_message non-tracking@{u} 2>actual &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success '@{u} error message when no upstream' '
+       cat >expect <<-EOF &&
+       error: No upstream configured for branch ${sq}master${sq}
+       fatal: Needed a single revision
+       EOF
+       test_must_fail git rev-parse --verify @{u} 2>actual &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success 'branch@{u} error message with misspelt branch' '
+       cat >expect <<-EOF &&
+       error: No such branch: ${sq}no-such-branch${sq}
+       fatal: Needed a single revision
+       EOF
+       error_message no-such-branch@{u} 2>actual &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success '@{u} error message when not on a branch' '
+       cat >expect <<-EOF &&
+       error: HEAD does not point to a branch
+       fatal: Needed a single revision
+       EOF
+       git checkout HEAD^0 &&
+       test_must_fail git rev-parse --verify @{u} 2>actual &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success 'branch@{u} error message if upstream branch not fetched' '
+       cat >expect <<-EOF &&
+       error: Upstream branch ${sq}refs/heads/side${sq} not stored as a remote-tracking branch
+       fatal: Needed a single revision
+       EOF
+       error_message bad-upstream@{u} 2>actual &&
+       test_i18ncmp expect actual
+'
+
+test_expect_success 'pull works when tracking a local branch' '
+(
+       cd clone &&
+       git checkout local-master &&
+       git pull
+)
+'
+
+# makes sense if the previous one succeeded
+test_expect_success '@{u} works when tracking a local branch' '
+       test refs/heads/master = "$(full_name @{u})"
+'
+
 cat >expect <<EOF
 commit 8f489d01d0cc65c3b0f09504ec50b5ed02a70bd5
 Reflog: master@{0} (C O Mitter <committer@example.com>)