Skip to content

Commit 803090b

Browse files
committed
Merge branch 'zj/upstream-error-message'
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
2 parents c6cfa5b + 6472028 commit 803090b

File tree

2 files changed

+94
-7
lines changed

2 files changed

+94
-7
lines changed

sha1_name.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -856,10 +856,22 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
856856
len = cp + tmp_len - name;
857857
cp = xstrndup(name, cp - name);
858858
upstream = branch_get(*cp ? cp : NULL);
859-
if (!upstream
860-
|| !upstream->merge
861-
|| !upstream->merge[0]->dst)
862-
return error("No upstream branch found for '%s'", cp);
859+
/*
860+
* Upstream can be NULL only if cp refers to HEAD and HEAD
861+
* points to something different than a branch.
862+
*/
863+
if (!upstream)
864+
return error(_("HEAD does not point to a branch"));
865+
if (!upstream->merge || !upstream->merge[0]->dst) {
866+
if (!ref_exists(upstream->refname))
867+
return error(_("No such branch: '%s'"), cp);
868+
if (!upstream->merge)
869+
return error(_("No upstream configured for branch '%s'"),
870+
upstream->name);
871+
return error(
872+
_("Upstream branch '%s' not stored as a remote-tracking branch"),
873+
upstream->merge[0]->src);
874+
}
863875
free(cp);
864876
cp = shorten_unambiguous_ref(upstream->merge[0]->dst, 0);
865877
strbuf_reset(buf);

t/t1507-rev-parse-upstream.sh

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,18 @@ test_expect_success 'setup' '
1515
test_commit 3 &&
1616
(cd clone &&
1717
test_commit 4 &&
18-
git branch --track my-side origin/side)
19-
18+
git branch --track my-side origin/side &&
19+
git branch --track local-master master &&
20+
git remote add -t master master-only .. &&
21+
git fetch master-only &&
22+
git branch bad-upstream &&
23+
git config branch.bad-upstream.remote master-only &&
24+
git config branch.bad-upstream.merge refs/heads/side
25+
)
2026
'
2127

28+
sq="'"
29+
2230
full_name () {
2331
(cd clone &&
2432
git rev-parse --symbolic-full-name "$@")
@@ -29,6 +37,11 @@ commit_subject () {
2937
git show -s --pretty=format:%s "$@")
3038
}
3139

40+
error_message () {
41+
(cd clone &&
42+
test_must_fail git rev-parse --verify "$@")
43+
}
44+
3245
test_expect_success '@{upstream} resolves to correct full name' '
3346
test refs/remotes/origin/master = "$(full_name @{upstream})"
3447
'
@@ -78,7 +91,6 @@ test_expect_success 'checkout -b new my-side@{u} forks from the same' '
7891

7992
test_expect_success 'merge my-side@{u} records the correct name' '
8093
(
81-
sq="'\''" &&
8294
cd clone || exit
8395
git checkout master || exit
8496
git branch -D new ;# can fail but is ok
@@ -107,6 +119,69 @@ test_expect_success 'checkout other@{u}' '
107119
test_cmp expect actual
108120
'
109121

122+
test_expect_success 'branch@{u} works when tracking a local branch' '
123+
test refs/heads/master = "$(full_name local-master@{u})"
124+
'
125+
126+
test_expect_success 'branch@{u} error message when no upstream' '
127+
cat >expect <<-EOF &&
128+
error: No upstream configured for branch ${sq}non-tracking${sq}
129+
fatal: Needed a single revision
130+
EOF
131+
error_message non-tracking@{u} 2>actual &&
132+
test_i18ncmp expect actual
133+
'
134+
135+
test_expect_success '@{u} error message when no upstream' '
136+
cat >expect <<-EOF &&
137+
error: No upstream configured for branch ${sq}master${sq}
138+
fatal: Needed a single revision
139+
EOF
140+
test_must_fail git rev-parse --verify @{u} 2>actual &&
141+
test_i18ncmp expect actual
142+
'
143+
144+
test_expect_success 'branch@{u} error message with misspelt branch' '
145+
cat >expect <<-EOF &&
146+
error: No such branch: ${sq}no-such-branch${sq}
147+
fatal: Needed a single revision
148+
EOF
149+
error_message no-such-branch@{u} 2>actual &&
150+
test_i18ncmp expect actual
151+
'
152+
153+
test_expect_success '@{u} error message when not on a branch' '
154+
cat >expect <<-EOF &&
155+
error: HEAD does not point to a branch
156+
fatal: Needed a single revision
157+
EOF
158+
git checkout HEAD^0 &&
159+
test_must_fail git rev-parse --verify @{u} 2>actual &&
160+
test_i18ncmp expect actual
161+
'
162+
163+
test_expect_success 'branch@{u} error message if upstream branch not fetched' '
164+
cat >expect <<-EOF &&
165+
error: Upstream branch ${sq}refs/heads/side${sq} not stored as a remote-tracking branch
166+
fatal: Needed a single revision
167+
EOF
168+
error_message bad-upstream@{u} 2>actual &&
169+
test_i18ncmp expect actual
170+
'
171+
172+
test_expect_success 'pull works when tracking a local branch' '
173+
(
174+
cd clone &&
175+
git checkout local-master &&
176+
git pull
177+
)
178+
'
179+
180+
# makes sense if the previous one succeeded
181+
test_expect_success '@{u} works when tracking a local branch' '
182+
test refs/heads/master = "$(full_name @{u})"
183+
'
184+
110185
cat >expect <<EOF
111186
commit 8f489d01d0cc65c3b0f09504ec50b5ed02a70bd5
112187
Reflog: master@{0} (C O Mitter <[email protected]>)

0 commit comments

Comments
 (0)