reflog_expire(): never update a reference to null_sha1
commit423c688b855c328ecda0b6a79c4b1af78d09a10c
authorMichael Haggerty <mhagger@alum.mit.edu>
Tue, 3 Mar 2015 11:43:17 +0000 (3 12:43 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Mar 2015 20:35:37 +0000 (5 12:35 -0800)
tree3f39a7af751a345b76e4494c8c95d5fa796e9e6c
parent5e6f003ca8aed546d50a4f3fbf1e011186047bc0
reflog_expire(): never update a reference to null_sha1

Currently, if --updateref is specified and the very last reflog entry
is expired or deleted, the reference's value is set to 0{40}. This is
an invalid state of the repository, and breaks, for example, "git
fsck" and "git for-each-ref".

The only place we use --updateref in our own code is when dropping
stash entries. In that code, the very next step is to check if the
reflog has been made empty, and if so, delete the "refs/stash"
reference entirely. Thus that code path ultimately leaves the
repository in a valid state.

But we don't want to the repository in an invalid state even
temporarily, and we don't want to leave an invalid state if other
callers of "git reflog expire|delete --updateref" don't think to do
the extra cleanup step.

So, if "git reflog expire|delete" leaves no more entries in the
reflog, just leave the reference unchanged.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c