Code

reflog: handle $name => remotes/%s/HEAD mapping consistently for logs
authorJunio C Hamano <junkio@cox.net>
Fri, 9 Feb 2007 07:24:51 +0000 (23:24 -0800)
committerJunio C Hamano <junkio@cox.net>
Fri, 9 Feb 2007 07:24:51 +0000 (23:24 -0800)
When refs/remotes/gfi/master and refs/remotes/gfi/HEAD exist,
and the latter is a symref that points at the former, dwim_ref()
resolves string "gfi" to "refs/remotes/gfi/master" as expected,
but dwim_log() does not understand "gfi@{1.day}" and needs to be
told "gfi/master@{1.day}".  This is confusing.

Signed-off-by: Junio C Hamano <junkio@cox.net>
sha1_name.c

index f79a7c9fb84d5600544b64b9d9ecef2699804551..a7efa96f35c3a9aadf222f934c37515f00e68676 100644 (file)
@@ -275,16 +275,29 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
        *log = NULL;
        for (p = ref_fmt; *p; p++) {
                struct stat st;
-               char *path = mkpath(*p, len, str);
+               unsigned char hash[20];
+               char path[PATH_MAX];
+               const char *ref, *it;
+
+               strcpy(path, mkpath(*p, len, str));
+               ref = resolve_ref(path, hash, 0, NULL);
+               if (!ref)
+                       continue;
                if (!stat(git_path("logs/%s", path), &st) &&
-                   S_ISREG(st.st_mode)) {
-                       if (!logs_found++) {
-                               *log = xstrdup(path);
-                               resolve_ref(path, sha1, 0, NULL);
-                       }
-                       if (!warn_ambiguous_refs)
-                               break;
+                   S_ISREG(st.st_mode))
+                       it = path;
+               else if (strcmp(ref, path) &&
+                        !stat(git_path("logs/%s", ref), &st) &&
+                        S_ISREG(st.st_mode))
+                       it = ref;
+               else
+                       continue;
+               if (!logs_found++) {
+                       *log = xstrdup(it);
+                       hashcpy(sha1, hash);
                }
+               if (!warn_ambiguous_refs)
+                       break;
        }
        return logs_found;
 }