[PATCH/RFC v3 2/6] reflog: refactor log open+mmap
From: Thomas Rast <hidden>
Date: 2016-06-15 22:45:58
Subsystem:
the rest · Maintainer:
Linus Torvalds
Move the open+mmap code from read_ref_at() to a separate function for the next patch. Signed-off-by: Thomas Rast <redacted> --- 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