mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
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>
This commit is contained in:
parent
7e2010537e
commit
9a7a183bd2
59
refs.c
59
refs.c
@ -2290,6 +2290,34 @@ int read_ref_at(const char *refname, unsigned long at_time, int cnt,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)
|
||||
{
|
||||
unsigned char osha1[20], nsha1[20];
|
||||
char *email_end, *message;
|
||||
unsigned long timestamp;
|
||||
int tz;
|
||||
|
||||
/* old SP new SP name <email> SP time TAB msg LF */
|
||||
if (sb->len < 83 || sb->buf[sb->len - 1] != '\n' ||
|
||||
get_sha1_hex(sb->buf, osha1) || sb->buf[40] != ' ' ||
|
||||
get_sha1_hex(sb->buf + 41, nsha1) || sb->buf[81] != ' ' ||
|
||||
!(email_end = strchr(sb->buf + 82, '>')) ||
|
||||
email_end[1] != ' ' ||
|
||||
!(timestamp = strtoul(email_end + 2, &message, 10)) ||
|
||||
!message || message[0] != ' ' ||
|
||||
(message[1] != '+' && message[1] != '-') ||
|
||||
!isdigit(message[2]) || !isdigit(message[3]) ||
|
||||
!isdigit(message[4]) || !isdigit(message[5]))
|
||||
return 0; /* corrupt? */
|
||||
email_end[1] = '\0';
|
||||
tz = strtol(message + 1, NULL, 10);
|
||||
if (message[6] != '\t')
|
||||
message += 6;
|
||||
else
|
||||
message += 7;
|
||||
return fn(osha1, nsha1, sb->buf + 82, timestamp, tz, message, cb_data);
|
||||
}
|
||||
|
||||
int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long ofs, void *cb_data)
|
||||
{
|
||||
const char *logfile;
|
||||
@ -2314,35 +2342,8 @@ int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long
|
||||
}
|
||||
}
|
||||
|
||||
while (!strbuf_getwholeline(&sb, logfp, '\n')) {
|
||||
unsigned char osha1[20], nsha1[20];
|
||||
char *email_end, *message;
|
||||
unsigned long timestamp;
|
||||
int tz;
|
||||
|
||||
/* old SP new SP name <email> SP time TAB msg LF */
|
||||
if (sb.len < 83 || sb.buf[sb.len - 1] != '\n' ||
|
||||
get_sha1_hex(sb.buf, osha1) || sb.buf[40] != ' ' ||
|
||||
get_sha1_hex(sb.buf + 41, nsha1) || sb.buf[81] != ' ' ||
|
||||
!(email_end = strchr(sb.buf + 82, '>')) ||
|
||||
email_end[1] != ' ' ||
|
||||
!(timestamp = strtoul(email_end + 2, &message, 10)) ||
|
||||
!message || message[0] != ' ' ||
|
||||
(message[1] != '+' && message[1] != '-') ||
|
||||
!isdigit(message[2]) || !isdigit(message[3]) ||
|
||||
!isdigit(message[4]) || !isdigit(message[5]))
|
||||
continue; /* corrupt? */
|
||||
email_end[1] = '\0';
|
||||
tz = strtol(message + 1, NULL, 10);
|
||||
if (message[6] != '\t')
|
||||
message += 6;
|
||||
else
|
||||
message += 7;
|
||||
ret = fn(osha1, nsha1, sb.buf + 82, timestamp, tz, message,
|
||||
cb_data);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
while (!ret && !strbuf_getwholeline(&sb, logfp, '\n'))
|
||||
ret = show_one_reflog_ent(&sb, fn, cb_data);
|
||||
fclose(logfp);
|
||||
strbuf_release(&sb);
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user