lock_ref_sha1_basic(): do not set force_write for missing references

If a reference is missing, its SHA-1 will be null_sha1, which can't
possibly match a new value that ref_transaction_commit() is trying to
update it to. So there is no need to set force_write in this scenario.

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>
This commit is contained in:
Michael Haggerty 2015-03-02 10:29:53 +01:00 committed by Junio C Hamano
parent 706d5f816f
commit 074336e5ed

15
refs.c
View File

@ -2259,7 +2259,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
int type, lflags; int type, lflags;
int mustexist = (old_sha1 && !is_null_sha1(old_sha1)); int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
int resolve_flags = 0; int resolve_flags = 0;
int missing = 0;
int attempts_remaining = 3; int attempts_remaining = 3;
lock = xcalloc(1, sizeof(struct ref_lock)); lock = xcalloc(1, sizeof(struct ref_lock));
@ -2298,13 +2297,13 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
orig_refname, strerror(errno)); orig_refname, strerror(errno));
goto error_return; goto error_return;
} }
missing = is_null_sha1(lock->old_sha1); /*
/* When the ref did not exist and we are creating it, * If the ref did not exist and we are creating it, make sure
* make sure there is no existing ref that is packed * there is no existing packed ref whose name begins with our
* whose name begins with our refname, nor a ref whose * refname, nor a packed ref whose name is a proper prefix of
* name is a proper prefix of our refname. * our refname.
*/ */
if (missing && if (is_null_sha1(lock->old_sha1) &&
!is_refname_available(refname, skip, get_packed_refs(&ref_cache))) { !is_refname_available(refname, skip, get_packed_refs(&ref_cache))) {
last_errno = ENOTDIR; last_errno = ENOTDIR;
goto error_return; goto error_return;
@ -2320,8 +2319,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
lock->ref_name = xstrdup(refname); lock->ref_name = xstrdup(refname);
lock->orig_ref_name = xstrdup(orig_refname); lock->orig_ref_name = xstrdup(orig_refname);
ref_file = git_path("%s", refname); ref_file = git_path("%s", refname);
if (missing)
lock->force_write = 1;
if ((flags & REF_NODEREF) && (type & REF_ISSYMREF)) if ((flags & REF_NODEREF) && (type & REF_ISSYMREF))
lock->force_write = 1; lock->force_write = 1;