--- builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index b0b5d8f..461c47e 100644 --- a/builtin-mailinfo.c +++ b/builtin-mailinfo.c @@ -712,6 +712,34 @@ static inline int patchbreak(const struct strbuf *line) return 0; } +static int scissors(const struct strbuf *line) +{ + size_t i, len = line->len; + int scissors_dashes_seen = 0; + const char *buf = line->buf; + + for (i = 0; i < len; i++) { + if (isspace(buf[i])) + continue; + if (buf[i] == '-') { + scissors_dashes_seen |= 02; + continue; + } + if (i + 1 < len && !memcmp(buf + i, ">8", 2)) { + scissors_dashes_seen |= 01; + i++; + continue; + } + if (i + 7 < len && !memcmp(buf + i, "cut here", 8)) { + i += 7; + continue; + } + /* everything else --- not scissors */ + break; + } + return scissors_dashes_seen == 03; +} + static int handle_commit_msg(struct strbuf *line) { static int still_looking = 1; @@ -723,10 +751,17 @@ static int handle_commit_msg(struct strbuf *line) strbuf_ltrim(line); if (!line->len) return 0; - if ((still_looking = check_header(line, s_hdr_data, 0)) != 0) + still_looking = check_header(line, s_hdr_data, 0); + if (still_looking) return 0; } + if (scissors(line)) { + fseek(cmitmsg, 0L, SEEK_SET); + still_looking = 1; + return 0; + } + /* normalize the log message to UTF-8. */ if (metainfo_charset) convert_to_utf8(line, charset.buf); -- 1.6.4.1