From 605fac8b5bd6d4a2ca817631e2c56ba2d0a1ed91 Mon Sep 17 00:00:00 2001 From: Nicolas Pitre Date: Wed, 21 Mar 2007 17:11:44 -0400 Subject: [PATCH] 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 --- refs.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/refs.c b/refs.c index 9f1fb68d04..f471152bfc 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);