Merge branch 'mk/reachable-protect-detached-head' into maint
authorJunio C Hamano <gitster@pobox.com>
Tue, 30 Sep 2014 05:10:04 +0000 (22:10 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 30 Sep 2014 05:10:04 +0000 (22:10 -0700)
Reachability check (used in "git prune" and friends) did not add a
detached HEAD as a starting point to traverse objects still in use.

* mk/reachable-protect-detached-head:
reachable.c: add HEAD to reachability starting commits

reachable.c
t/t5304-prune.sh
index 654a8c58d689daf43f2ba4c40e4fe54d31c7826a..6f6835bf27481299a0374bc1c7746bad750cdd12 100644 (file)
@@ -229,6 +229,9 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
        /* Add all external refs */
        for_each_ref(add_one_ref, revs);
 
+       /* detached HEAD is not included in the list above */
+       head_ref(add_one_ref, revs);
+
        /* Add all reflog info */
        if (mark_reflog)
                for_each_reflog(add_one_reflog, revs);
index 377d3d3899737fec47f34f0db28ac876eb146af8..01c6a3fc1dc3ef028cfdaad749e9e68955f00226 100755 (executable)
@@ -104,6 +104,28 @@ test_expect_success 'prune: prune unreachable heads' '
 
 '
 
+test_expect_success 'prune: do not prune detached HEAD with no reflog' '
+
+       git checkout --detach --quiet &&
+       git commit --allow-empty -m "detached commit" &&
+       # verify that there is no reflogs
+       # (should be removed and disabled by previous test)
+       test ! -e .git/logs &&
+       git prune -n >prune_actual &&
+       : >prune_expected &&
+       test_cmp prune_actual prune_expected
+
+'
+
+test_expect_success 'prune: prune former HEAD after checking out branch' '
+
+       head_sha1=$(git rev-parse HEAD) &&
+       git checkout --quiet master &&
+       git prune -v >prune_actual &&
+       grep "$head_sha1" prune_actual
+
+'
+
 test_expect_success 'prune: do not prune heads listed as an argument' '
 
        : > file2 &&