From: Nicolas Pitre Date: Wed, 21 Mar 2007 21:11:44 +0000 (-0400) Subject: update HEAD reflog when branch pointed to by HEAD is directly modified X-Git-Tag: v1.5.1-rc2~31 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=605fac8b5bd6d4a2ca817631e2c56ba2d0a1ed91;p=git.git update HEAD reflog when branch pointed to by HEAD is directly modified The HEAD reflog is updated as well as the reflog for the branch pointed to by HEAD whenever it is referenced with "HEAD". There are some cases where a specific branch may be modified directly. In those cases, the HEAD reflog should be updated as well if it is a symref to that branch in order to be consistent. Signed-off-by: Nicolas Pitre Signed-off-by: Junio C Hamano --- diff --git a/refs.c b/refs.c index 9f1fb68d0..f471152bf 100644 --- a/refs.c +++ b/refs.c @@ -980,6 +980,27 @@ int write_ref_sha1(struct ref_lock *lock, unlock_ref(lock); return -1; } + if (strcmp(lock->orig_ref_name, "HEAD") != 0) { + /* + * Special hack: If a branch is updated directly and HEAD + * points to it (may happen on the remote side of a push + * for example) then logically the HEAD reflog should be + * updated too. + * A generic solution implies reverse symref information, + * but finding all symrefs pointing to the given branch + * would be rather costly for this rare event (the direct + * update of a branch) to be worth it. So let's cheat and + * check with HEAD only which should cover 99% of all usage + * scenarios (even 100% of the default ones). + */ + unsigned char head_sha1[20]; + int head_flag; + const char *head_ref; + head_ref = resolve_ref("HEAD", head_sha1, 1, &head_flag); + if (head_ref && (head_flag & REF_ISSYMREF) && + !strcmp(head_ref, lock->ref_name)) + log_ref_write("HEAD", lock->old_sha1, sha1, logmsg); + } if (commit_lock_file(lock->lk)) { error("Couldn't set %s", lock->ref_name); unlock_ref(lock);