Subject: Re: [PATCH 2/2] Fix failure to delete a packed ref through a symref

From: René Scharfe <[email-masked]>
Date: Sun, 21 Oct 2012 19:46:45 +0200

Am 21.10.2012 12:40, schrieb Johan Herland:
> When deleting a ref through a symref (e.g. using 'git update-ref -d HEAD'
> to delete refs/heads/master), we would remove the loose ref, but a packed
> version of the same ref would remain, the end result being that instead of
> deleting refs/heads/master we would appear to reset it to its state as of
> the last repack.
>
> This patch fixes the issue, by making sure we pass the correct ref name
> when invoking repack_without_ref() from within delete_ref().
>
> Signed-off-by: Johan Herland <[email-masked]>
> ---
>   refs.c                | 2 +-
>   t/t1400-update-ref.sh | 2 +-
>   2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/refs.c b/refs.c
> index 726c53c..6cec1c8 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -1779,7 +1779,7 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt)
>   	 * packed one.  Also, if it was not loose we need to repack
>   	 * without it.
>   	 */
> -	ret |= repack_without_ref(refname);
> +	ret |= repack_without_ref(lock->ref_name);
>
>   	unlink_or_warn(git_path("logs/%s", lock->ref_name));
>   	invalidate_ref_cache(NULL);

Looks reasonable.

FWIW, this is independent of 547d058f in next (refs: lock symref that is 
to be deleted, not its target), which only affects behaviour when 
REF_NODEREF is set, while this one here only makes a difference with 
symrefs and REF_NODEREF unset.

René