Now that all building blocks have been refactored, we can implement for_each_reflog_ent in terms of them, so that it uses mmap. Signed-off-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- refs.c | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-) diff --git a/refs.c b/refs.c index 0a57896..3848aa0 100644 --- a/refs.c +++ b/refs.c @@ -1478,22 +1478,28 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data) { - const char *logfile; - FILE *logfp; - char buf[1024]; + const char *log_mapped, *buf, *log_end, *logfile; + size_t mapsz; int ret = 0; - logfile = git_path("logs/%s", ref); - logfp = fopen(logfile, "r"); - if (!logfp) + buf = log_mapped = open_reflog(ref, &mapsz, &logfile); + if (!log_mapped) return -1; - while (fgets(buf, sizeof(buf), logfp)) { + log_end = buf + mapsz; + + while (buf < log_end) { unsigned char osha1[20], nsha1[20]; char *email, *message; + const char *next; unsigned long timestamp; int len, tz; - len = strlen(buf); + next = memchr(buf, '\n', log_end - buf); + if (next) + next++; + else + next = log_end; + len = next - buf; parse_reflog_line(buf, len, osha1, nsha1, &email, ×tamp, &tz, &message, @@ -1501,8 +1507,9 @@ int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data) ret = fn(osha1, nsha1, email, timestamp, tz, message, cb_data); if (ret) break; + buf = next; } - fclose(logfp); + munmap((void*) log_mapped, mapsz); return ret; } -- 1.6.1.315.g92577 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html