Re: [PATCHv3] send-email: Ask if a patch should be sent twice

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dmitry Safonov <dima@xxxxxxxxxx> writes:

> I was almost certain that git won't let me send the same patch twice,

Why?  And more importantly, does it matter to readers of this
message what you thought?

> but today I've managed to double-send a directory by a mistake:
> 	git send-email --to linux-kernel@xxxxxxxxxxxxxxx /tmp/timens/
> 	    --cc 'Dmitry Safonov <0x7f454c46@xxxxxxxxx>' /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@xxxxxxxxx

What does "link:" mean?

> Cc: Andrei Vagin <avagin@xxxxxxxxxx>

What's the significance for this project to record that this patch
was CCed to Andrei?

> Suggested-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>

I think "Helped-by:" is a lot more appropriate, viewing the exchange
on v2 from the sideline.

> Signed-off-by: Dmitry Safonov <dima@xxxxxxxxxx>
> ---

> 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);
>  		}

This is not a fault of your patch at all, but the two hunks are
curious.  If "git format-patch" chose to coalesce these two hunks
into one, the second hunk header can be replaced by

		$error and die sprintf(__("fatal: ..."),

The end result would be that we will spend the same number of lines
and we will see more useful information.

>  	}
> +	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);
> +		}
> +	}

Perhaps this should be inserted _before_ the "let's examine each
patchfile and complain" loop.  Otherwise, you'd see this warning
only after seeing the same "the file has too long a line" error
on the same patch.

While you are counting with %seen how many times the contents of
@files appear, perhaps you can also create a list of unique files,
so that you do not have to call validate_patch() more than once
for each of them.  It would also allow you to offer another choice
in the above question "do you want to send them more than once?",
which may be much more useful than yes/no: "drop duplicates".  If
you did so, you do not need to swap the order of the checks.  You
would first count the occurences of each element in @files, then
call validate_patch() on each of them just once, and after you are
done, check if the user wants to send duplicates, abort, or dedup.

Perhaps like this:

 if ($validate) {
+	my (@dupes, %seen, @uniq);
+
	foreach my $f (@files) {
+		if ($seen{$f}) {
+			if ($seen{$f} == 1) { push @dupes, $f; }
+			next;
+		}
+		$seen{$f}++;
+		push @uniq, $f;
+	}
+	foreach my $f (@uniq) {	
		unless (-p $f) {
			my $error = validate_patch(...);
		... the existing loop ...
	}
+
+	if (@dupes) {
+		... the new code in your patch ...





[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux