path: root/builtin/am.c
diff options
authorPaul Tan <>2015-08-04 14:08:51 (GMT)
committerJunio C Hamano <>2015-08-12 17:33:47 (GMT)
commitb5e823594cff190bc18361207a89b08d57b038d7 (patch)
tree7a9e7632d3f06cd7388c6f3a52bb87cb8d0870e3 /builtin/am.c
parent852a171018be4695f21848b03d001b5ed3ee96a0 (diff)
am: let --signoff override --no-signoff
After resolving a conflicting patch, a user may wish to sign off the patch to declare that the patch has been modified. As such, the user will expect that running "git am --signoff --continue" will append the signoff to the commit message. However, the --signoff option is only taken into account during the mail-parsing stage. If the --signoff option is set, then the signoff will be appended to the commit message. Since the mail-parsing stage comes before the patch application stage, the --signoff option, if provided on the command-line when resuming, will have no effect at all. We cannot move the append_signoff() call to the patch application stage as the applypatch-msg hook and interactive mode, which run before patch application, may expect the signoff to be there. Fix this by taking note if the user explictly set the --signoff option on the command-line, and append the signoff to the commit message when resuming if so. Signed-off-by: Paul Tan <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'builtin/am.c')
1 files changed, 25 insertions, 3 deletions
diff --git a/builtin/am.c b/builtin/am.c
index f81b74d..634f7a7 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -98,6 +98,12 @@ enum scissors_type {
SCISSORS_TRUE /* pass --scissors to git-mailinfo */
+enum signoff_type {
+ SIGNOFF_EXPLICIT /* --signoff was set on the command-line */
struct am_state {
/* state directory path */
char *dir;
@@ -123,7 +129,7 @@ struct am_state {
int interactive;
int threeway;
int quiet;
- int signoff;
+ int signoff; /* enum signoff_type */
int utf8;
int keep; /* enum keep_type */
int message_id;
@@ -1186,6 +1192,18 @@ static void NORETURN die_user_resolve(const struct am_state *state)
+ * Appends signoff to the "msg" field of the am_state.
+ */
+static void am_append_signoff(struct am_state *state)
+ struct strbuf sb = STRBUF_INIT;
+ strbuf_attach(&sb, state->msg, state->msg_len, state->msg_len);
+ append_signoff(&sb, 0, 0);
+ state->msg = strbuf_detach(&sb, &state->msg_len);
* Parses `mail` using git-mailinfo, extracting its patch and authorship info.
* state->msg will be set to the patch message. state->author_name,
* state->author_email and state->author_date will be set to the patch author's
@@ -2153,8 +2171,9 @@ int cmd_am(int argc, const char **argv, const char *prefix)
OPT_BOOL('3', "3way", &state.threeway,
N_("allow fall back on 3way merging if needed")),
OPT__QUIET(&state.quiet, N_("be quiet")),
- OPT_BOOL('s', "signoff", &state.signoff,
- N_("add a Signed-off-by line to the commit message")),
+ OPT_SET_INT('s', "signoff", &state.signoff,
+ N_("add a Signed-off-by line to the commit message"),
OPT_BOOL('u', "utf8", &state.utf8,
N_("recode into utf8 (default)")),
OPT_SET_INT('k', "keep", &state.keep,
@@ -2267,6 +2286,9 @@ int cmd_am(int argc, const char **argv, const char *prefix)
if (resume == RESUME_FALSE)
resume = RESUME_APPLY;
+ if (state.signoff == SIGNOFF_EXPLICIT)
+ am_append_signoff(&state);
} else {
struct argv_array paths = ARGV_ARRAY_INIT;
int i;