for_each_reflog_ent(): extract a helper to process a single entry

Split the logic that takes a single line of reflog entry in a strbuf, parses the message, and calls the callback function out of the loop into a separate helper function. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Mar 8, 2013 at 10:36 UTC 9a7a183bd216fc7f824460e1f6d27886938a6152
1 file changed +30 -29
refs.c
+30 -29
@@ -2290,6 +2290,34 @@ int read_ref_at(const char *refname, unsigned long at_time, int cnt,
2290 return 1;
2291 }
2292
2293 +static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)
2294 +{
2295 + unsigned char osha1[20], nsha1[20];
2296 + char *email_end, *message;
2297 + unsigned long timestamp;
2298 + int tz;
2299 +
2300 + /* old SP new SP name <email> SP time TAB msg LF */
2301 + if (sb->len < 83 || sb->buf[sb->len - 1] != '\n' ||
2302 + get_sha1_hex(sb->buf, osha1) || sb->buf[40] != ' ' ||
2303 + get_sha1_hex(sb->buf + 41, nsha1) || sb->buf[81] != ' ' ||
2304 + !(email_end = strchr(sb->buf + 82, '>')) ||
2305 + email_end[1] != ' ' ||
2306 + !(timestamp = strtoul(email_end + 2, &message, 10)) ||
2307 + !message || message[0] != ' ' ||
2308 + (message[1] != '+' && message[1] != '-') ||
2309 + !isdigit(message[2]) || !isdigit(message[3]) ||
2310 + !isdigit(message[4]) || !isdigit(message[5]))
2311 + return 0; /* corrupt? */
2312 + email_end[1] = '\0';
2313 + tz = strtol(message + 1, NULL, 10);
2314 + if (message[6] != '\t')
2315 + message += 6;
2316 + else
2317 + message += 7;
2318 + return fn(osha1, nsha1, sb->buf + 82, timestamp, tz, message, cb_data);
2319 +}
2320 +
2321 int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long ofs, void *cb_data)
2322 {
2323 const char *logfile;
@@ -2314,35 +2342,8 @@ int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long
2342 }
2343 }
2344
2317 - while (!strbuf_getwholeline(&sb, logfp, '\n')) {
2318 - unsigned char osha1[20], nsha1[20];
2319 - char *email_end, *message;
2320 - unsigned long timestamp;
2321 - int tz;
2322 -
2323 - /* old SP new SP name <email> SP time TAB msg LF */
2324 - if (sb.len < 83 || sb.buf[sb.len - 1] != '\n' ||
2325 - get_sha1_hex(sb.buf, osha1) || sb.buf[40] != ' ' ||
2326 - get_sha1_hex(sb.buf + 41, nsha1) || sb.buf[81] != ' ' ||
2327 - !(email_end = strchr(sb.buf + 82, '>')) ||
2328 - email_end[1] != ' ' ||
2329 - !(timestamp = strtoul(email_end + 2, &message, 10)) ||
2330 - !message || message[0] != ' ' ||
2331 - (message[1] != '+' && message[1] != '-') ||
2332 - !isdigit(message[2]) || !isdigit(message[3]) ||
2333 - !isdigit(message[4]) || !isdigit(message[5]))
2334 - continue; /* corrupt? */
2335 - email_end[1] = '\0';
2336 - tz = strtol(message + 1, NULL, 10);
2337 - if (message[6] != '\t')
2338 - message += 6;
2339 - else
2340 - message += 7;
2341 - ret = fn(osha1, nsha1, sb.buf + 82, timestamp, tz, message,
2342 - cb_data);
2343 - if (ret)
2344 - break;
2345 - }
2345 + while (!ret && !strbuf_getwholeline(&sb, logfp, '\n'))
2346 + ret = show_one_reflog_ent(&sb, fn, cb_data);
2347 fclose(logfp);
2348 strbuf_release(&sb);
2349 return ret;