Move the open+mmap code from read_ref_at() to a separate function for the next patch. Signed-off-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- refs.c | 54 ++++++++++++++++++++++++++++++++---------------------- 1 files changed, 32 insertions(+), 22 deletions(-) diff --git a/refs.c b/refs.c index 4571fac..0a57896 100644 --- a/refs.c +++ b/refs.c @@ -1389,12 +1389,31 @@ static void parse_reflog_line(const char *buf, int len, *message = tzstr+6; } +static char *open_reflog(const char *ref, size_t *mapsz, const char **logfile) +{ + struct stat st; + int logfd; + char *map; + + *logfile = git_path("logs/%s", ref); + logfd = open(*logfile, O_RDONLY, 0); + if (logfd < 0) + return NULL; + if (fstat(logfd, &st)) + return NULL; + + *mapsz = xsize_t(st.st_size); + map = xmmap(NULL, *mapsz, PROT_READ, MAP_PRIVATE, logfd, 0); + close(logfd); + return map; +} + + int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1, char **msg, unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt) { - const char *logfile, *logdata, *logend, *rec, *start; + const char *logfile, *logdata, *logend, *rec, *end; char *email, *message; - int logfd, tz, reccnt = 0; - struct stat st; + int tz, reccnt = 0; unsigned long date; unsigned char new_sha1[20]; unsigned char old_sha1[20]; @@ -1402,28 +1421,20 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * void *log_mapped; size_t mapsz; - logfile = git_path("logs/%s", ref); - logfd = open(logfile, O_RDONLY, 0); - if (logfd < 0) + logdata = log_mapped = open_reflog(ref, &mapsz, &logfile); + if (!logdata) die("Unable to read log %s: %s", logfile, strerror(errno)); - fstat(logfd, &st); - if (!st.st_size) + if (!mapsz) die("Log %s is empty.", logfile); - mapsz = xsize_t(st.st_size); - log_mapped = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, logfd, 0); - logdata = log_mapped; - close(logfd); - rec = logend = logdata + st.st_size; - if (logdata < rec && *(rec-1) == '\n') - rec--; + rec = logend = logdata + mapsz; while (logdata < rec) { - start = memrchr(logdata, '\n', rec-logdata); - if (start) - start++; - else - start = logdata; - parse_reflog_line(start, rec-start+1, + if (logdata < rec && rec[-1] == '\n') + rec--; + end = rec; + while (logdata < rec && rec[-1] != '\n') + rec--; + parse_reflog_line(rec, end-rec+1, old_sha1, new_sha1, &email, &date, &tz, &message, logfile); @@ -1454,7 +1465,6 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * } hashcpy(next_sha1, old_sha1); - rec = start-1; if (cnt > 0) cnt--; reccnt++; -- 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