Extract the patch ID and series length from the [PATCH N/M] prefix in the mail header Signed-off-by: Nicolas Morey-Chaisemartin <nicolas@xxxxxxxxxxxxxxxxxxxxxx> --- mailinfo.c | 35 +++++++++++++++++++++++++++++++++++ mailinfo.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/mailinfo.c b/mailinfo.c index a89db22ab..2ab9d446d 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -308,6 +308,39 @@ static void cleanup_subject(struct mailinfo *mi, struct strbuf *subject) if (!pos) break; remove = pos - subject->buf + at + 1; + if (7 <= remove && + memmem(subject->buf + at, remove, "PATCH", 5)){ + /* + * Look for a N/M series identifier at + * the end of the brackets + */ + int is_series = 1; + int ret, num, total; + int pt = at + remove - 2; + + if (!isdigit(subject->buf[pt])) + is_series = 0; + else { + while(isdigit(subject->buf[--pt])); + } + + if(is_series && subject->buf[pt--] != '/') + is_series = 0; + + if (!isdigit(subject->buf[pt])) + is_series = 0; + if (is_series) + while(isdigit(subject->buf[--pt])); + + pt++; + + ret = sscanf(subject->buf + pt, "%d/%d]", &num, &total); + if (ret == 2){ + mi->series_id = num; + mi->series_len = total; + } + } + if (!mi->keep_non_patch_brackets_in_subject || (7 <= remove && memmem(subject->buf + at, remove, "PATCH", 5))) @@ -1154,6 +1187,8 @@ void setup_mailinfo(struct mailinfo *mi) mi->header_stage = 1; mi->use_inbody_headers = 1; mi->content_top = mi->content; + mi->series_id = -1; + mi->series_len = -1; git_config(git_mailinfo_config, mi); } diff --git a/mailinfo.h b/mailinfo.h index 04a25351d..bd4f7c9e0 100644 --- a/mailinfo.h +++ b/mailinfo.h @@ -21,6 +21,8 @@ struct mailinfo { struct strbuf **content_top; struct strbuf charset; char *message_id; + int series_id; /* Id of the patch within a patch series. -1 if not a patch series */ + int series_len; /* Length of the patch series. -1 if not a patch series */ enum { TE_DONTCARE, TE_QP, TE_BASE64 } transfer_encoding; -- 2.15.0.169.g3d3eebb67.dirty