From: Junio C Hamano Date: Tue, 10 Mar 2015 20:52:39 +0000 (-0700) Subject: Merge branch 'mh/expire-updateref-fixes' X-Git-Tag: v2.4.0-rc0~51 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/82b7e651990dce7016a903cb020e3dc0eba2ecfe Merge branch 'mh/expire-updateref-fixes' Various issues around "reflog expire", e.g. using --updateref when expiring a reflog for a symbolic reference, have been corrected and/or made saner. * mh/expire-updateref-fixes: reflog_expire(): never update a reference to null_sha1 reflog_expire(): ignore --updateref for symbolic references reflog: improve and update documentation struct ref_lock: delete the force_write member lock_ref_sha1_basic(): do not set force_write for missing references write_ref_sha1(): move write elision test to callers write_ref_sha1(): remove check for lock == NULL --- 82b7e651990dce7016a903cb020e3dc0eba2ecfe diff --cc refs.c index 8d46b08055,05a4be0c06..e23542b386 --- a/refs.c +++ b/refs.c @@@ -3848,11 -3783,21 +3832,22 @@@ int ref_transaction_commit(struct ref_t /* Perform updates first so live commits remain referenced */ for (i = 0; i < n; i++) { struct ref_update *update = updates[i]; + int flags = update->flags; - if (!is_null_sha1(update->new_sha1)) { + if ((flags & REF_HAVE_NEW) && !is_null_sha1(update->new_sha1)) { - if (write_ref_sha1(update->lock, update->new_sha1, - update->msg)) { + int overwriting_symref = ((update->type & REF_ISSYMREF) && + (update->flags & REF_NODEREF)); + + if (!overwriting_symref + && !hashcmp(update->lock->old_sha1, update->new_sha1)) { + /* + * The reference already has the desired + * value, so we don't need to write it. + */ + unlock_ref(update->lock); + update->lock = NULL; + } else if (write_ref_sha1(update->lock, update->new_sha1, + update->msg)) { update->lock = NULL; /* freed by write_ref_sha1 */ strbuf_addf(err, "Cannot update the ref '%s'.", update->refname);