lstat_cache(): print a warning if doing ping-pong between cache types
[gitweb.git] / sha1_name.c
index f54b6cb36a0a67f6319d3ff56e92bbac55ecd639..5d0ac0263d04d7ec72a3b7dec4aaf47aec80da5e 100644 (file)
@@ -334,7 +334,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 
        /* basic@{time or number or -number} format to query ref-log */
        reflog_len = at = 0;
-       if (str[len-1] == '}') {
+       if (len && str[len-1] == '}') {
                for (at = len-2; at >= 0; at--) {
                        if (str[at] == '@' && str[at+1] == '{') {
                                reflog_len = (len-1) - (at+2);
@@ -723,17 +723,13 @@ static int grab_nth_branch_switch(unsigned char *osha1, unsigned char *nsha1,
 
        if (!prefixcmp(message, "checkout: moving from ")) {
                match = message + strlen("checkout: moving from ");
-               if ((target = strstr(match, " to ")) != NULL)
-                       target += 4;
+               target = strstr(match, " to ");
        }
 
        if (!match || !target)
                return 0;
 
-       len = target - match - 4;
-       if (target[len] == '\n' && !strncmp(match, target, len))
-               return 0;
-
+       len = target - match;
        nth = cb->cnt++ % cb->alloc;
        strbuf_reset(&cb->buf[nth]);
        strbuf_add(&cb->buf[nth], match, len);
@@ -754,7 +750,7 @@ static int grab_nth_branch_switch(unsigned char *osha1, unsigned char *nsha1,
 int interpret_nth_last_branch(const char *name, struct strbuf *buf)
 {
        long nth;
-       int i;
+       int i, retval;
        struct grab_nth_branch_switch_cbdata cb;
        const char *brace;
        char *num_end;
@@ -774,17 +770,27 @@ int interpret_nth_last_branch(const char *name, struct strbuf *buf)
        for (i = 0; i < nth; i++)
                strbuf_init(&cb.buf[i], 20);
        cb.cnt = 0;
-       for_each_reflog_ent("HEAD", grab_nth_branch_switch, &cb);
+       retval = 0;
+       for_each_recent_reflog_ent("HEAD", grab_nth_branch_switch, 40960, &cb);
+       if (cb.cnt < nth) {
+               cb.cnt = 0;
+               for (i = 0; i < nth; i++)
+                       strbuf_release(&cb.buf[i]);
+               for_each_reflog_ent("HEAD", grab_nth_branch_switch, &cb);
+       }
        if (cb.cnt < nth)
-               return 0;
+               goto release_return;
        i = cb.cnt % nth;
        strbuf_reset(buf);
        strbuf_add(buf, cb.buf[i].buf, cb.buf[i].len);
+       retval = brace-name+1;
+
+release_return:
        for (i = 0; i < nth; i++)
                strbuf_release(&cb.buf[i]);
        free(cb.buf);
 
-       return brace-name+1;
+       return retval;
 }
 
 /*