diff options
| author | Max Kirillov <max@max630.net> | 2014-09-03 19:14:10 +0300 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2014-09-03 10:47:44 -0700 | 
| commit | c40fdd01dd120c8c63da5e830ccdeb1518434bd6 (patch) | |
| tree | 8642e27025ab0d1775fe864cc48cda237227d970 | |
| parent | 96db324a73fdada6fbe7b63221986f8f18cc63b0 (diff) | |
| download | git-c40fdd01dd120c8c63da5e830ccdeb1518434bd6.tar.gz | |
reachable.c: add HEAD to reachability starting commitsmk/reachable-protect-detached-head
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.
Add tests which demonstrate it. Test 'prune: prune former HEAD after checking
out branch' also reverts changes to repository.
Signed-off-by: Max Kirillov <max@max630.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | reachable.c | 3 | ||||
| -rwxr-xr-x | t/t5304-prune.sh | 22 | 
2 files changed, 25 insertions, 0 deletions
| diff --git a/reachable.c b/reachable.c index 654a8c58d6..6f6835bf27 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); diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index 377d3d3899..01c6a3fc1d 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -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 && | 
