Skip to content

Commit

Permalink
Merge branch 'jk/set-upstream-error-cases'
Browse files Browse the repository at this point in the history
The handing by "git branch --set-upstream-to" against various forms
of errorneous inputs were suboptimal.

* jk/set-upstream-error-cases:
  branch: give advice when tracking start-point is missing
  branch: mention start_name in set-upstream error messages
  branch: improve error message for missing --set-upstream-to ref
  branch: factor out "upstream is not a branch" error messages
  t3200: test --set-upstream-to with bogus refs
  • Loading branch information
Junio C Hamano committed Apr 7, 2013
2 parents 9a11f13 + caa2036 commit 88dccb6
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 3 deletions.
2 changes: 2 additions & 0 deletions advice.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ int advice_commit_before_merge = 1;
int advice_resolve_conflict = 1;
int advice_implicit_identity = 1;
int advice_detached_head = 1;
int advice_set_upstream_failure = 1;

static struct {
const char *name;
Expand All @@ -31,6 +32,7 @@ static struct {
{ "resolveconflict", &advice_resolve_conflict },
{ "implicitidentity", &advice_implicit_identity },
{ "detachedhead", &advice_detached_head },
{ "setupstreamfailure", &advice_set_upstream_failure },

/* make this an alias for backward compatibility */
{ "pushnonfastforward", &advice_push_update_rejected }
Expand Down
1 change: 1 addition & 0 deletions advice.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ extern int advice_commit_before_merge;
extern int advice_resolve_conflict;
extern int advice_implicit_identity;
extern int advice_detached_head;
extern int advice_set_upstream_failure;

int git_default_advice_config(const char *var, const char *value);
void advise(const char *advice, ...);
Expand Down
29 changes: 26 additions & 3 deletions branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,20 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
return 1;
}

static const char upstream_not_branch[] =
N_("Cannot setup tracking information; starting point '%s' is not a branch.");
static const char upstream_missing[] =
N_("the requested upstream branch '%s' does not exist");
static const char upstream_advice[] =
N_("\n"
"If you are planning on basing your work on an upstream\n"
"branch that already exists at the remote, you may need to\n"
"run \"git fetch\" to retrieve it.\n"
"\n"
"If you are planning to push out a new local branch that\n"
"will track its remote counterpart, you may want to use\n"
"\"git push -u\" to set the upstream config as you push.");

void create_branch(const char *head,
const char *name, const char *start_name,
int force, int reflog, int clobber_head,
Expand Down Expand Up @@ -224,21 +238,30 @@ void create_branch(const char *head,
}

real_ref = NULL;
if (get_sha1(start_name, sha1))
if (get_sha1(start_name, sha1)) {
if (explicit_tracking) {
if (advice_set_upstream_failure) {
error(_(upstream_missing), start_name);
advise(_(upstream_advice));
exit(1);
}
die(_(upstream_missing), start_name);
}
die("Not a valid object name: '%s'.", start_name);
}

switch (dwim_ref(start_name, strlen(start_name), sha1, &real_ref)) {
case 0:
/* Not branching from any existing branch */
if (explicit_tracking)
die("Cannot setup tracking information; starting point is not a branch.");
die(_(upstream_not_branch), start_name);
break;
case 1:
/* Unique completion -- good, only if it is a real branch */
if (prefixcmp(real_ref, "refs/heads/") &&
prefixcmp(real_ref, "refs/remotes/")) {
if (explicit_tracking)
die("Cannot setup tracking information; starting point is not a branch.");
die(_(upstream_not_branch), start_name);
else
real_ref = NULL;
}
Expand Down
12 changes: 12 additions & 0 deletions t/t3200-branch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,18 @@ test_expect_success '--set-upstream-to fails on detached HEAD' '
git checkout -
'

test_expect_success '--set-upstream-to fails on a missing dst branch' '
test_must_fail git branch --set-upstream-to master does-not-exist
'

test_expect_success '--set-upstream-to fails on a missing src branch' '
test_must_fail git branch --set-upstream-to does-not-exist master
'

test_expect_success '--set-upstream-to fails on a non-ref' '
test_must_fail git branch --set-upstream-to HEAD^{}
'

test_expect_success 'use --set-upstream-to modify HEAD' '
test_config branch.master.remote foo &&
test_config branch.master.merge foo &&
Expand Down

0 comments on commit 88dccb6

Please sign in to comment.