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;