Merge branch 'rr/push-head'

"git push $there HEAD:branch" did not resolve HEAD early enough, so
it was easy to flip it around while push is still going on and push
out a branch that the user did not originally intended when the
command was started.

* rr/push-head:
  push: make push.default = current use resolved HEAD
  push: fail early with detached HEAD and current
  push: factor out the detached HEAD error message
This commit is contained in:
Junio C Hamano
2013-06-06 12:19:00 -07:00

View File

@ -113,17 +113,19 @@ static NORETURN int die_push_simple(struct branch *branch, struct remote *remote
remote->name, branch->name, advice_maybe); remote->name, branch->name, advice_maybe);
} }
static const char message_detached_head_die[] =
N_("You are not currently on a branch.\n"
"To push the history leading to the current (detached HEAD)\n"
"state now, use\n"
"\n"
" git push %s HEAD:<name-of-remote-branch>\n");
static void setup_push_upstream(struct remote *remote, int simple) static void setup_push_upstream(struct remote *remote, int simple)
{ {
struct strbuf refspec = STRBUF_INIT; struct strbuf refspec = STRBUF_INIT;
struct branch *branch = branch_get(NULL); struct branch *branch = branch_get(NULL);
if (!branch) if (!branch)
die(_("You are not currently on a branch.\n" die(_(message_detached_head_die), remote->name);
"To push the history leading to the current (detached HEAD)\n"
"state now, use\n"
"\n"
" git push %s HEAD:<name-of-remote-branch>\n"),
remote->name);
if (!branch->merge_nr || !branch->merge || !branch->remote_name) if (!branch->merge_nr || !branch->merge || !branch->remote_name)
die(_("The current branch %s has no upstream branch.\n" die(_("The current branch %s has no upstream branch.\n"
"To push the current branch and set the remote as upstream, use\n" "To push the current branch and set the remote as upstream, use\n"
@ -173,6 +175,8 @@ static void warn_unspecified_push_default_configuration(void)
static void setup_default_push_refspecs(struct remote *remote) static void setup_default_push_refspecs(struct remote *remote)
{ {
struct branch *branch;
switch (push_default) { switch (push_default) {
default: default:
case PUSH_DEFAULT_UNSPECIFIED: case PUSH_DEFAULT_UNSPECIFIED:
@ -192,7 +196,10 @@ static void setup_default_push_refspecs(struct remote *remote)
break; break;
case PUSH_DEFAULT_CURRENT: case PUSH_DEFAULT_CURRENT:
add_refspec("HEAD"); branch = branch_get(NULL);
if (!branch)
die(_(message_detached_head_die), remote->name);
add_refspec(branch->name);
break; break;
case PUSH_DEFAULT_NOTHING: case PUSH_DEFAULT_NOTHING: