Re: [PATCH] reachable.c: add HEAD to reachability starting commits
From: Jeff King <hidden>
Date: 2016-06-15 23:02:24
On Sat, Aug 30, 2014 at 11:58:35PM +0300, Max Kirillov wrote:
HEAD is not explicitly used as a starting commit for calculating reachability, so if it's detached and reflogs are disabled it may be pruned.
Eek, you're right. I think nobody noticed because the HEAD reflog usually picks it up (and you do not usually detach HEAD on a bare repo). But I agree we should include it to cover this case.
quoted hunk ↗ jump to hunk
diff --git a/reachable.c b/reachable.c index 654a8c5..6f6835b 100644 --- a/reachable.c +++ b/reachable.c@@ -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);
Looks obviously correct.
quoted hunk ↗ jump to hunk
diff --git a/t/t5312-prune-detached.sh b/t/t5312-prune-detached.sh new file mode 100755 index 0000000..fac93e1 --- /dev/null +++ b/t/t5312-prune-detached.sh@@ -0,0 +1,19 @@ +#!/bin/sh + +test_description='no prune detached head without reflog' +. ./test-lib.sh + +test_expect_success 'make repo' ' + git config core.logAllRefUpdates false + git commit --allow-empty -m commit1 && + git commit --allow-empty -m commit2 && + git checkout --detach master && + git commit --allow-empty -m commit3 +' + +test_expect_success 'prune does not delete anything' ' + git prune -n >prune_actual && + : >prune_expected && + test_cmp prune_expected prune_actual' + +test_done
Your test looks reasonable, but is there any reason it cannot go in t5304 with the other prune tests? -Peff