Merge branch 'jc/1.7.0-push-safety'
authorJunio C Hamano <gitster@pobox.com>
Sat, 26 Dec 2009 22:03:17 +0000 (14:03 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 26 Dec 2009 22:03:17 +0000 (14:03 -0800)
* jc/1.7.0-push-safety:
Refuse deleting the current branch via push
Refuse updating the current branch in a non-bare repository via push

builtin-receive-pack.c
t/t5400-send-pack.sh
t/t5401-update-hooks.sh
t/t5405-send-pack-rewind.sh
t/t5516-fetch-push.sh
t/t5517-push-mirror.sh
t/t5522-pull-symlink.sh
t/t5701-clone-local.sh
index 78c0e69cdc9fe2d21e83947932cb353c0553452e..4320c93e700a08911e42e3e949656af67b675244 100644 (file)
@@ -204,59 +204,47 @@ static int is_ref_checked_out(const char *ref)
        return !strcmp(head_name, 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.",
+static char *refuse_unconfigured_deny_msg[] = {
+       "By default, updating the current branch in a non-bare repository",
+       "is denied, because it will make the index and work tree inconsistent",
+       "with what you pushed, and will require 'git reset --hard' to match",
+       "the work tree to HEAD.",
        "",
        "You can set 'receive.denyCurrentBranch' configuration variable to",
-       "'refuse' in the remote repository to forbid pushing into its",
-       "current branch."
+       "'ignore' or 'warn' in the remote repository to allow pushing into",
+       "its current branch; however, this is not recommended unless you",
+       "arranged to update its work tree to match what you pushed in some",
+       "other way.",
        "",
-       "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'."
+       "To squelch this message and still keep the default behaviour, set",
+       "'receive.denyCurrentBranch' configuration variable to 'refuse'."
 };
 
-static void warn_unconfigured_deny(void)
+static void refuse_unconfigured_deny(void)
 {
        int i;
-       for (i = 0; i < ARRAY_SIZE(warn_unconfigured_deny_msg); i++)
-               warning("%s", warn_unconfigured_deny_msg[i]);
+       for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
+               error("%s", refuse_unconfigured_deny_msg[i]);
 }
 
-static char *warn_unconfigured_deny_delete_current_msg[] = {
-       "Deleting the current branch can cause confusion by making the next",
-       "'git clone' not check out any file.",
+static char *refuse_unconfigured_deny_delete_current_msg[] = {
+       "By default, deleting the current branch is denied, because the next",
+       "'git clone' won't result in any file checked out, causing confusion.",
        "",
        "You can set 'receive.denyDeleteCurrent' configuration variable to",
-       "'refuse' in the remote repository to disallow deleting the current",
-       "branch.",
-       "",
-       "You can set it to 'ignore' to allow such a delete without a warning.",
+       "'warn' or 'ignore' in the remote repository to allow deleting the",
+       "current branch, with or without a warning message.",
        "",
-       "To make this warning message less loud, you can set it to 'warn'.",
-       "",
-       "Note that the default will change in a future version of git",
-       "to refuse deleting the current branch unless you have the",
-       "configuration variable set to either 'ignore' or 'warn'."
+       "To squelch this message, you can set it to 'refuse'."
 };
 
-static void warn_unconfigured_deny_delete_current(void)
+static void refuse_unconfigured_deny_delete_current(void)
 {
        int i;
        for (i = 0;
-            i < ARRAY_SIZE(warn_unconfigured_deny_delete_current_msg);
+            i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
             i++)
-               warning("%s", warn_unconfigured_deny_delete_current_msg[i]);
+               error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
 }
 
 static const char *update(struct command *cmd)
@@ -276,14 +264,14 @@ static const char *update(struct command *cmd)
                switch (deny_current_branch) {
                case DENY_IGNORE:
                        break;
-               case DENY_UNCONFIGURED:
                case DENY_WARN:
                        warning("updating the current branch");
-                       if (deny_current_branch == DENY_UNCONFIGURED)
-                               warn_unconfigured_deny();
                        break;
                case DENY_REFUSE:
+               case DENY_UNCONFIGURED:
                        error("refusing to update checked out branch: %s", name);
+                       if (deny_current_branch == DENY_UNCONFIGURED)
+                               refuse_unconfigured_deny();
                        return "branch is currently checked out";
                }
        }
@@ -305,12 +293,12 @@ static const char *update(struct command *cmd)
                        case DENY_IGNORE:
                                break;
                        case DENY_WARN:
-                       case DENY_UNCONFIGURED:
-                               if (deny_delete_current == DENY_UNCONFIGURED)
-                                       warn_unconfigured_deny_delete_current();
                                warning("deleting the current branch");
                                break;
                        case DENY_REFUSE:
+                       case DENY_UNCONFIGURED:
+                               if (deny_delete_current == DENY_UNCONFIGURED)
+                                       refuse_unconfigured_deny_delete_current();
                                error("refusing to delete the current branch: %s", name);
                                return "deletion of the current branch prohibited";
                        }
index f2d5581b12f7d70c9f346da75dced81e12bd4c7f..c718253673ec8b3baf635c4dc0b05fe127c6f4cd 100755 (executable)
@@ -32,7 +32,7 @@ test_expect_success setup '
        done &&
        git update-ref HEAD "$commit" &&
        git clone ./. victim &&
-       ( cd victim && git log ) &&
+       ( cd victim && git config receive.denyCurrentBranch warn && git log ) &&
        git update-ref HEAD "$zero" &&
        parent=$zero &&
        i=0 &&
@@ -129,6 +129,7 @@ rewound_push_setup() {
            cd parent &&
            git init &&
            echo one >file && git add file && git commit -m one &&
+           git config receive.denyCurrentBranch warn &&
            echo two >file && git commit -a -m two
        ) &&
        git clone parent child &&
@@ -190,16 +191,11 @@ test_expect_success 'pushing wildcard refspecs respects forcing' '
        test "$parent_head" = "$child_head"
 '
 
-test_expect_success 'warn pushing to delete current branch' '
+test_expect_success 'deny pushing to delete current branch' '
        rewound_push_setup &&
        (
            cd child &&
-           git send-pack ../parent :refs/heads/master 2>errs
-       ) &&
-       grep "warning: to refuse deleting" child/errs &&
-       (
-               cd parent &&
-               test_must_fail git rev-parse --verify master
+           test_must_fail git send-pack ../parent :refs/heads/master 2>errs
        )
 '
 
index 64f66c94f36538b1c7d20045fc4233aa0b9d9a0d..325714e5299a5b59157c3741e7fa0d98d70b9990 100755 (executable)
@@ -18,6 +18,7 @@ test_expect_success setup '
        git update-ref refs/heads/master $commit0 &&
        git update-ref refs/heads/tofail $commit1 &&
        git clone ./. victim &&
+       GIT_DIR=victim/.git git config receive.denyCurrentBranch warn &&
        GIT_DIR=victim/.git git update-ref refs/heads/tofail $commit1 &&
        git update-ref refs/heads/master $commit1 &&
        git update-ref refs/heads/tofail $commit0
index cb9aacc7bc62e2ecfdca0dc7f6071e5330fe09d0..4bda18a662da5a0c36ee007c37d9ded6be3b1832 100755 (executable)
@@ -8,6 +8,7 @@ test_expect_success setup '
 
        >file1 && git add file1 && test_tick &&
        git commit -m Initial &&
+       git config receive.denyCurrentBranch warn &&
 
        mkdir another && (
                cd another &&
index 6889a53cf9bdea0aff88789f954ddf31d1eec010..516127b5390bafbd725564e91fb24ead224cf3a7 100755 (executable)
@@ -12,6 +12,7 @@ mk_empty () {
        (
                cd testrepo &&
                git init &&
+               git config receive.denyCurrentBranch warn &&
                mv .git/hooks .git/hooks-disabled
        )
 }
index ea49dedbf8867694d83cd550c8212ff107361920..e2ad2605084194868fc23e23fec1636af622b47f 100755 (executable)
@@ -19,7 +19,8 @@ mk_repo_pair () {
        mkdir mirror &&
        (
                cd mirror &&
-               git init
+               git init &&
+               git config receive.denyCurrentBranch warn
        ) &&
        mkdir master &&
        (
index 86bbd7d024ff6b1ee775ec737c550d54f9371ad7..7206817ca1c7a450b47f9a1d7d8a3af53452dac6 100755 (executable)
@@ -20,13 +20,19 @@ fi
 #
 # The working directory is subdir-link.
 
-mkdir subdir
-echo file >subdir/file
-git add subdir/file
-git commit -q -m file
-git clone -q . clone-repo
-ln -s clone-repo/subdir/ subdir-link
-
+test_expect_success setup '
+       mkdir subdir &&
+       echo file >subdir/file &&
+       git add subdir/file &&
+       git commit -q -m file &&
+       git clone -q . clone-repo &&
+       ln -s clone-repo/subdir/ subdir-link &&
+       (
+               cd clone-repo &&
+               git config receive.denyCurrentBranch warn
+       ) &&
+       git config receive.denyCurrentBranch warn
+'
 
 # Demonstrate that things work if we just avoid the symlink
 #
index 19b5c0d552fa8b4665b5e396833264e258365b28..8b4c356cd21846025d84a434077bfdc8ee2bab57 100755 (executable)
@@ -119,7 +119,9 @@ test_expect_success 'bundle clone with nonexistent HEAD' '
 test_expect_success 'clone empty repository' '
        cd "$D" &&
        mkdir empty &&
-       (cd empty && git init) &&
+       (cd empty &&
+        git init &&
+        git config receive.denyCurrentBranch warn) &&
        git clone empty empty-clone &&
        test_tick &&
        (cd empty-clone