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.

> 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.

> 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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to