Re: [PATCH v2 3/3] am: let --signoff override --no-signoff

2015-08-11 Thread Paul Tan
On Fri, Aug 7, 2015 at 5:29 PM, Johannes Schindelin
johannes.schinde...@gmx.de wrote:
 diff --git a/builtin/am.c b/builtin/am.c
 index 0961304..8c95aec 100644
 --- a/builtin/am.c
 +++ b/builtin/am.c
 @@ -2265,6 +2284,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 {

 This is clever, but I suspect there is now a chance for a double-signoff if 
 we passed `--signoff` to the initial `git am` call and it went through 
 without having to resume.

It's not present in this diff context, but this hunk modifies the code
path where in_progress is true. In other words, we only check for
SIGNOFF_EXPLICIT if
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 3/3] am: let --signoff override --no-signoff

2015-08-11 Thread Paul Tan
On Wed, Aug 12, 2015 at 11:06 AM, Paul Tan pyoka...@gmail.com wrote:
 It's not present in this diff context, but this hunk modifies the code
 path where in_progress is true. In other words, we only check for
 SIGNOFF_EXPLICIT if

..we are resuming.

(Ugh, butter fingers)

Thanks,
Paul
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 3/3] am: let --signoff override --no-signoff

2015-08-07 Thread Johannes Schindelin
Hi Paul,

On 2015-08-04 16:08, Paul Tan wrote:

 diff --git a/builtin/am.c b/builtin/am.c
 index 0961304..8c95aec 100644
 --- a/builtin/am.c
 +++ b/builtin/am.c
 @@ -2151,8 +2169,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),
 + SIGNOFF_EXPLICIT),
   OPT_BOOL('u', utf8, state.utf8,
   N_(recode into utf8 (default))),
   OPT_SET_INT('k', keep, state.keep,
 @@ -2265,6 +2284,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 {

This is clever, but I suspect there is now a chance for a double-signoff if we 
passed `--signoff` to the initial `git am` call and it went through without 
having to resume.

Or am I missing something?

Ciao,
Dscho

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 3/3] am: let --signoff override --no-signoff

2015-08-04 Thread Paul Tan
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 pyoka...@gmail.com
---
 builtin/am.c   | 28 +---
 t/t4153-am-resume-override-opts.sh | 20 
 2 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/builtin/am.c b/builtin/am.c
index 0961304..8c95aec 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_FALSE = 0,
+   SIGNOFF_TRUE = 1,
+   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;
@@ -1184,6 +1190,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
@@ -2151,8 +2169,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),
+   SIGNOFF_EXPLICIT),
OPT_BOOL('u', utf8, state.utf8,
N_(recode into utf8 (default))),
OPT_SET_INT('k', keep, state.keep,
@@ -2265,6 +2284,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;
diff --git a/t/t4153-am-resume-override-opts.sh 
b/t/t4153-am-resume-override-opts.sh
index 39fac79..7c013d8 100755
--- a/t/t4153-am-resume-override-opts.sh
+++ b/t/t4153-am-resume-override-opts.sh
@@ -64,6 +64,26 @@ test_expect_success '--no-quiet overrides --quiet' '
test_i18ncmp expected out
 '
 
+test_expect_success '--signoff overrides --no-signoff' '
+   rm -fr .git/rebase-apply 
+   git reset --hard 
+   git checkout first 
+
+   test_must_fail git am --no-signoff side[12].eml 
+   test_path_is_dir .git/rebase-apply 
+   echo side1 file 
+   git add file 
+   git am --signoff --continue 
+
+   # Applied side1 will be signed off
+   echo Signed-off-by: $GIT_COMMITTER_NAME $GIT_COMMITTER_EMAIL 
expected 
+   git cat-file commit HEAD^ | grep Signed-off-by: actual 
+   test_cmp expected actual 
+
+   # Applied side2 will not be signed off
+   test $(git cat-file commit HEAD | grep -c Signed-off-by:) -eq 0
+'
+
 test_expect_success TTY '--reject overrides --no-reject' '
rm -fr .git/rebase-apply 
git reset --hard 
-- 
2.5.0.280.gd88bd6e

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html