From: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> The calling code treated NULL as a valid return value, so fix this by returning and integer and passing in a parameter to receive the author. Signed-off-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> --- sequencer.c | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/sequencer.c b/sequencer.c index 944dea6997..212b912420 100644 --- a/sequencer.c +++ b/sequencer.c @@ -701,57 +701,58 @@ static char *get_author(const char *message) } /* Read author-script and return an ident line (author <email> timestamp) */ -static const char *read_author_ident(struct strbuf *buf) +static int read_author_ident(char **author) { const char *keys[] = { "GIT_AUTHOR_NAME=", "GIT_AUTHOR_EMAIL=", "GIT_AUTHOR_DATE=" }; + struct strbuf buf = STRBUF_INIT; struct strbuf out = STRBUF_INIT; char *in, *eol; const char *val[3]; int i = 0; - if (strbuf_read_file(buf, rebase_path_author_script(), 256) <= 0) - return NULL; + if (strbuf_read_file(&buf, rebase_path_author_script(), 256) <= 0) + return -1; /* dequote values and construct ident line in-place */ - for (in = buf->buf; i < 3 && in - buf->buf < buf->len; i++) { + for (in = buf.buf; i < 3 && in - buf.buf < buf.len; i++) { if (!skip_prefix(in, keys[i], (const char **)&in)) { - warning("could not parse '%s' (looking for '%s'", - rebase_path_author_script(), keys[i]); - return NULL; + strbuf_release(&buf); + return error("could not parse '%s' (looking for '%s'", + rebase_path_author_script(), keys[i]); } - eol = strchrnul(in, '\n'); *eol = '\0'; if (!sq_dequote(in)) { - warning(_("bad quoting on %s value in '%s'"), - keys[i], rebase_path_author_script()); - return NULL; + strbuf_release(&buf); + return error(_("bad quoting on %s value in '%s'"), + keys[i], rebase_path_author_script()); } val[i] = in; in = eol + 1; } if (i < 3) { - warning("could not parse '%s' (looking for '%s')", - rebase_path_author_script(), keys[i]); - return NULL; + strbuf_release(&buf); + return error("could not parse '%s' (looking for '%s')", + rebase_path_author_script(), keys[i]); } /* validate date since fmt_ident() will die() on bad value */ if (parse_date(val[2], &out)){ - warning(_("invalid date format '%s' in '%s'"), + error(_("invalid date format '%s' in '%s'"), val[2], rebase_path_author_script()); strbuf_release(&out); - return NULL; + strbuf_release(&buf); + return -1; } strbuf_reset(&out); strbuf_addstr(&out, fmt_ident(val[0], val[1], val[2], 0)); - strbuf_swap(buf, &out); - strbuf_release(&out); - return buf->buf; + *author = strbuf_detach(&out, NULL); + strbuf_release(&buf); + return 0; } static const char staged_changes_advice[] = @@ -794,12 +795,14 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts, const char *value; if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) { - struct strbuf msg = STRBUF_INIT, script = STRBUF_INIT; - const char *author = is_rebase_i(opts) ? - read_author_ident(&script) : NULL; + struct strbuf msg = STRBUF_INIT; + char *author = NULL; struct object_id root_commit, *cache_tree_oid; int res = 0; + if (is_rebase_i(opts) && read_author_ident(&author)) + return -1; + if (!defmsg) BUG("root commit without message"); @@ -817,7 +820,7 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts, opts->gpg_sign); strbuf_release(&msg); - strbuf_release(&script); + free(author); if (!res) { update_ref(NULL, "CHERRY_PICK_HEAD", &root_commit, NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR); -- 2.18.0