# [PATCHv2] send-email: Ask if a patch should be sent twice

4 messages from 2019-07-30 to 2019-07-30. Participants: Dmitry Safonov, SZEDER Gábor, Junio C Hamano.
Thread: https://gitlist.dev/t/51555

## Dmitry Safonov, 2019-07-30 16:26

Subject: [PATCHv2] send-email: Ask if a patch should be sent twice
Message-ID: <20190730162624.9226-1-dima@arista.com>
URL: https://gitlist.dev/e/20190730162624.9226-1-dima%40arista.com

```
I was almost certain that git won't let me send the same patch twice,
but today I've managed to double-send a directory by a mistake:
	git send-email --to linux-kernel@vger.kernel.org /tmp/timens/
	    --cc 'Dmitry Safonov <0x7f454c46@gmail.com>' /tmp/timens/`

[I haven't noticed that I put the directory twice ^^]

Prevent this shipwreck from happening again by asking if a patch
is sent multiple times on purpose.

link: https://lkml.kernel.org/r/4d53ebc7-d5b2-346e-c383-606401d19d3a@gmail.com
Cc: Andrei Vagin <avagin@openvz.org>
Suggested-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Dmitry Safonov <dima@arista.com>
---
v2: Moved the check under --validate,
    fixed tests,
    added a new test,
    updated documentation for --validate
 Documentation/git-send-email.txt |  2 ++
 git-send-email.perl              | 14 ++++++++++++++
 t/t9001-send-email.sh            | 15 +++++++++++++++
 3 files changed, 31 insertions(+)

diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index d93e5d0f58f0..0441bb1b5d3b 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -421,6 +421,8 @@ have been specified, in which case default to 'compose'.
 			('auto', 'base64', or 'quoted-printable') is used;
 			this is due to SMTP limits as described by
 			http://www.ietf.org/rfc/rfc5322.txt.
+		*	Ask confirmation before sending patches multiple times
+			if the supplied patches set overlaps.
 --
 +
 Default is the value of `sendemail.validate`; if this is not set,
diff --git a/git-send-email.perl b/git-send-email.perl
index 5f92c89c1c1b..c1638d06f81d 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -688,6 +688,9 @@ sub is_format_patch_arg {
 @files = handle_backup_files(@files);
 
 if ($validate) {
+	my %seen;
+	my @dupes = grep { $seen{$_}++ } @files;
+
 	foreach my $f (@files) {
 		unless (-p $f) {
 			my $error = validate_patch($f, $target_xfer_encoding);
@@ -695,6 +698,17 @@ sub is_format_patch_arg {
 						  $f, $error);
 		}
 	}
+	if (@dupes) {
+		printf(__("Patches specified several times: \n"));
+		printf(__("%s \n" x @dupes), @dupes);
+		$_ = ask(__("Do you want to send those patches several times? Y/n "),
+			default => "y",
+			valid_re => qr/^(?:yes|y|no|n)/i);
+		if (/^n/i) {
+			cleanup_compose_files();
+			exit(0);
+		}
+	}
 }
 
 if (@files) {
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 997f90b42b3e..77df51519d6e 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -555,6 +555,7 @@ test_expect_success $PREREQ 'In-Reply-To without --chain-reply-to' '
 		--no-chain-reply-to \
 		--in-reply-to="$(cat expect)" \
 		--smtp-server="$(pwd)/fake.sendmail" \
+		--no-validate \
 		$patches $patches $patches \
 		2>errors &&
 	# The first message is a reply to --in-reply-to
@@ -577,6 +578,7 @@ test_expect_success $PREREQ 'In-Reply-To with --chain-reply-to' '
 		--chain-reply-to \
 		--in-reply-to="$(cat expect)" \
 		--smtp-server="$(pwd)/fake.sendmail" \
+		--no-validate \
 		$patches $patches $patches \
 		2>errors &&
 	sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt1 >actual &&
@@ -589,6 +591,19 @@ test_expect_success $PREREQ 'In-Reply-To with --chain-reply-to' '
 	test_cmp expect actual
 '
 
+test_expect_success $PREREQ 'ask confirmation for double-send' '
+	clean_fake_sendmail &&
+	echo y | \
+		GIT_SEND_EMAIL_NOTTY=1 \
+		git send-email --from=author@example.com \
+			--to=nobody@example.com \
+			--smtp-server="$(pwd)/fake.sendmail" \
+			--validate \
+			$patches $patches $patches \
+			>stdout &&
+	! grep "Patches specified several times: " stdout
+'
+
 test_expect_success $PREREQ 'setup fake editor' '
 	write_script fake-editor <<-\EOF
 	echo fake edit >>"$1"
-- 
2.22.0


```

## SZEDER Gábor, 2019-07-30 19:19

Subject: Re: [PATCHv2] send-email: Ask if a patch should be sent twice
Message-ID: <20190730191907.GQ20404@szeder.dev>
URL: https://gitlist.dev/e/20190730191907.GQ20404%40szeder.dev
In-Reply-To: <20190730162624.9226-1-dima@arista.com>

```
On Tue, Jul 30, 2019 at 05:26:24PM +0100, Dmitry Safonov wrote:
> +	if (@dupes) {
> +		printf(__("Patches specified several times: \n"));

Is this message translated?  (I don't know what __("<str>") does in
Perl.)  If it is, then ...

> @@ -589,6 +591,19 @@ test_expect_success $PREREQ 'In-Reply-To with --chain-reply-to' '
>  	test_cmp expect actual
>  '
>  
> +test_expect_success $PREREQ 'ask confirmation for double-send' '
> +	clean_fake_sendmail &&
> +	echo y | \
> +		GIT_SEND_EMAIL_NOTTY=1 \
> +		git send-email --from=author@example.com \
> +			--to=nobody@example.com \
> +			--smtp-server="$(pwd)/fake.sendmail" \
> +			--validate \
> +			$patches $patches $patches \
> +			>stdout &&
> +	! grep "Patches specified several times: " stdout

... this here should be 'test_i18ngrep' instead of plain old 'grep'.


```

## Junio C Hamano, 2019-07-30 19:35

Subject: Re: [PATCHv2] send-email: Ask if a patch should be sent twice
Message-ID: <xmqqy30fs4cs.fsf@gitster-ct.c.googlers.com>
URL: https://gitlist.dev/e/xmqqy30fs4cs.fsf%40gitster-ct.c.googlers.com
In-Reply-To: <20190730191907.GQ20404@szeder.dev>

```
SZEDER Gábor <szeder.dev@gmail.com> writes:

> On Tue, Jul 30, 2019 at 05:26:24PM +0100, Dmitry Safonov wrote:
>> +	if (@dupes) {
>> +		printf(__("Patches specified several times: \n"));
>
> Is this message translated?  (I don't know what __("<str>") does in
> Perl.)  If it is, then ...

That's not "in Perl" per-se, but what our own Git::I18N gives us.

>> +test_expect_success $PREREQ 'ask confirmation for double-send' '
>> +	clean_fake_sendmail &&
>> +	echo y | \
>> +		GIT_SEND_EMAIL_NOTTY=1 \
>> +		git send-email --from=author@example.com \
>> +			--to=nobody@example.com \
>> +			--smtp-server="$(pwd)/fake.sendmail" \
>> +			--validate \
>> +			$patches $patches $patches \
>> +			>stdout &&
>> +	! grep "Patches specified several times: " stdout
>
> ... this here should be 'test_i18ngrep' instead of plain old 'grep'.

Yup.  Thanks for carefully reading the patch(es), as always.

```

## Dmitry Safonov, 2019-07-30 20:26

Subject: Re: [PATCHv2] send-email: Ask if a patch should be sent twice
Message-ID: <cd0b46f6-0151-94f2-973f-7ebb2203b8a3@arista.com>
URL: https://gitlist.dev/e/cd0b46f6-0151-94f2-973f-7ebb2203b8a3%40arista.com
In-Reply-To: <xmqqy30fs4cs.fsf@gitster-ct.c.googlers.com>

```
On 7/30/19 8:35 PM, Junio C Hamano wrote:
> SZEDER Gábor <szeder.dev@gmail.com> writes:
> 
>> On Tue, Jul 30, 2019 at 05:26:24PM +0100, Dmitry Safonov wrote:
>>> +	if (@dupes) {
>>> +		printf(__("Patches specified several times: \n"));
>>
>> Is this message translated?  (I don't know what __("<str>") does in
>> Perl.)  If it is, then ...
> 
> That's not "in Perl" per-se, but what our own Git::I18N gives us.
> 
>>> +test_expect_success $PREREQ 'ask confirmation for double-send' '
>>> +	clean_fake_sendmail &&
>>> +	echo y | \
>>> +		GIT_SEND_EMAIL_NOTTY=1 \
>>> +		git send-email --from=author@example.com \
>>> +			--to=nobody@example.com \
>>> +			--smtp-server="$(pwd)/fake.sendmail" \
>>> +			--validate \
>>> +			$patches $patches $patches \
>>> +			>stdout &&
>>> +	! grep "Patches specified several times: " stdout
>>
>> ... this here should be 'test_i18ngrep' instead of plain old 'grep'.
> 
> Yup.  Thanks for carefully reading the patch(es), as always.

Thanks for spotting, will fix in v3.

-- 
          Dmitry

```
