Skip to content

Commit 9a7a183

Browse files
committed
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 <[email protected]>
1 parent 7e20105 commit 9a7a183

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

refs.c

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,6 +2290,34 @@ int read_ref_at(const char *refname, unsigned long at_time, int cnt,
22902290
return 1;
22912291
}
22922292

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+
22932321
int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long ofs, void *cb_data)
22942322
{
22952323
const char *logfile;
@@ -2314,35 +2342,8 @@ int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long
23142342
}
23152343
}
23162344

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);
23462347
fclose(logfp);
23472348
strbuf_release(&sb);
23482349
return ret;

0 commit comments

Comments
 (0)