Signed-off-by: Rene Scharfe <l.s.r@xxxxxx> --- builtin/am.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/builtin/am.c b/builtin/am.c index 3c50b03faa..3d38b3fe9f 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -881,75 +881,84 @@ static int split_mail_stgit_series(struct am_state *state, const char **paths, static int hg_patch_to_mail(FILE *out, FILE *in, int keep_cr) { struct strbuf sb = STRBUF_INIT; + int rc = 0; while (!strbuf_getline_lf(&sb, in)) { const char *str; if (skip_prefix(sb.buf, "# User ", &str)) fprintf(out, "From: %s\n", str); else if (skip_prefix(sb.buf, "# Date ", &str)) { timestamp_t timestamp; long tz, tz2; char *end; errno = 0; timestamp = parse_timestamp(str, &end, 10); - if (errno) - return error(_("invalid timestamp")); + if (errno) { + rc = error(_("invalid timestamp")); + goto exit; + } - if (!skip_prefix(end, " ", &str)) - return error(_("invalid Date line")); + if (!skip_prefix(end, " ", &str)) { + rc = error(_("invalid Date line")); + goto exit; + } errno = 0; tz = strtol(str, &end, 10); - if (errno) - return error(_("invalid timezone offset")); + if (errno) { + rc = error(_("invalid timezone offset")); + goto exit; + } - if (*end) - return error(_("invalid Date line")); + if (*end) { + rc = error(_("invalid Date line")); + goto exit; + } /* * mercurial's timezone is in seconds west of UTC, * however git's timezone is in hours + minutes east of * UTC. Convert it. */ tz2 = labs(tz) / 3600 * 100 + labs(tz) % 3600 / 60; if (tz > 0) tz2 = -tz2; fprintf(out, "Date: %s\n", show_date(timestamp, tz2, DATE_MODE(RFC2822))); } else if (starts_with(sb.buf, "# ")) { continue; } else { fprintf(out, "\n%s\n", sb.buf); break; } } strbuf_reset(&sb); while (strbuf_fread(&sb, 8192, in) > 0) { fwrite(sb.buf, 1, sb.len, out); strbuf_reset(&sb); } - +exit: strbuf_release(&sb); - return 0; + return rc; } /** * Splits a list of files/directories into individual email patches. Each path * in `paths` must be a file/directory that is formatted according to * `patch_format`. * * Once split out, the individual email patches will be stored in the state * directory, with each patch's filename being its index, padded to state->prec * digits. * * state->cur will be set to the index of the first mail, and state->last will * be set to the index of the last mail. * * Set keep_cr to 0 to convert all lines ending with \r\n to end with \n, 1 * to disable this behavior, -1 to use the default configured setting. * * Returns 0 on success, -1 on failure. */ -- 2.14.1