checkout --orphan: respect -l option always
authorErick Mattos <erick.mattos@gmail.com>
Sat, 22 May 2010 00:28:37 +0000 (21:28 -0300)
committerJunio C Hamano <gitster@pobox.com>
Thu, 3 Jun 2010 21:46:14 +0000 (14:46 -0700)
Added changes to satisfy a corner case: creating reflogs by using -l
when core.logAllRefUpdates is set to false.

Signed-off-by: Erick Mattos <erick.mattos@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/checkout.c
t/t2017-checkout-orphan.sh

index c3825219c1efbd4939af6d18bcad6efcfa74f406..9d618c21d214b60e71ad6e2986234f95d738db07 100644 (file)
@@ -493,7 +493,24 @@ static void update_refs_for_switch(struct checkout_opts *opts,
        struct strbuf msg = STRBUF_INIT;
        const char *old_desc;
        if (opts->new_branch) {
-               if (!opts->new_orphan_branch)
+               if (opts->new_orphan_branch) {
+                       if (opts->new_branch_log && !log_all_ref_updates) {
+                               int temp;
+                               char *log_file;
+                               char *ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch);
+
+                               temp = log_all_ref_updates;
+                               log_all_ref_updates = 1;
+                               if (log_ref_setup(ref_name, &log_file)) {
+                                       fprintf(stderr, "Can not do reflog for '%s'\n",
+                                           opts->new_orphan_branch);
+                                       log_all_ref_updates = temp;
+                                       return;
+                               }
+                               log_all_ref_updates = temp;
+                       }
+               }
+               else
                        create_branch(old->name, opts->new_branch, new->name, 0,
                                      opts->new_branch_log, opts->track);
                new->name = opts->new_branch;
@@ -517,6 +534,14 @@ static void update_refs_for_switch(struct checkout_opts *opts,
                                        opts->new_branch ? " a new" : "",
                                        new->name);
                }
+               if (old->path && old->name) {
+                       char log_file[PATH_MAX], ref_file[PATH_MAX];
+
+                       git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
+                       git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
+                       if (!file_exists(ref_file) && file_exists(log_file))
+                               remove_path(log_file);
+               }
        } else if (strcmp(new->name, "HEAD")) {
                update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
                           REF_NODEREF, DIE_ON_ERR);
@@ -684,8 +709,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
        if (opts.new_orphan_branch) {
                if (opts.new_branch)
                        die("--orphan and -b are mutually exclusive");
-               if (opts.track > 0 || opts.new_branch_log)
-                       die("--orphan cannot be used with -t or -l");
+               if (opts.track > 0)
+                       die("--orphan cannot be used with -t");
                opts.new_branch = opts.new_orphan_branch;
        }
 
index a8297c61bd7402423eec6af1ba92f46cd13dd1bd..be88d4b5ee86b75eb0e5654404064f712192d0a9 100755 (executable)
@@ -49,6 +49,62 @@ test_expect_success '--orphan must be rejected with -b' '
        test refs/heads/master = "$(git symbolic-ref HEAD)"
 '
 
+test_expect_success '--orphan must be rejected with -t' '
+       git checkout master &&
+       test_must_fail git checkout --orphan new -t master &&
+       test refs/heads/master = "$(git symbolic-ref HEAD)"
+'
+
+test_expect_success '--orphan ignores branch.autosetupmerge' '
+       git checkout master &&
+       git config branch.autosetupmerge always &&
+       git checkout --orphan gamma &&
+       test -z "$(git config branch.gamma.merge)" &&
+       test refs/heads/gamma = "$(git symbolic-ref HEAD)" &&
+       test_must_fail git rev-parse --verify HEAD^
+'
+
+test_expect_success '--orphan makes reflog by default' '
+       git checkout master &&
+       git config --unset core.logAllRefUpdates &&
+       git checkout --orphan delta &&
+       ! test -f .git/logs/refs/heads/delta &&
+       test_must_fail PAGER= git reflog show delta &&
+       git commit -m Delta &&
+       test -f .git/logs/refs/heads/delta &&
+       PAGER= git reflog show delta
+'
+
+test_expect_success '--orphan does not make reflog when core.logAllRefUpdates = false' '
+       git checkout master &&
+       git config core.logAllRefUpdates false &&
+       git checkout --orphan epsilon &&
+       ! test -f .git/logs/refs/heads/epsilon &&
+       test_must_fail PAGER= git reflog show epsilon &&
+       git commit -m Epsilon &&
+       ! test -f .git/logs/refs/heads/epsilon &&
+       test_must_fail PAGER= git reflog show epsilon
+'
+
+test_expect_success '--orphan with -l makes reflog when core.logAllRefUpdates = false' '
+       git checkout master &&
+       git checkout -l --orphan zeta &&
+       test -f .git/logs/refs/heads/zeta &&
+       test_must_fail PAGER= git reflog show zeta &&
+       git commit -m Zeta &&
+       PAGER= git reflog show zeta
+'
+
+test_expect_success 'giving up --orphan not committed when -l and core.logAllRefUpdates = false deletes reflog' '
+       git checkout master &&
+       git checkout -l --orphan eta &&
+       test -f .git/logs/refs/heads/eta &&
+       test_must_fail PAGER= git reflog show eta &&
+       git checkout master &&
+       ! test -f .git/logs/refs/heads/eta &&
+       test_must_fail PAGER= git reflog show eta
+'
+
 test_expect_success '--orphan is rejected with an existing name' '
        git checkout master &&
        test_must_fail git checkout --orphan master &&
@@ -60,31 +116,11 @@ test_expect_success '--orphan refuses to switch if a merge is needed' '
        git reset --hard &&
        echo local >>"$TEST_FILE" &&
        cat "$TEST_FILE" >"$TEST_FILE.saved" &&
-       test_must_fail git checkout --orphan gamma master^ &&
+       test_must_fail git checkout --orphan new master^ &&
        test refs/heads/master = "$(git symbolic-ref HEAD)" &&
        test_cmp "$TEST_FILE" "$TEST_FILE.saved" &&
        git diff-index --quiet --cached HEAD &&
        git reset --hard
 '
 
-test_expect_success '--orphan does not mix well with -t' '
-       git checkout master &&
-       test_must_fail git checkout -t master --orphan gamma &&
-       test refs/heads/master = "$(git symbolic-ref HEAD)"
-'
-
-test_expect_success '--orphan ignores branch.autosetupmerge' '
-       git checkout -f master &&
-       git config branch.autosetupmerge always &&
-       git checkout --orphan delta &&
-       test -z "$(git config branch.delta.merge)" &&
-       test refs/heads/delta = "$(git symbolic-ref HEAD)" &&
-       test_must_fail git rev-parse --verify HEAD^
-'
-
-test_expect_success '--orphan does not mix well with -l' '
-       git checkout -f master &&
-       test_must_fail git checkout -l --orphan gamma
-'
-
 test_done