checkout: do not corrupt HEAD on empty repo
authorErik Faye-Lund <kusmabite@gmail.com>
Tue, 8 May 2012 17:22:33 +0000 (19:22 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 May 2012 17:36:55 +0000 (10:36 -0700)
In abe1998 ("git checkout -b: allow switching out of an unborn
branch"), a code-path overly-optimisticly assumed that a
branch-name was specified. This is not always the case, and as
a result a NULL-pointer was attempted printed to .git/HEAD.

This could lead to at least two different failure modes:
 1) vsnprintf formated the NULL-string as something useful (e.g
    "(null)")
 2) vsnprintf crashed

Neither were very convenient for formatting a new HEAD-reference.

To fix this, reintroduce some strictness so we only take this
new codepath if a banch-name was specified.

Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/checkout.c
t/t2015-checkout-unborn.sh

index b76e2c0451cbeb73e1fd227c343413b1c8a33cc7..44ecc22e522836ddc28e920df0e4cad9b88750e9 100644 (file)
@@ -1100,7 +1100,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
        if (opts.writeout_stage)
                die(_("--ours/--theirs is incompatible with switching branches."));
 
-       if (!new.commit) {
+       if (!new.commit && opts.new_branch) {
                unsigned char rev[20];
                int flag;
 
index 6352b74e2e54e5e08941d8d5d90ac30b202b56c1..37bdcedcc952083ba336cb9eaca5c67424d2cbb6 100755 (executable)
@@ -46,4 +46,15 @@ test_expect_success 'checking out another branch from unborn state' '
        test_cmp expect actual
 '
 
+test_expect_success 'checking out in a newly created repo' '
+       test_create_repo empty &&
+       (
+               cd empty &&
+               git symbolic-ref HEAD >expect &&
+               test_must_fail git checkout &&
+               git symbolic-ref HEAD >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_done