From: Paul Tan <pyokagan@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jeff King <peff@peff.net>,
Remi Lespinet <remi.lespinet@ensimag.grenoble-inp.fr>,
Git List <git@vger.kernel.org>,
Stefan Beller <sbeller@google.com>,
Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: [PATCH] am: let command-line options override saved options
Date: Wed, 29 Jul 2015 00:43:11 +0800 [thread overview]
Message-ID: <20150728164311.GA1948@yoshi.chippynet.com> (raw)
In-Reply-To: <xmqq8ua1k7fc.fsf@gitster.dls.corp.google.com>
When resuming, git-am ignores command-line options. For instance, when a
patch fails to apply with "git am patch", subsequently running "git am
--3way patch" would not cause git-am to fall back on attempting a
threeway merge. This occurs because by default the --3way option is
saved as "false", and the saved am options are loaded after the
command-line options are parsed, thus overwriting the command-line
options when resuming.
Fix this by moving the am_load() function call before parse_options(),
so that command-line options will override the saved am options.
Reported-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Paul Tan <pyokagan@gmail.com>
---
builtin/am.c | 9 ++-
t/t4153-am-resume-override-opts.sh | 144 +++++++++++++++++++++++++++++++++++++
2 files changed, 150 insertions(+), 3 deletions(-)
create mode 100755 t/t4153-am-resume-override-opts.sh
diff --git a/builtin/am.c b/builtin/am.c
index 1116304..8a0b0e4 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -2131,6 +2131,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
int keep_cr = -1;
int patch_format = PATCH_FORMAT_UNKNOWN;
enum resume_mode resume = RESUME_FALSE;
+ int in_progress;
const char * const usage[] = {
N_("git am [options] [(<mbox>|<Maildir>)...]"),
@@ -2226,6 +2227,10 @@ int cmd_am(int argc, const char **argv, const char *prefix)
am_state_init(&state, git_path("rebase-apply"));
+ in_progress = am_in_progress(&state);
+ if (in_progress)
+ am_load(&state);
+
argc = parse_options(argc, argv, prefix, options, usage, 0);
if (binary >= 0)
@@ -2238,7 +2243,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
if (read_index_preload(&the_index, NULL) < 0)
die(_("failed to read the index"));
- if (am_in_progress(&state)) {
+ if (in_progress) {
/*
* Catch user error to feed us patches when there is a session
* in progress:
@@ -2256,8 +2261,6 @@ int cmd_am(int argc, const char **argv, const char *prefix)
if (resume == RESUME_FALSE)
resume = RESUME_APPLY;
-
- am_load(&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
new file mode 100755
index 0000000..c49457c
--- /dev/null
+++ b/t/t4153-am-resume-override-opts.sh
@@ -0,0 +1,144 @@
+#!/bin/sh
+
+test_description='git-am command-line options override saved options'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+ test_commit initial file &&
+ test_commit first file &&
+
+ git checkout -b side initial &&
+ test_commit side-first file &&
+ test_commit side-second file &&
+
+ {
+ echo "Message-Id: <side-first@example.com>" &&
+ git format-patch --stdout -1 side-first | sed -e "1d"
+ } >side-first.patch &&
+ {
+ sed -ne "1,/^\$/p" side-first.patch &&
+ echo "-- >8 --" &&
+ sed -e "1,/^\$/d" side-first.patch
+ } >side-first.scissors &&
+
+ {
+ echo "Message-Id: <side-second@example.com>" &&
+ git format-patch --stdout -1 side-second | sed -e "1d"
+ } >side-second.patch &&
+ {
+ sed -ne "1,/^\$/p" side-second.patch &&
+ echo "-- >8 --" &&
+ sed -e "1,/^\$/d" side-second.patch
+ } >side-second.scissors
+'
+
+test_expect_success '--3way, --no-3way' '
+ rm -fr .git/rebase-apply &&
+ git reset --hard &&
+ git checkout first &&
+ test_must_fail git am --3way side-first.patch side-second.patch &&
+ test -n "$(git ls-files -u)" &&
+ echo will-conflict >file &&
+ git add file &&
+ test_must_fail git am --no-3way --continue &&
+ test -z "$(git ls-files -u)"
+'
+
+test_expect_success '--no-quiet, --quiet' '
+ rm -fr .git/rebase-apply &&
+ git reset --hard &&
+ git checkout first &&
+ test_must_fail git am --no-quiet side-first.patch side-second.patch &&
+ test_must_be_empty out &&
+ echo side-first >file &&
+ git add file &&
+ git am --quiet --continue >out &&
+ test_must_be_empty out
+'
+
+test_expect_success '--signoff, --no-signoff' '
+ rm -fr .git/rebase-apply &&
+ git reset --hard &&
+ git checkout first &&
+ test_must_fail git am --signoff side-first.patch side-second.patch &&
+ echo side-first >file &&
+ git add file &&
+ git am --no-signoff --continue &&
+
+ # applied side-first 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 side-second will not be signed off
+ test $(git cat-file commit HEAD | grep -c "Signed-off-by:") -eq 0
+'
+
+test_expect_success '--keep, --no-keep' '
+ rm -fr .git/rebase-apply &&
+ git reset --hard &&
+ git checkout first &&
+ test_must_fail git am --keep side-first.patch side-second.patch &&
+ echo side-first >file &&
+ git add file &&
+ git am --no-keep --continue &&
+
+ # applied side-first will keep the subject
+ git cat-file commit HEAD^ >actual &&
+ grep "^\[PATCH\] side-first" actual &&
+
+ # applied side-second will not have [PATCH]
+ git cat-file commit HEAD >actual &&
+ ! grep "^\[PATCH\] side-second" actual
+'
+
+test_expect_success '--message-id, --no-message-id' '
+ rm -fr .git/rebase-apply &&
+ git reset --hard &&
+ git checkout first &&
+ test_must_fail git am --message-id side-first.patch side-second.patch &&
+ echo side-first >file &&
+ git add file &&
+ git am --no-message-id --continue &&
+
+ # applied side-first will have Message-Id
+ test -n "$(git cat-file commit HEAD^ | grep Message-Id)" &&
+
+ # applied side-second will not have Message-Id
+ test -z "$(git cat-file commit HEAD | grep Message-Id)"
+'
+
+test_expect_success '--scissors, --no-scissors' '
+ rm -fr .git/rebase-apply &&
+ git reset --hard &&
+ git checkout first &&
+ test_must_fail git am --scissors side-first.scissors side-second.scissors &&
+ echo side-first >file &&
+ git add file &&
+ git am --no-scissors --continue &&
+
+ # applied side-first will not have scissors line
+ git cat-file commit HEAD^ >actual &&
+ ! grep "^-- >8 --" actual &&
+
+ # applied side-second will have scissors line
+ git cat-file commit HEAD >actual &&
+ grep "^-- >8 --" actual
+'
+
+test_expect_success '--reject, --no-reject' '
+ rm -fr .git/rebase-apply &&
+ git reset --hard &&
+ git checkout first &&
+ rm -f file.rej &&
+ test_must_fail git am --reject side-first.patch side-second.patch &&
+ test_path_is_file file.rej &&
+ rm -f file.rej &&
+ echo will-conflict >file &&
+ git add file &&
+ test_must_fail git am --no-reject --continue &&
+ test_path_is_missing file.rej
+'
+
+test_done
--
2.5.0.77.gd180035
next prev parent reply other threads:[~2015-07-28 16:43 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-24 17:48 "git am" and then "git am -3" regression? Junio C Hamano
2015-07-24 18:09 ` Jeff King
2015-07-26 5:03 ` Paul Tan
2015-07-26 5:21 ` Jeff King
2015-07-27 8:09 ` Matthieu Moy
2015-07-27 8:32 ` Jeff King
2015-07-27 14:21 ` Junio C Hamano
2015-07-28 16:43 ` Paul Tan [this message]
2015-07-28 16:48 ` [PATCH] am: let command-line options override saved options Junio C Hamano
2015-07-28 17:09 ` Junio C Hamano
2015-07-31 10:58 ` Paul Tan
2015-07-31 16:04 ` Junio C Hamano
2015-08-01 0:59 ` Paul Tan
2015-08-04 14:05 ` [PATCH v2 0/3] " Paul Tan
2015-08-04 21:12 ` Junio C Hamano
2015-08-04 14:08 ` Paul Tan
2015-08-04 14:08 ` [PATCH v2 1/3] test_terminal: redirect child process' stdin to a pty Paul Tan
2015-08-06 22:15 ` Eric Sunshine
2015-08-12 4:16 ` Paul Tan
2015-08-04 14:08 ` [PATCH v2 2/3] am: let command-line options override saved options Paul Tan
2015-08-04 14:08 ` [PATCH v2 3/3] am: let --signoff override --no-signoff Paul Tan
2015-08-07 9:29 ` Johannes Schindelin
2015-08-12 3:06 ` Paul Tan
2015-08-12 3:07 ` Paul Tan
2015-08-05 15:41 ` [PATCH v2 0/3] am: let command-line options override saved options Junio C Hamano
2015-08-05 17:51 ` Paul Tan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150728164311.GA1948@yoshi.chippynet.com \
--to=pyokagan@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=peff@peff.net \
--cc=remi.lespinet@ensimag.grenoble-inp.fr \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).