aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2007-03-21 17:11:44 -0400
committerJunio C Hamano <junkio@cox.net>2007-03-22 03:02:48 -0700
commit605fac8b5bd6d4a2ca817631e2c56ba2d0a1ed91 (patch)
treec543dc4c0bc26d6e446839d811588ffe3bffd7da
parent0a0d080bdc68d2bd4a1824b08123690c8065badb (diff)
downloadgit-605fac8b5bd6d4a2ca817631e2c56ba2d0a1ed91.tar.gz
git-605fac8b5bd6d4a2ca817631e2c56ba2d0a1ed91.tar.xz
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 <nico@cam.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--refs.c21
1 files changed, 21 insertions, 0 deletions
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);