diff options
Diffstat (limited to 'ref-filter.c')
-rw-r--r-- | ref-filter.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/ref-filter.c b/ref-filter.c index c62f6b4..aa260bf 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -1097,14 +1097,19 @@ static const char *copy_email(const char *buf, struct used_atom *atom) static char *copy_subject(const char *buf, unsigned long len) { - char *r = xmemdupz(buf, len); + struct strbuf sb = STRBUF_INIT; int i; - for (i = 0; i < len; i++) - if (r[i] == '\n') - r[i] = ' '; + for (i = 0; i < len; i++) { + if (buf[i] == '\r' && i + 1 < len && buf[i + 1] == '\n') + continue; /* ignore CR in CRLF */ - return r; + if (buf[i] == '\n') + strbuf_addch(&sb, ' '); + else + strbuf_addch(&sb, buf[i]); + } + return strbuf_detach(&sb, NULL); } static void grab_date(const char *buf, struct atom_value *v, const char *atomname) @@ -1228,20 +1233,23 @@ static void find_subpos(const char *buf, /* subject is first non-empty line */ *sub = buf; - /* subject goes to first empty line */ - while (buf < *sig && *buf && *buf != '\n') { - eol = strchrnul(buf, '\n'); - if (*eol) - eol++; - buf = eol; - } + /* subject goes to first empty line before signature begins */ + if ((eol = strstr(*sub, "\n\n"))) { + eol = eol < *sig ? eol : *sig; + /* check if message uses CRLF */ + } else if (! (eol = strstr(*sub, "\r\n\r\n"))) { + /* treat whole message as subject */ + eol = strrchr(*sub, '\0'); + } + buf = eol; *sublen = buf - *sub; /* drop trailing newline, if present */ - if (*sublen && (*sub)[*sublen - 1] == '\n') + while (*sublen && ((*sub)[*sublen - 1] == '\n' || + (*sub)[*sublen - 1] == '\r')) *sublen -= 1; /* skip any empty lines */ - while (*buf == '\n') + while (*buf == '\n' || *buf == '\r') buf++; *body = buf; *bodylen = strlen(buf); @@ -2222,7 +2230,7 @@ void ref_array_clear(struct ref_array *array) used_atom_cnt = 0; if (ref_to_worktree_map.worktrees) { - hashmap_free_entries(&(ref_to_worktree_map.map), + hashmap_clear_and_free(&(ref_to_worktree_map.map), struct ref_to_worktree_entry, ent); free_worktrees(ref_to_worktree_map.worktrees); ref_to_worktree_map.worktrees = NULL; |