Subject: Re: [PATCH] am: let command-line options override saved options

From: Junio C Hamano <[email-masked]>
Date: Tue, 28 Jul 2015 10:09:59 -0700

Paul Tan <[email-masked]> writes:

> 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: <[email-masked]>" &&
> +		git format-patch --stdout -1 side-first | sed -e "1d"
> +	} >side-first.patch &&

Hmm, puzzled...  Ah, you want to make sure Message-Id comes at the
very beginning, and you are going to use a single e-mail per mailbox
so it is easier to strip the Beginning of Message marker than to
insert Message-Id after it.  I can understand what is going on.

> +	{
> +		sed -ne "1,/^\$/p" side-first.patch &&

sed -e "/^\$/q" would work just as well here

> +		echo "-- >8 --" &&
> +		sed -e "1,/^\$/d" side-first.patch
> +	} >side-first.scissors &&

So *.scissors version has -- >8 -- inserted at the beginning of the
body.

> +	{
> +		echo "Message-Id: <[email-masked]>" &&
> +		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
> +'

A helper function that takes the branch name may be a good idea,
not just to consolidate the implementation but as a place to
document how these pairs of files are constructed and why.

> +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 &&

Where did this 'out' come from?

> +	echo side-first >file &&
> +	git add file &&
> +	git am --quiet --continue >out &&
> +	test_must_be_empty out

I can see this one, though I am not sure if it is sensible to see
what the command says under --quiet option, especially if you are
making sure it does not fail, which you already have checked for its
exit status.

> +'
> +
> +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
> +'

Hmm, the command was run with --signoff at the start, first gets
applied with "am --no-signoff --resolved" so I would expect it does
not get signed off, but the second one will apply cleanly on top, so
shouldn't it get signed off?  Or perhaps somehow I misread Peff's
idea to make these override one-shot in $gmane/274635?