* [PATCH] git-send-email.perl: implement suggestions made by perlcritic
@ 2013-03-21 12:39 Ramkumar Ramachandra
2013-03-21 15:29 ` Junio C Hamano
0 siblings, 1 reply; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-03-21 12:39 UTC (permalink / raw)
To: Git List
Running perlcritic with gentle severity reports six problems. The
following lists the line numbers on which the problems occur, along
with a description of the problem. This patch fixes them all.
516: Contrary to common belief, subroutine prototypes do not enable
compile-time checks for proper arguments. They serve the singular
purpose of defining functions that behave like built-in functions, but
check_file_rev_conflict was never intended to behave like one.
714, 836, 855, 1487: Returning `undef' upon failure from a subroutine
is pretty common. But if the subroutine is called in list context, an
explicit `return undef;' statement will return a one-element list
containing `(undef)'. Now if that list is subsequently put in a
boolean context to test for failure, then it evaluates to true. But
you probably wanted it to be false. The solution is to just use a
bare `return' statement whenever you want to return failure. In list
context, Perl will then give you an empty list (which is false), and
`undef' in scalar context (which is also false).
1441: The three-argument form of `open' (introduced in Perl 5.6)
prevents subtle bugs that occur when the filename starts with funny
characters like '>' or '<'. It's also more explicitly clear to define
the input mode of the file. This policy will not complain if the file
explicitly states that it is compatible with a version of Perl prior
to 5.6 via an include statement (see 'use 5.008' near the top of the
file).
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
---
I was looking at git-send-email.perl after I posted that bug report
about SSL_verify. What better way to get started than Perl Best
Practices? Here's a nice patch to fix some obvious style issues. I
didn't run perlcritic on a higher severity, because I don't know
enough Perl to have a well-formed opinion of my own; I'm just fixing
the glaringly obvious problems.
git-send-email.perl | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index be809e5..e974b11 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -513,7 +513,7 @@ if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) {
($sender) = expand_aliases($sender) if defined $sender;
# returns 1 if the conflict must be solved using it as a format-patch argument
-sub check_file_rev_conflict($) {
+sub check_file_rev_conflict {
return unless $repo;
my $f = shift;
try {
@@ -711,7 +711,7 @@ sub ask {
}
}
}
- return undef;
+ return;
}
my %broken_encoding;
@@ -833,7 +833,7 @@ sub extract_valid_address {
# less robust/correct than the monster regexp in Email::Valid,
# but still does a 99% job, and one less dependency
return $1 if $address =~ /($local_part_regexp\@$domain_regexp)/;
- return undef;
+ return;
}
sub extract_valid_address_or_die {
@@ -852,7 +852,7 @@ sub validate_address {
valid_re => qr/^(?:quit|q|drop|d|edit|e)/i,
default => 'q');
if (/^d/i) {
- return undef;
+ return;
} elsif (/^q/i) {
cleanup_compose_files();
exit(0);
@@ -1438,7 +1438,7 @@ sub recipients_cmd {
my $sanitized_sender = sanitize_address($sender);
my @addresses = ();
- open my $fh, "$cmd \Q$file\E |"
+ open my $fh, q{-|}, "$cmd \Q$file\E"
or die "($prefix) Could not execute '$cmd'";
while (my $address = <$fh>) {
$address =~ s/^\s*//g;
@@ -1484,7 +1484,7 @@ sub validate_patch {
return "$.: patch contains a line longer than 998 characters";
}
}
- return undef;
+ return;
}
sub file_has_nonascii {
--
1.8.2.62.ga35d936.dirty
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH] git-send-email.perl: implement suggestions made by perlcritic
2013-03-21 12:39 [PATCH] git-send-email.perl: implement suggestions made by perlcritic Ramkumar Ramachandra
@ 2013-03-21 15:29 ` Junio C Hamano
2013-03-21 16:51 ` Ramkumar Ramachandra
0 siblings, 1 reply; 21+ messages in thread
From: Junio C Hamano @ 2013-03-21 15:29 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: Git List
Ramkumar Ramachandra <artagnon@gmail.com> writes:
> diff --git a/git-send-email.perl b/git-send-email.perl
> index be809e5..e974b11 100755
> --- a/git-send-email.perl
> +++ b/git-send-email.perl
> @@ -513,7 +513,7 @@ if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) {
> ($sender) = expand_aliases($sender) if defined $sender;
>
> # returns 1 if the conflict must be solved using it as a format-patch argument
> -sub check_file_rev_conflict($) {
> +sub check_file_rev_conflict {
Have you verified that the callers of this sub are OK with this
change? It used to force scalar context on its arguments but now it
does not.
I am not saying I know the callers will get broken. I am trying to
make sure that this is *not* the result of blindly following
perlcritic output without understanding the ramifications of the
change.
> @@ -1438,7 +1438,7 @@ sub recipients_cmd {
>
> my $sanitized_sender = sanitize_address($sender);
> my @addresses = ();
> - open my $fh, "$cmd \Q$file\E |"
> + open my $fh, q{-|}, "$cmd \Q$file\E"
Strange quoting (why not just say "-|"?) aside, if you are moving
away from the two-param form of open(), it would be a sane thing to
do to also stop concatenating the arguments to commands to avoid
shell metacharacter gotcha. It will make the resulting code much
safer.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] git-send-email.perl: implement suggestions made by perlcritic
2013-03-21 15:29 ` Junio C Hamano
@ 2013-03-21 16:51 ` Ramkumar Ramachandra
2013-03-27 17:13 ` Ramkumar Ramachandra
0 siblings, 1 reply; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-03-21 16:51 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List
Junio C Hamano wrote:
> Ramkumar Ramachandra <artagnon@gmail.com> writes:
>
>> diff --git a/git-send-email.perl b/git-send-email.perl
>> index be809e5..e974b11 100755
>> --- a/git-send-email.perl
>> +++ b/git-send-email.perl
>> @@ -513,7 +513,7 @@ if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) {
>> ($sender) = expand_aliases($sender) if defined $sender;
>>
>> # returns 1 if the conflict must be solved using it as a format-patch argument
>> -sub check_file_rev_conflict($) {
>> +sub check_file_rev_conflict {
>
> Have you verified that the callers of this sub are OK with this
> change? It used to force scalar context on its arguments but now it
> does not.
>
> I am not saying I know the callers will get broken. I am trying to
> make sure that this is *not* the result of blindly following
> perlcritic output without understanding the ramifications of the
> change.
No Junio, I haven't blindly followed the perlcritic output. I've
considered the ramifications, audited the callers, and run the tests
to make sure that nothing breaks.
>> @@ -1438,7 +1438,7 @@ sub recipients_cmd {
>>
>> my $sanitized_sender = sanitize_address($sender);
>> my @addresses = ();
>> - open my $fh, "$cmd \Q$file\E |"
>> + open my $fh, q{-|}, "$cmd \Q$file\E"
>
> Strange quoting (why not just say "-|"?) aside
Intentional. I thought it was a pretty way to differentiate between a
mode string (which can only be <, >, or -|) and a filename string. If
you don't share my taste, feel free to use quotes instead.
> , if you are moving
> away from the two-param form of open(), it would be a sane thing to
> do to also stop concatenating the arguments to commands to avoid
> shell metacharacter gotcha. It will make the resulting code much
> safer.
Yes, the file can be improved in many ways, but that is not the topic
of this series. This series just makes the changes suggested by
perlcritic gentle.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] git-send-email.perl: implement suggestions made by perlcritic
2013-03-21 16:51 ` Ramkumar Ramachandra
@ 2013-03-27 17:13 ` Ramkumar Ramachandra
2013-03-27 17:38 ` Junio C Hamano
0 siblings, 1 reply; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-03-27 17:13 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List
Junio,
I don't see this queued in 'pu'. Do you have any objections to the
patch, or did you just forget?
Thanks.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] git-send-email.perl: implement suggestions made by perlcritic
2013-03-27 17:13 ` Ramkumar Ramachandra
@ 2013-03-27 17:38 ` Junio C Hamano
2013-03-28 12:47 ` [PATCH v2] " Ramkumar Ramachandra
0 siblings, 1 reply; 21+ messages in thread
From: Junio C Hamano @ 2013-03-27 17:38 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: Git List
Ramkumar Ramachandra <artagnon@gmail.com> writes:
> I don't see this queued in 'pu'. Do you have any objections to the
> patch, or did you just forget?
I do not recall the details but I think I was expecting a re-roll
updating the log message (if the original invited questions, there
must have been some room for improvement to avoid such confusions,
right?) for a few days since the exchange, and then forgot.
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic
2013-03-27 17:38 ` Junio C Hamano
@ 2013-03-28 12:47 ` Ramkumar Ramachandra
2013-03-28 18:57 ` Jonathan Nieder
2013-03-28 20:26 ` Junio C Hamano
0 siblings, 2 replies; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-03-28 12:47 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List
Running perlcritic with gentle severity reports six problems. The
following lists the line numbers on which the problems occur, along
with a description of the problem. This patch fixes them all, after
carefully considering the consequences.
516: Contrary to common belief, subroutine prototypes do not enable
compile-time checks for proper arguments. They serve the singular
purpose of defining functions that behave like built-in functions, but
check_file_rev_conflict was never intended to behave like one. We
have verified that the callers of the subroutines are alright with the
change.
714, 836, 855, 1487: Returning `undef' upon failure from a subroutine
is pretty common. But if the subroutine is called in list context, an
explicit `return undef;' statement will return a one-element list
containing `(undef)'. Now if that list is subsequently put in a
boolean context to test for failure, then it evaluates to true. But
you probably wanted it to be false. The solution is to just use a
bare `return' statement whenever you want to return failure. In list
context, Perl will then give you an empty list (which is false), and
`undef' in scalar context (which is also false).
1441: The three-argument form of `open' (introduced in Perl 5.6)
prevents subtle bugs that occur when the filename starts with funny
characters like '>' or '<'. It's also more explicitly clear to define
the input mode of the file. This policy will not complain if the file
explicitly states that it is compatible with a version of Perl prior
to 5.6 via an include statement (see 'use 5.008' near the top of the
file).
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
---
Junio: In future, please tell me explicitly that you're expecting a
re-roll with an updated commit message. It wasn't obvious to me at
all.
git-send-email.perl | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index c3501d9..633f447 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -513,7 +513,7 @@ if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) {
($sender) = expand_aliases($sender) if defined $sender;
# returns 1 if the conflict must be solved using it as a format-patch argument
-sub check_file_rev_conflict($) {
+sub check_file_rev_conflict {
return unless $repo;
my $f = shift;
try {
@@ -711,7 +711,7 @@ sub ask {
}
}
}
- return undef;
+ return;
}
my %broken_encoding;
@@ -833,7 +833,7 @@ sub extract_valid_address {
# less robust/correct than the monster regexp in Email::Valid,
# but still does a 99% job, and one less dependency
return $1 if $address =~ /($local_part_regexp\@$domain_regexp)/;
- return undef;
+ return;
}
sub extract_valid_address_or_die {
@@ -852,7 +852,7 @@ sub validate_address {
valid_re => qr/^(?:quit|q|drop|d|edit|e)/i,
default => 'q');
if (/^d/i) {
- return undef;
+ return;
} elsif (/^q/i) {
cleanup_compose_files();
exit(0);
@@ -1453,7 +1453,7 @@ sub recipients_cmd {
my $sanitized_sender = sanitize_address($sender);
my @addresses = ();
- open my $fh, "$cmd \Q$file\E |"
+ open my $fh, q{-|}, "$cmd \Q$file\E"
or die "($prefix) Could not execute '$cmd'";
while (my $address = <$fh>) {
$address =~ s/^\s*//g;
@@ -1499,7 +1499,7 @@ sub validate_patch {
return "$.: patch contains a line longer than 998 characters";
}
}
- return undef;
+ return;
}
sub file_has_nonascii {
--
1.8.2.141.g07926c6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic
2013-03-28 12:47 ` [PATCH v2] " Ramkumar Ramachandra
@ 2013-03-28 18:57 ` Jonathan Nieder
2013-03-28 20:26 ` Junio C Hamano
1 sibling, 0 replies; 21+ messages in thread
From: Jonathan Nieder @ 2013-03-28 18:57 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: Junio C Hamano, Git List
Ramkumar Ramachandra wrote:
> Junio: In future, please tell me explicitly that you're expecting a
> re-roll with an updated commit message. It wasn't obvious to me at
> all.
When there are questions in response to a patch, there are two
possibilities:
* temporary brainfart --- sorry for the bother
* the clarity of the patch or commit message has room for improvement
This wasn't a case of the former, so a seasoned contributor could
safely assume that it was definitely a case of the latter.
The explanation in Linux kernel's Documentation/SubmittingPatches
item 10 ("Don't get discouraged. Re-submit") has some fitting advice.
Hope that helps,
Jonathan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic
2013-03-28 12:47 ` [PATCH v2] " Ramkumar Ramachandra
2013-03-28 18:57 ` Jonathan Nieder
@ 2013-03-28 20:26 ` Junio C Hamano
2013-03-31 20:59 ` Ramkumar Ramachandra
1 sibling, 1 reply; 21+ messages in thread
From: Junio C Hamano @ 2013-03-28 20:26 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: Git List
Ramkumar Ramachandra <artagnon@gmail.com> writes:
> Running perlcritic with gentle severity reports six problems. The
> following lists the line numbers on which the problems occur, along
> with a description of the problem. This patch fixes them all,
Thanks.
> after
> carefully considering the consequences.
Hmmmm.....
> 516: Contrary to common belief, subroutine prototypes do not enable
> compile-time checks for proper arguments. They serve the singular
> purpose of defining functions that behave like built-in functions, but
> check_file_rev_conflict was never intended to behave like one. We
> have verified that the callers of the subroutines are alright with the
> change.
This, together with the "carefully considering", does not build any
confidence on the part of the reader. Subroutine prototypes are not
for compile-time checks (correct), and they were introduced to the
language only for the purpose of letting you write subroutine that
emulate built-ins like "pop @ary" (again correct),
The most important fact that is not described in the above is that
by using prototype, the subroutine enforces a non-default context at
the callsite when the arguments are evaluated. That is why you can
write an emulated "pop"; otherwise the first @ary will simply be
flattened and you won't grab an element from the array.
Saying "check_file_rev_conflict is not emulating any Perl built-in
function" is irrelevant as a justification for the change. A
subroutine that does not emulate a built-in can still be relying on
the non-default context in which its arguments are evaluated.
sub foo ($) { my ($arg) = @_; print "$arg\n"; }
sub bar { my ($arg) = @_; print "$arg\n"; }
my @baz = (100, 101, 102);
foo @baz; # says 3
bar @baz; # says 100
In general, writing subroutines without prototypes is much
preferred. I do not dispute that and would not argue against
perlcritic. But if you blindly _fix_ the above "foo" subroutine by
dropping its prototype, it changes behaviour if the callers passed
an array variable. You need to check the callers and they are not
doing something to cause the prototyped and unprototyped versions
to behave differently.
And that is what needs to be explained in the log message; not these
handwavy "carefully considering consequences" (what consequences did
you consider?), "was never intended to behave like one" (how does
that matter?) and "the callers of the subroutines are alright" (why
do you think so?).
Without that, the reviewer needs to go and check the callers. Your
log message is _not_ helping them.
Same for the remainder.
In general, you do not have to copy and paste the output from
perlcritic. Treat it more as a learning tool, and use the knowledge
you learned from its output to explain why your changes are
improvements. Not just "because perlcritic said so".
For "ask" subroutine, all its callers assign the returned value to a
single scaler variable, so the difference between "return undef" and
just "return" does not matter. If somebody starts doing
@foo = ask(...);
if (@foo) { ... we got an answer ... } else { ... we did not ... }
then "return undef;" form will break. So it is less error prone if
we dropped the explicit "undef". The same goes for extract_valid_address,
whose current callers all assign the returned value to a single scalar,
or apply "!" operator inside "while" conditional.
The change to validate_address is correct, but it is correct only
because its only caller, validate_address_list, filters out "undef"
returned from map() that calls this subroutine. By dropping the
explicit "undef" from there, it seems to me that validate_address no
longer returns "undef" so validate_address_list loses any need to
filter its return value. Seeing a patch that does not change that
caller while changing the callee makes reviewers wonder what is
going on. Perhaps even with this patch, there still is a need to
filter in validate_address_list, and if so, that needs to be
explained.
If I were doing this change, I would rather leave this subroutine
as-is. Nothing is broken and we are risking new breakages by
changing it.
> 1441: The three-argument form of `open' (introduced in Perl 5.6)
> prevents subtle bugs that occur when the filename starts with funny
> characters like '>' or '<'.
Correct, and this patch is about using the three-or-more-arg form to
take advantage of its safety. So why are we still using the shell
invocation form inherited back from the days we used two-arg form?
Again, seeing a patch that only turns "open FILEHANDLE,EXPR" into
"open FILEHANDLE,MODE,EXPR" when EXPR is not a simple command name
and not into "open FILEHANDLE,MODE,EXPR,LIST" form makes reviewers
wonder why the patch stops in the middle.
> Junio: In future, please tell me explicitly that you're expecting a
> re-roll with an updated commit message. It wasn't obvious to me at
> all.
It wasn't obvious to me, either ;-).
I said the patch was not explained well, but it may not be the only
problem with it. Other people may have inputs to it, and you may
have been waiting for the input from others before initiating a
reroll.
It wasn't like "please fix these and then the result will be perfect
and I'll promise to apply". A maintainer cannot work like that.
I try to make sure there aren't leftover bits from time to time by
sweeping archived e-mails, and also I try to handhold newer
contributors by pinging them about their progress every once in a
while (but you are not exactly new).
This patch fell under the cracks, and reminding me with a "what
happened to it?" was the right thing to do. Literally, that is what
I ask in the "Notes from the maintainer" message.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic
2013-03-28 20:26 ` Junio C Hamano
@ 2013-03-31 20:59 ` Ramkumar Ramachandra
2013-04-01 1:39 ` Junio C Hamano
0 siblings, 1 reply; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-03-31 20:59 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List
Junio C Hamano wrote:
> sub foo ($) { my ($arg) = @_; print "$arg\n"; }
> sub bar { my ($arg) = @_; print "$arg\n"; }
> my @baz = (100, 101, 102);
> foo @baz; # says 3
> bar @baz; # says 100
Ouch. Please drop this patch; I'll resubmit when I feel confident
about my change.
> This patch fell under the cracks, and reminding me with a "what
> happened to it?" was the right thing to do. Literally, that is what
> I ask in the "Notes from the maintainer" message.
Right. Thanks for clarifying. I'll actively track the patches I submit.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic
2013-03-31 20:59 ` Ramkumar Ramachandra
@ 2013-04-01 1:39 ` Junio C Hamano
2013-04-01 1:40 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Junio C Hamano
2013-04-02 7:41 ` [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic Ramkumar Ramachandra
0 siblings, 2 replies; 21+ messages in thread
From: Junio C Hamano @ 2013-04-01 1:39 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: Git List
Ramkumar Ramachandra <artagnon@gmail.com> writes:
> Junio C Hamano wrote:
>> sub foo ($) { my ($arg) = @_; print "$arg\n"; }
>> sub bar { my ($arg) = @_; print "$arg\n"; }
>> my @baz = (100, 101, 102);
>> foo @baz; # says 3
>> bar @baz; # says 100
>
> Ouch. Please drop this patch; I'll resubmit when I feel confident
> about my change.
No, let's not do that. I will forget and end up spending time to
read the same patch again.
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths
2013-04-01 1:39 ` Junio C Hamano
@ 2013-04-01 1:40 ` Junio C Hamano
2013-04-01 1:40 ` [PATCH 2/3] send-email: drop misleading function prototype Junio C Hamano
` (3 more replies)
2013-04-02 7:41 ` [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic Ramkumar Ramachandra
1 sibling, 4 replies; 21+ messages in thread
From: Junio C Hamano @ 2013-04-01 1:40 UTC (permalink / raw)
To: git; +Cc: Ramkumar Ramachandra
From: Ramkumar Ramachandra <artagnon@gmail.com>
All the callers of "ask", "extract_valid_address", and "validate_patch"
subroutines assign the return values from them to a single scaler:
$var = subr(...);
and "return undef;" in these subroutine can safely be turned into a
simpler "return;". Doing so will also future-proof a new caller that
mistakenly does this:
@foo = ask(...);
if (@foo) { ... we got an answer ... } else { ... we did not ... }
Note that we leave "return undef;" in validate_address on purpose,
even though Perlcritic may complain. The primary "return" site of
the function returns whatever is in the scaler variable $address, so
it is pointless to change only the other "return undef;" to "return".
The caller must be prepared to see an array with a single undef as
the return value from this subroutine anyway.
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
git-send-email.perl | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index be809e5..79cc5be 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -711,7 +711,7 @@ sub ask {
}
}
}
- return undef;
+ return;
}
my %broken_encoding;
@@ -833,7 +833,7 @@ sub extract_valid_address {
# less robust/correct than the monster regexp in Email::Valid,
# but still does a 99% job, and one less dependency
return $1 if $address =~ /($local_part_regexp\@$domain_regexp)/;
- return undef;
+ return;
}
sub extract_valid_address_or_die {
@@ -1484,7 +1484,7 @@ sub validate_patch {
return "$.: patch contains a line longer than 998 characters";
}
}
- return undef;
+ return;
}
sub file_has_nonascii {
--
1.8.2-441-g6e6f07b
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 2/3] send-email: drop misleading function prototype
2013-04-01 1:40 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Junio C Hamano
@ 2013-04-01 1:40 ` Junio C Hamano
2013-04-01 2:20 ` Jonathan Nieder
2013-04-01 4:09 ` Eric Sunshine
2013-04-01 1:40 ` [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd Junio C Hamano
` (2 subsequent siblings)
3 siblings, 2 replies; 21+ messages in thread
From: Junio C Hamano @ 2013-04-01 1:40 UTC (permalink / raw)
To: git; +Cc: Ramkumar Ramachandra
From: Ramkumar Ramachandra <artagnon@gmail.com>
The subroutine check_file_rev_conflict() is called from two places,
both of which expects to pass a single scaler variable and see if
that can be interpreted as a pathname or a revision name. It is
defined with a function prototype ($) to force a scaler context
while evaluating the arguments at the calling site but it does not
help the current calling sites. The only effect it has is to hurt
future calling sites that may want to build an argument list in an
array variable and call it as check_file_rev_confict(@args).
Drop the misleading prototype, as Perlcritic suggests.
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
git-send-email.perl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index 79cc5be..86dd593 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -513,7 +513,7 @@ sub split_addrs {
($sender) = expand_aliases($sender) if defined $sender;
# returns 1 if the conflict must be solved using it as a format-patch argument
-sub check_file_rev_conflict($) {
+sub check_file_rev_conflict {
return unless $repo;
my $f = shift;
try {
--
1.8.2-441-g6e6f07b
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd
2013-04-01 1:40 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Junio C Hamano
2013-04-01 1:40 ` [PATCH 2/3] send-email: drop misleading function prototype Junio C Hamano
@ 2013-04-01 1:40 ` Junio C Hamano
2013-04-01 2:30 ` Jonathan Nieder
2013-04-02 7:46 ` Ramkumar Ramachandra
2013-04-01 4:08 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Eric Sunshine
2013-04-02 7:59 ` Ramkumar Ramachandra
3 siblings, 2 replies; 21+ messages in thread
From: Junio C Hamano @ 2013-04-01 1:40 UTC (permalink / raw)
To: git; +Cc: Ramkumar Ramachandra
From: Ramkumar Ramachandra <artagnon@gmail.com>
Perlcritic does not want to see the trailing pipe in the two-args
form of open(), i.e.
open my $fh, "$cmd \Q$file\E |";
If $cmd were a single-token command name, it would make a lot more
sense to use four-or-more-args form "open FILEHANDLE,MODE,CMD,ARGS"
to avoid shell from expanding metacharacters in $file, but we do
expect multi-word string in $to_cmd and $cc_cmd to be expanded by
the shell, so we cannot rewrite it to
open my $fh, "-|", $cmd, $file;
for extra safety. At least, by using this in the three-arg form:
open my $fh, "-|", "$cmd \Q$file\E";
we can silence Perlcritique, even though we do not gain much safety
by doing so.
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
git-send-email.perl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index 86dd593..fb92227 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -1438,7 +1438,7 @@ sub recipients_cmd {
my $sanitized_sender = sanitize_address($sender);
my @addresses = ();
- open my $fh, "$cmd \Q$file\E |"
+ open my $fh, "-|", "$cmd \Q$file\E"
or die "($prefix) Could not execute '$cmd'";
while (my $address = <$fh>) {
$address =~ s/^\s*//g;
--
1.8.2-441-g6e6f07b
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 2/3] send-email: drop misleading function prototype
2013-04-01 1:40 ` [PATCH 2/3] send-email: drop misleading function prototype Junio C Hamano
@ 2013-04-01 2:20 ` Jonathan Nieder
2013-04-01 4:09 ` Eric Sunshine
1 sibling, 0 replies; 21+ messages in thread
From: Jonathan Nieder @ 2013-04-01 2:20 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Ramkumar Ramachandra
Junio C Hamano wrote:
> From: Ramkumar Ramachandra <artagnon@gmail.com>
>
> The subroutine check_file_rev_conflict() is called from two places,
> both of which expects to pass a single scaler variable and see if
> that can be interpreted as a pathname or a revision name. It is
> defined with a function prototype ($) to force a scaler context
> while evaluating the arguments at the calling site but it does not
> help the current calling sites. The only effect it has is to hurt
> future calling sites that may want to build an argument list in an
> array variable and call it as check_file_rev_confict(@args).
>
> Drop the misleading prototype, as Perlcritic suggests.
Nice explanation. Here's a similar patch I wrote before I noticed
your patch, with commit message stolen from the above.
-- >8 --
Subject: send-email: drop misleading function prototype
The subroutine check_file_rev_conflict() is called from two places,
both of which expects to pass a single scaler variable and see if
that can be interpreted as a pathname or a revision name. It is
defined with a function prototype ($) to force a scaler context
while evaluating the arguments at the calling site but it does not
help the current calling sites. The only effect it has is to hurt
future calling sites that may want to build an argument list in an
array variable and call it as check_file_rev_confict(@args).
Drop the misleading prototype, as Perlcritic suggests.
While at it, rename the function to avoid new call sites unaware of
this change arising and add a comment clarifying what this function
is for.
Reported-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
git-send-email.perl | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/git-send-email.perl b/git-send-email.perl
index c3501d98..d6b3c32b 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -512,8 +512,9 @@ sub split_addrs {
($sender) = expand_aliases($sender) if defined $sender;
-# returns 1 if the conflict must be solved using it as a format-patch argument
-sub check_file_rev_conflict($) {
+# is_format_patch_arg($f) returns 0 if $f names a patch, or 1 if
+# $f is a revision list specification to be passed to format-patch.
+sub is_format_patch_arg {
return unless $repo;
my $f = shift;
try {
@@ -529,6 +530,7 @@ ($)
* Giving --format-patch option if you mean a range.
EOF
} catch Git::Error::Command with {
+ # Not a valid revision. Treat it as a filename.
return 0;
}
}
@@ -540,14 +542,14 @@ ($)
if ($f eq "--") {
push @rev_list_opts, "--", @ARGV;
@ARGV = ();
- } elsif (-d $f and !check_file_rev_conflict($f)) {
+ } elsif (-d $f and !is_format_patch_arg($f)) {
opendir my $dh, $f
or die "Failed to opendir $f: $!";
push @files, grep { -f $_ } map { catfile($f, $_) }
sort readdir $dh;
closedir $dh;
- } elsif ((-f $f or -p $f) and !check_file_rev_conflict($f)) {
+ } elsif ((-f $f or -p $f) and !is_format_patch_arg($f)) {
push @files, $f;
} else {
push @rev_list_opts, $f;
--
1.8.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd
2013-04-01 1:40 ` [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd Junio C Hamano
@ 2013-04-01 2:30 ` Jonathan Nieder
2013-04-02 7:46 ` Ramkumar Ramachandra
1 sibling, 0 replies; 21+ messages in thread
From: Jonathan Nieder @ 2013-04-01 2:30 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Ramkumar Ramachandra
Junio C Hamano wrote:
> we cannot rewrite it to
>
> open my $fh, "-|", $cmd, $file;
>
> for extra safety. At least, by using this in the three-arg form:
>
> open my $fh, "-|", "$cmd \Q$file\E";
>
> we can silence Perlcritique, even though we do not gain much safety
> by doing so.
Yeah, I think this is the right thing to do.
This means that if some later code refactoring parses $tocmd once and
passes an array around, it would be easy to change this to
open my $fh, "-|", @$cmd, $file;
and there would be no temptation to do something involving pasting
@$cmd back together into a single string. Of course such a
refactoring is not very likely, but that kind of thing is a good
reason to prefer this style in general.
So for what it's worth, I like this patch.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths
2013-04-01 1:40 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Junio C Hamano
2013-04-01 1:40 ` [PATCH 2/3] send-email: drop misleading function prototype Junio C Hamano
2013-04-01 1:40 ` [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd Junio C Hamano
@ 2013-04-01 4:08 ` Eric Sunshine
2013-04-02 7:59 ` Ramkumar Ramachandra
3 siblings, 0 replies; 21+ messages in thread
From: Eric Sunshine @ 2013-04-01 4:08 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List, Ramkumar Ramachandra
On Sun, Mar 31, 2013 at 9:40 PM, Junio C Hamano <gitster@pobox.com> wrote:
> All the callers of "ask", "extract_valid_address", and "validate_patch"
> subroutines assign the return values from them to a single scaler:
s/scaler/scalar/g
(note the /g)
>
> $var = subr(...);
>
> and "return undef;" in these subroutine can safely be turned into a
> simpler "return;". Doing so will also future-proof a new caller that
> mistakenly does this:
>
> @foo = ask(...);
> if (@foo) { ... we got an answer ... } else { ... we did not ... }
>
> Note that we leave "return undef;" in validate_address on purpose,
> even though Perlcritic may complain. The primary "return" site of
> the function returns whatever is in the scaler variable $address, so
> it is pointless to change only the other "return undef;" to "return".
> The caller must be prepared to see an array with a single undef as
> the return value from this subroutine anyway.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/3] send-email: drop misleading function prototype
2013-04-01 1:40 ` [PATCH 2/3] send-email: drop misleading function prototype Junio C Hamano
2013-04-01 2:20 ` Jonathan Nieder
@ 2013-04-01 4:09 ` Eric Sunshine
1 sibling, 0 replies; 21+ messages in thread
From: Eric Sunshine @ 2013-04-01 4:09 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List, Ramkumar Ramachandra
On Sun, Mar 31, 2013 at 9:40 PM, Junio C Hamano <gitster@pobox.com> wrote:
> The subroutine check_file_rev_conflict() is called from two places,
> both of which expects to pass a single scaler variable and see if
s/scaler/scalar/g
(note the /g)
> that can be interpreted as a pathname or a revision name. It is
> defined with a function prototype ($) to force a scaler context
> while evaluating the arguments at the calling site but it does not
> help the current calling sites. The only effect it has is to hurt
> future calling sites that may want to build an argument list in an
> array variable and call it as check_file_rev_confict(@args).
>
> Drop the misleading prototype, as Perlcritic suggests.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic
2013-04-01 1:39 ` Junio C Hamano
2013-04-01 1:40 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Junio C Hamano
@ 2013-04-02 7:41 ` Ramkumar Ramachandra
1 sibling, 0 replies; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-04-02 7:41 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git List
Junio C Hamano wrote:
> Ramkumar Ramachandra <artagnon@gmail.com> writes:
>> Ouch. Please drop this patch; I'll resubmit when I feel confident
>> about my change.
>
> No, let's not do that. I will forget and end up spending time to
> read the same patch again.
All three look good to me. Thanks for doing this: I learnt quite a
bit from your commit messages.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd
2013-04-01 1:40 ` [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd Junio C Hamano
2013-04-01 2:30 ` Jonathan Nieder
@ 2013-04-02 7:46 ` Ramkumar Ramachandra
1 sibling, 0 replies; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-04-02 7:46 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Junio C Hamano wrote:
> we can silence Perlcritique, even though we do not gain much safety
> by doing so.
Nit: it's perlcritic; critique is used to refer to the output of a critic.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths
2013-04-01 1:40 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Junio C Hamano
` (2 preceding siblings ...)
2013-04-01 4:08 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Eric Sunshine
@ 2013-04-02 7:59 ` Ramkumar Ramachandra
2013-04-02 14:49 ` Junio C Hamano
3 siblings, 1 reply; 21+ messages in thread
From: Ramkumar Ramachandra @ 2013-04-02 7:59 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Junio C Hamano wrote:
> Note that we leave "return undef;" in validate_address on purpose,
> even though Perlcritic may complain. The primary "return" site of
> the function returns whatever is in the scaler variable $address, so
> it is pointless to change only the other "return undef;" to "return".
> The caller must be prepared to see an array with a single undef as
> the return value from this subroutine anyway.
The way I understood it:
All callsites only ever call validate_address via
validate_address_list, which in turn maps a list of addresses by
calling validate_address on each address. Therefore, validate_address
returning an undef in one codepath is correct.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths
2013-04-02 7:59 ` Ramkumar Ramachandra
@ 2013-04-02 14:49 ` Junio C Hamano
0 siblings, 0 replies; 21+ messages in thread
From: Junio C Hamano @ 2013-04-02 14:49 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: git
Ramkumar Ramachandra <artagnon@gmail.com> writes:
> Junio C Hamano wrote:
>> Note that we leave "return undef;" in validate_address on purpose,
>> even though Perlcritic may complain. The primary "return" site of
>> the function returns whatever is in the scaler variable $address, so
>> it is pointless to change only the other "return undef;" to "return".
>> The caller must be prepared to see an array with a single undef as
>> the return value from this subroutine anyway.
>
> The way I understood it:
> All callsites only ever call validate_address via
> validate_address_list, which in turn maps a list of addresses by
> calling validate_address on each address. Therefore, validate_address
> returning an undef in one codepath is correct.
I think we are in agreement then.
The implication of what you just said is that anybody that calls
this subroutine _must_ be (and indeed is) prepared to see a single
'undef' returned from it, hence the use pattern,
@foo = validate_address(...);
if (@foo) { ... we got a valid one ... } else { ... we did not ... }
cannot be used for the subroutine _anyway_. @foo may get an invalid
address, even with the "don't say 'return undef;' say 'return;'"
wisdom is applied to the other return site in the subroutine.
Now, the subroutine's body essentially is:
while (!extract_valid($address)) {
...
if (...) {
return undef; # or just "return;"
}
}
return $address;
You can prove that the "return $address" on the last line will never
return 'undef' by proving that extract_valid() never returns true
for 'undef' input. With that, we can safely change the error return
to do "return;" in the loop.
When it is done, the subroutine's new interface becomes "Single
address goes in, either a single valid address comes out and that
will never be an undef, or nothing (not even an undef) comes out
upon error".
Which means the sole caller of the subroutine needs to be updated,
which currently does this:
return grep { defined $_ } map { validate_address($_) } @_;
As the subroutine never returns an undef as "no this is not valid",
but acts more like a filter to cull bad ones from the input, the
outer grep { defined $_ } becomes unnecessary.
And I think that change logically belongs to the same patch as the
one that inspects how validate_address behaves and updates its
"sometimes we return undef to signal a bad input" to return nothing.
That is why validate_adress was excluded from [1/3] which deals with
other simpler cases.
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2013-04-02 14:50 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-21 12:39 [PATCH] git-send-email.perl: implement suggestions made by perlcritic Ramkumar Ramachandra
2013-03-21 15:29 ` Junio C Hamano
2013-03-21 16:51 ` Ramkumar Ramachandra
2013-03-27 17:13 ` Ramkumar Ramachandra
2013-03-27 17:38 ` Junio C Hamano
2013-03-28 12:47 ` [PATCH v2] " Ramkumar Ramachandra
2013-03-28 18:57 ` Jonathan Nieder
2013-03-28 20:26 ` Junio C Hamano
2013-03-31 20:59 ` Ramkumar Ramachandra
2013-04-01 1:39 ` Junio C Hamano
2013-04-01 1:40 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Junio C Hamano
2013-04-01 1:40 ` [PATCH 2/3] send-email: drop misleading function prototype Junio C Hamano
2013-04-01 2:20 ` Jonathan Nieder
2013-04-01 4:09 ` Eric Sunshine
2013-04-01 1:40 ` [PATCH 3/3] send-email: use the three-arg form of open in recipients_cmd Junio C Hamano
2013-04-01 2:30 ` Jonathan Nieder
2013-04-02 7:46 ` Ramkumar Ramachandra
2013-04-01 4:08 ` [PATCH 1/3] send-email: use "return;" not "return undef;" on error codepaths Eric Sunshine
2013-04-02 7:59 ` Ramkumar Ramachandra
2013-04-02 14:49 ` Junio C Hamano
2013-04-02 7:41 ` [PATCH v2] git-send-email.perl: implement suggestions made by perlcritic Ramkumar Ramachandra
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 NNTP newsgroup(s).