Browse Source

receive-pack: explain what to do when push updates the current branch

This makes "git push" issue a more detailed instruction when a user pushes
into the current branch of a non-bare repository without having an
explicit configuration set to receive.denycurrentbranch.  In such a case,
it will also tell the user that the default will change to refusal in a
future version of git.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 16 years ago
parent
commit
3d95d92b9a
  1. 58
      builtin-receive-pack.c
  2. 6
      t/t5516-fetch-push.sh

58
builtin-receive-pack.c

@ -12,6 +12,7 @@
static const char receive_pack_usage[] = "git-receive-pack <git-dir>"; static const char receive_pack_usage[] = "git-receive-pack <git-dir>";


enum deny_action { enum deny_action {
DENY_UNCONFIGURED,
DENY_IGNORE, DENY_IGNORE,
DENY_WARN, DENY_WARN,
DENY_REFUSE, DENY_REFUSE,
@ -19,7 +20,7 @@ enum deny_action {


static int deny_deletes = 0; static int deny_deletes = 0;
static int deny_non_fast_forwards = 0; static int deny_non_fast_forwards = 0;
static enum deny_action deny_current_branch = DENY_WARN; static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
static int receive_fsck_objects; static int receive_fsck_objects;
static int receive_unpack_limit = -1; static int receive_unpack_limit = -1;
static int transfer_unpack_limit = -1; static int transfer_unpack_limit = -1;
@ -214,6 +215,35 @@ static int is_ref_checked_out(const char *ref)
return !strcmp(head, ref); return !strcmp(head, ref);
} }


static char *warn_unconfigured_deny_msg[] = {
"Updating the currently checked out branch may cause confusion,",
"as the index and work tree do not reflect changes that are in HEAD.",
"As a result, you may see the changes you just pushed into it",
"reverted when you run 'git diff' over there, and you may want",
"to run 'git reset --hard' before starting to work to recover.",
"",
"You can set 'receive.denyCurrentBranch' configuration variable to",
"'refuse' in the remote repository to forbid pushing into its",
"current branch."
"",
"To allow pushing into the current branch, you can set it to 'ignore';",
"but this is not recommended unless you arranged to update its work",
"tree to match what you pushed in some other way.",
"",
"To squelch this message, you can set it to 'warn'.",
"",
"Note that the default will change in a future version of git",
"to refuse updating the current branch unless you have the",
"configuration variable set to either 'ignore' or 'warn'."
};

static void warn_unconfigured_deny(void)
{
int i;
for (i = 0; i < ARRAY_SIZE(warn_unconfigured_deny_msg); i++)
warning(warn_unconfigured_deny_msg[i]);
}

static const char *update(struct command *cmd) static const char *update(struct command *cmd)
{ {
const char *name = cmd->ref_name; const char *name = cmd->ref_name;
@ -227,22 +257,20 @@ static const char *update(struct command *cmd)
return "funny refname"; return "funny refname";
} }


switch (deny_current_branch) { if (is_ref_checked_out(name)) {
case DENY_IGNORE: switch (deny_current_branch) {
break; case DENY_IGNORE:
case DENY_WARN:
if (!is_ref_checked_out(name))
break; break;
warning("updating the currently checked out branch; this may" case DENY_UNCONFIGURED:
" cause confusion,\n" case DENY_WARN:
"as the index and working tree do not reflect changes" warning("updating the current branch");
" that are now in HEAD."); if (deny_current_branch == DENY_UNCONFIGURED)
break; warn_unconfigured_deny();
case DENY_REFUSE:
if (!is_ref_checked_out(name))
break; break;
error("refusing to update checked out branch: %s", name); case DENY_REFUSE:
return "branch is currently checked out"; error("refusing to update checked out branch: %s", name);
return "branch is currently checked out";
}
} }


if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) { if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {

6
t/t5516-fetch-push.sh

@ -492,7 +492,7 @@ test_expect_success 'warn on push to HEAD of non-bare repository' '
git checkout master && git checkout master &&
git config receive.denyCurrentBranch warn) && git config receive.denyCurrentBranch warn) &&
git push testrepo master 2>stderr && git push testrepo master 2>stderr &&
grep "warning.*this may cause confusion" stderr grep "warning: updating the current branch" stderr
' '


test_expect_success 'deny push to HEAD of non-bare repository' ' test_expect_success 'deny push to HEAD of non-bare repository' '
@ -510,7 +510,7 @@ test_expect_success 'allow push to HEAD of bare repository (bare)' '
git config receive.denyCurrentBranch true && git config receive.denyCurrentBranch true &&
git config core.bare true) && git config core.bare true) &&
git push testrepo master 2>stderr && git push testrepo master 2>stderr &&
! grep "warning.*this may cause confusion" stderr ! grep "warning: updating the current branch" stderr
' '


test_expect_success 'allow push to HEAD of non-bare repository (config)' ' test_expect_success 'allow push to HEAD of non-bare repository (config)' '
@ -520,7 +520,7 @@ test_expect_success 'allow push to HEAD of non-bare repository (config)' '
git config receive.denyCurrentBranch false git config receive.denyCurrentBranch false
) && ) &&
git push testrepo master 2>stderr && git push testrepo master 2>stderr &&
! grep "warning.*this may cause confusion" stderr ! grep "warning: updating the current branch" stderr
' '


test_expect_success 'fetch with branches' ' test_expect_success 'fetch with branches' '

Loading…
Cancel
Save