Fix failure to delete a packed ref through a symref
authorJohan Herland <johan@herland.net>
Sun, 21 Oct 2012 10:40:32 +0000 (12:40 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sun, 21 Oct 2012 19:08:42 +0000 (12:08 -0700)
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 <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
t/t1400-update-ref.sh

diff --git a/refs.c b/refs.c
index da74a2b29a20a2c94fef61641e35980007c1ab95..b4c57af998122f11a45823a92ffbe001975abaea 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1778,7 +1778,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);
index f7ec203cfb8dc1876f2259dfcd7d078e8896e26b..e415ee0bbf1dcf45f3ee771d0fefedb1c8fa4246 100755 (executable)
@@ -85,7 +85,7 @@ test_expect_success \
        "move $m (by HEAD)" \
        "git update-ref HEAD $B $A &&
         test $B"' = $(cat .git/'"$m"')'
-test_expect_failure "delete $m (by HEAD) should remove both packed and loose $m" '
+test_expect_success "delete $m (by HEAD) should remove both packed and loose $m" '
        git update-ref -d HEAD $B &&
        ! grep "$m" .git/packed-refs &&
        ! test -f .git/$m