Add for_each_reflog_ent_backward() which does the same as for_each_reflog_ent(), except it traverses the reflog in backwards (newest to oldest) order. Signed-off-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> --- refs.c | 35 +++++++++++++++++++++++++++++++++++ refs.h | 1 + 2 files changed, 36 insertions(+), 0 deletions(-) diff --git a/refs.c b/refs.c index 3848aa0..cc78f63 100644 --- a/refs.c +++ b/refs.c @@ -1476,6 +1476,41 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * return 1; } +int for_each_reflog_ent_backward(const char *ref, each_reflog_ent_fn fn, void *cb_data) +{ + const char *log_mapped, *buf, *log_end, *logfile; + size_t mapsz; + int ret = 0; + + log_mapped = open_reflog(ref, &mapsz, &logfile); + if (!log_mapped) + return -1; + buf = log_end = log_mapped + mapsz; + + while (buf > log_mapped) { + unsigned char osha1[20], nsha1[20]; + char *email, *message; + const char *end; + unsigned long timestamp; + int tz; + + while (buf > log_mapped && buf[-1] == '\n') + buf--; + end = buf; + while (buf > log_mapped && buf[-1] != '\n') + buf--; + parse_reflog_line(buf, end-buf+1, + osha1, nsha1, + &email, ×tamp, &tz, &message, + logfile); + ret = fn(osha1, nsha1, email, timestamp, tz, message, cb_data); + if (ret) + break; + } + munmap((void*) log_mapped, mapsz); + return ret; +} + int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data) { const char *log_mapped, *buf, *log_end, *logfile; diff --git a/refs.h b/refs.h index 06ad260..723bddc 100644 --- a/refs.h +++ b/refs.h @@ -60,6 +60,7 @@ struct ref_lock { /* iterate over reflog entries */ typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *); int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data); +int for_each_reflog_ent_backward(const char *ref, each_reflog_ent_fn fn, void *cb_data); /* * Calls the specified function for each reflog file until it returns nonzero, -- 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