* [PATCH 0/6] cleanups for git-send-email @ 2009-04-29 13:12 Bill Pemberton 2009-04-29 13:12 ` [PATCH 1/6] Remove return undef from validate_patch Bill Pemberton 2009-04-29 19:18 ` [PATCH 0/6] cleanups for git-send-email Junio C Hamano 0 siblings, 2 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 13:12 UTC (permalink / raw) To: git; +Cc: gitster, Bill Pemberton The following are some code cleanups for git-send-email.perl. They're based on suggestions by perlcritc. Bill Pemberton (6): Remove return undef from validate_patch Remove function prototypes from git-send-email.perl Remove return undef from ask() Add explict return to end of subroutines Remove mix of high and low-precedence booleans Remove bareword filehandles in git-send-email.perl git-send-email.perl | 63 ++++++++++++++++++++++++++------------------------ 1 files changed, 33 insertions(+), 30 deletions(-) ^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 1/6] Remove return undef from validate_patch 2009-04-29 13:12 [PATCH 0/6] cleanups for git-send-email Bill Pemberton @ 2009-04-29 13:12 ` Bill Pemberton 2009-04-29 13:12 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Bill Pemberton 2009-05-03 19:46 ` [PATCH 1/6] Remove return undef from validate_patch Jeff King 2009-04-29 19:18 ` [PATCH 0/6] cleanups for git-send-email Junio C Hamano 1 sibling, 2 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 13:12 UTC (permalink / raw) To: git; +Cc: gitster, Bill Pemberton Returning undef is rarely the correct way to return a failure. Replace it with return 0 Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> --- git-send-email.perl | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index cccbf45..4f62c59 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -1182,7 +1182,7 @@ sub validate_patch { return "$.: patch contains a line longer than 998 characters"; } } - return undef; + return 0; } sub file_has_nonascii { -- 1.6.0.6 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 2/6] Remove function prototypes from git-send-email.perl 2009-04-29 13:12 ` [PATCH 1/6] Remove return undef from validate_patch Bill Pemberton @ 2009-04-29 13:12 ` Bill Pemberton 2009-04-29 13:12 ` [PATCH 3/6] Remove return undef from ask() Bill Pemberton 2009-05-03 20:27 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Jeff King 2009-05-03 19:46 ` [PATCH 1/6] Remove return undef from validate_patch Jeff King 1 sibling, 2 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 13:12 UTC (permalink / raw) To: git; +Cc: gitster, Bill Pemberton Use of function prototypes is considered bad practice in perl. The ones used here didn't accomplish anything anyhow, so they've been removed. Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> --- git-send-email.perl | 11 ++++------- 1 files changed, 4 insertions(+), 7 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 4f62c59..067aaf0 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -131,9 +131,6 @@ my $have_mail_address = eval { require Mail::Address; 1 }; my $smtp; my $auth; -sub unique_email_list(@); -sub cleanup_compose_files(); - # Variables we fill in automatically, or via prompting: my (@to,@cc,@initial_cc,@bcclist,@xh, $initial_reply_to,$initial_subject,@files, @@ -443,7 +440,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 { @@ -509,7 +506,7 @@ if (@files) { usage(); } -sub get_patch_subject($) { +sub get_patch_subject { my $fn = shift; open (my $fh, '<', $fn); while (my $line = <$fh>) { @@ -1150,13 +1147,13 @@ foreach my $t (@files) { cleanup_compose_files(); -sub cleanup_compose_files() { +sub cleanup_compose_files { unlink($compose_filename, $compose_filename . ".final") if $compose; } $smtp->quit if $smtp; -sub unique_email_list(@) { +sub unique_email_list { my %seen; my @emails; -- 1.6.0.6 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 3/6] Remove return undef from ask() 2009-04-29 13:12 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Bill Pemberton @ 2009-04-29 13:12 ` Bill Pemberton 2009-04-29 13:12 ` [PATCH 4/6] Add explict return to end of subroutines Bill Pemberton 2009-05-03 20:26 ` [PATCH 3/6] Remove return undef from ask() Jeff King 2009-05-03 20:27 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Jeff King 1 sibling, 2 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 13:12 UTC (permalink / raw) To: git; +Cc: gitster, Bill Pemberton Returning undef is rarely the correct way to return a failure. Replace it with bare return Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> --- git-send-email.perl | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 067aaf0..1ed5869 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -633,7 +633,7 @@ sub ask { return $resp; } } - return undef; + return; } my $prompting = 0; -- 1.6.0.6 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 4/6] Add explict return to end of subroutines 2009-04-29 13:12 ` [PATCH 3/6] Remove return undef from ask() Bill Pemberton @ 2009-04-29 13:12 ` Bill Pemberton 2009-04-29 13:12 ` [PATCH 5/6] Remove mix of high and low-precedence booleans Bill Pemberton 2009-05-03 20:31 ` [PATCH 4/6] Add explict return to end of subroutines Jeff King 2009-05-03 20:26 ` [PATCH 3/6] Remove return undef from ask() Jeff King 1 sibling, 2 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 13:12 UTC (permalink / raw) To: git; +Cc: gitster, Bill Pemberton In perl a subroutine that ends without an explicit return will return the value of the last expression evalutated. This can lead to unexpected return values. Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> --- git-send-email.perl | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 1ed5869..c24e0df 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -160,6 +160,7 @@ my $compose_filename; # Handle interactive edition of files. my $multiedit; my $editor = $ENV{GIT_EDITOR} || Git::config(@repo, "core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi"; + sub do_edit { if (defined($multiedit) && !$multiedit) { map { @@ -174,6 +175,7 @@ sub do_edit { die("the editor exited uncleanly, aborting everything"); } } + return; } # Variables with corresponding config settings @@ -304,6 +306,7 @@ sub read_config { $smtp_encryption = 'ssl'; } } + return; } # read configuration from [sendemail "$identity"], fall back on [sendemail] @@ -745,6 +748,7 @@ sub make_message_id my $message_id_template = "<%s-git-send-email-%s>"; $message_id = sprintf($message_id_template, $uniq, $du_part); #print "new message id = $message_id\n"; # Was useful for debugging + return; } @@ -971,6 +975,7 @@ X-Mailer: git-send-email $gitversion print "Result: OK\n"; } } + return; } $reply_to = $initial_reply_to; @@ -1149,6 +1154,7 @@ cleanup_compose_files(); sub cleanup_compose_files { unlink($compose_filename, $compose_filename . ".final") if $compose; + return; } $smtp->quit if $smtp; -- 1.6.0.6 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 5/6] Remove mix of high and low-precedence booleans 2009-04-29 13:12 ` [PATCH 4/6] Add explict return to end of subroutines Bill Pemberton @ 2009-04-29 13:12 ` Bill Pemberton 2009-04-29 13:12 ` [PATCH 6/6] Remove bareword filehandles in git-send-email.perl Bill Pemberton 2009-04-29 16:54 ` [PATCH 5/6] Re: Remove mix of high and low-precedence booleans Nicolas Sebrecht 2009-05-03 20:31 ` [PATCH 4/6] Add explict return to end of subroutines Jeff King 1 sibling, 2 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 13:12 UTC (permalink / raw) To: git; +Cc: gitster, Bill Pemberton Booleans such as &&, ||, ! have higher precedence than and, or, not. They should not be mixed. Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> --- git-send-email.perl | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index c24e0df..5e7295d 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -471,14 +471,14 @@ while (defined(my $f = shift @ARGV)) { if ($f eq "--") { push @rev_list_opts, "--", @ARGV; @ARGV = (); - } elsif (-d $f and !check_file_rev_conflict($f)) { + } elsif (-d $f && !check_file_rev_conflict($f)) { opendir(DH,$f) or die "Failed to opendir $f: $!"; push @files, grep { -f $_ } map { +$f . "/" . $_ } sort readdir(DH); closedir(DH); - } elsif ((-f $f or -p $f) and !check_file_rev_conflict($f)) { + } elsif ((-f $f || -p $f) && !check_file_rev_conflict($f)) { push @files, $f; } else { push @rev_list_opts, $f; @@ -632,7 +632,7 @@ sub ask { if ($resp eq '' and defined $default) { return $default; } - if (!defined $valid_re or $resp =~ /$valid_re/) { + if (!defined $valid_re || $resp =~ /$valid_re/) { return $resp; } } -- 1.6.0.6 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH 6/6] Remove bareword filehandles in git-send-email.perl 2009-04-29 13:12 ` [PATCH 5/6] Remove mix of high and low-precedence booleans Bill Pemberton @ 2009-04-29 13:12 ` Bill Pemberton 2009-05-03 20:58 ` Jeff King 2009-04-29 16:54 ` [PATCH 5/6] Re: Remove mix of high and low-precedence booleans Nicolas Sebrecht 1 sibling, 1 reply; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 13:12 UTC (permalink / raw) To: git; +Cc: gitster, Bill Pemberton The script was using bareword filehandles. This is considered a bad practice so they have been changed to indirect filehandles. Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> --- git-send-email.perl | 36 ++++++++++++++++++------------------ 1 files changed, 18 insertions(+), 18 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 5e7295d..7068041 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -527,7 +527,7 @@ if ($compose) { $compose_filename = ($repo ? tempfile(".gitsendemail.msg.XXXXXX", DIR => $repo->repo_path()) : tempfile(".gitsendemail.msg.XXXXXX", DIR => "."))[1]; - open(C,">",$compose_filename) + open my $C,'>',$compose_filename or die "Failed to open for writing $compose_filename: $!"; @@ -535,7 +535,7 @@ if ($compose) { my $tpl_subject = $initial_subject || ''; my $tpl_reply_to = $initial_reply_to || ''; - print C <<EOT; + print {$C} <<EOT; From $tpl_sender # This line is ignored. GIT: Lines beginning in "GIT: " will be removed. GIT: Consider including an overall diffstat or table of contents @@ -548,9 +548,9 @@ In-Reply-To: $tpl_reply_to EOT for my $f (@files) { - print C get_patch_subject($f); + print {$C} get_patch_subject($f); } - close(C); + close($C); my $editor = $ENV{GIT_EDITOR} || Git::config(@repo, "core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi"; @@ -560,23 +560,23 @@ EOT do_edit($compose_filename); } - open(C2,">",$compose_filename . ".final") + open my $C2,'>',$compose_filename . ".final" or die "Failed to open $compose_filename.final : " . $!; - open(C,"<",$compose_filename) + open $C, '<',$compose_filename or die "Failed to open $compose_filename : " . $!; my $need_8bit_cte = file_has_nonascii($compose_filename); my $in_body = 0; my $summary_empty = 1; - while(<C>) { + while(<$C>) { next if m/^GIT: /; if ($in_body) { $summary_empty = 0 unless (/^\n$/); } elsif (/^\n$/) { $in_body = 1; if ($need_8bit_cte) { - print C2 "MIME-Version: 1.0\n", + print {$C2} "MIME-Version: 1.0\n", "Content-Type: text/plain; ", "charset=utf-8\n", "Content-Transfer-Encoding: 8bit\n"; @@ -601,10 +601,10 @@ EOT print "To/Cc/Bcc fields are not interpreted yet, they have been ignored\n"; next; } - print C2 $_; + print {$C2} $_; } - close(C); - close(C2); + close($C); + close($C2); if ($summary_empty) { print "Summary email is empty, skipping it\n"; @@ -984,7 +984,7 @@ $subject = $initial_subject; $message_num = 0; foreach my $t (@files) { - open(F,"<",$t) or die "can't open file $t"; + open my $F,'<',$t or die "can't open file $t"; my $author = undef; my $author_encoding; @@ -997,7 +997,7 @@ foreach my $t (@files) { $message = ""; $message_num++; # First unfold multiline header fields - while(<F>) { + while(<$F>) { last if /^\s*$/; if (/^\s+\S/ and @header) { chomp($header[$#header]); @@ -1073,7 +1073,7 @@ foreach my $t (@files) { } } # Now parse the message body - while(<F>) { + while(<$F>) { $message .= $_; if (/^(Signed-off-by|Cc): (.*)$/i) { chomp; @@ -1090,12 +1090,12 @@ foreach my $t (@files) { $c, $_) unless $quiet; } } - close F; + close $F; if (defined $cc_cmd && !$suppress_cc{'cccmd'}) { - open(F, "$cc_cmd $t |") + open my $F, '-|', "$cc_cmd $t" or die "(cc-cmd) Could not execute '$cc_cmd'"; - while(<F>) { + while(<$F>) { my $c = $_; $c =~ s/^\s*//g; $c =~ s/\n$//g; @@ -1104,7 +1104,7 @@ foreach my $t (@files) { printf("(cc-cmd) Adding cc: %s from: '%s'\n", $c, $cc_cmd) unless $quiet; } - close F + close $F or die "(cc-cmd) failed to close pipe to '$cc_cmd'"; } -- 1.6.0.6 ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 6/6] Remove bareword filehandles in git-send-email.perl 2009-04-29 13:12 ` [PATCH 6/6] Remove bareword filehandles in git-send-email.perl Bill Pemberton @ 2009-05-03 20:58 ` Jeff King 2009-05-03 21:34 ` Francis Galiegue 0 siblings, 1 reply; 24+ messages in thread From: Jeff King @ 2009-05-03 20:58 UTC (permalink / raw) To: Bill Pemberton; +Cc: git, gitster On Wed, Apr 29, 2009 at 09:12:23AM -0400, Bill Pemberton wrote: > The script was using bareword filehandles. This is considered a bad > practice so they have been changed to indirect filehandles. I think this is a real improvement; using indirect filehandles mean they get scoped properly, which can avoid errors (especially forgetting to close() them, which happens automagically when they go out of scope). Assuming, of course, that the scoping added by your change is correct, and doesn't close a handle during a loop that we may have wanted to keep open (I didn't check carefully). But in the patch itself: > - open(C,">",$compose_filename) > + open my $C,'>',$compose_filename There are actually two things happening here: 1. s/C/my $C/, which I think is good 2. losing the parentheses around open(). This is a style issue, but I think we usually prefer the parenthesized form of most perl builtins (and certainly in the absence of other information, it should be left as-is). And the style thing that probably _should_ be changed is the spacing: we typically have a space between function arguments. So: open(my $C, '>', $compose_file) > - print C <<EOT; > + print {$C} <<EOT; Are the braces really necessary here? Is there a version of perl on which print $C <<EOT; will not work? -Peff ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 6/6] Remove bareword filehandles in git-send-email.perl 2009-05-03 20:58 ` Jeff King @ 2009-05-03 21:34 ` Francis Galiegue 2009-05-04 6:12 ` H.Merijn Brand 0 siblings, 1 reply; 24+ messages in thread From: Francis Galiegue @ 2009-05-03 21:34 UTC (permalink / raw) To: Jeff King; +Cc: Bill Pemberton, git, gitster Le Sunday 03 May 2009 22:58:26 Jeff King, vous avez écrit : > On Wed, Apr 29, 2009 at 09:12:23AM -0400, Bill Pemberton wrote: > > The script was using bareword filehandles. This is considered a bad > > practice so they have been changed to indirect filehandles. > > I think this is a real improvement; using indirect filehandles mean they > get scoped properly, which can avoid errors (especially forgetting to > close() them, which happens automagically when they go out of scope). > Assuming, of course, that the scoping added by your change is correct, > and doesn't close a handle during a loop that we may have wanted to keep > open (I didn't check carefully). > > But in the patch itself: > > - open(C,">",$compose_filename) > > + open my $C,'>',$compose_filename > > There are actually two things happening here: > > 1. s/C/my $C/, which I think is good > > 2. losing the parentheses around open(). This is a style issue, but I > think we usually prefer the parenthesized form of most perl > builtins (and certainly in the absence of other information, it > should be left as-is). > And why not go the full way and using IO::File? my $fh = new IO::File; $fh->open("/the/file", O_RDONLY|...) -- Francis Galiegue fge@one2team.com Ingénieur système Mob : +33 (0) 683 877 875 Tel : +33 (0) 178 945 552 One2team 40 avenue Raymond Poincaré 75116 Paris ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 6/6] Remove bareword filehandles in git-send-email.perl 2009-05-03 21:34 ` Francis Galiegue @ 2009-05-04 6:12 ` H.Merijn Brand 2009-05-04 6:53 ` Francis Galiegue 0 siblings, 1 reply; 24+ messages in thread From: H.Merijn Brand @ 2009-05-04 6:12 UTC (permalink / raw) To: Francis Galiegue; +Cc: Jeff King, Bill Pemberton, git, gitster On Sun, 3 May 2009 23:34:03 +0200, Francis Galiegue <fge@one2team.com> wrote: > Le Sunday 03 May 2009 22:58:26 Jeff King, vous avez écrit : > > On Wed, Apr 29, 2009 at 09:12:23AM -0400, Bill Pemberton wrote: > > > The script was using bareword filehandles. This is considered a bad > > > practice so they have been changed to indirect filehandles. > > > > I think this is a real improvement; using indirect filehandles mean they > > get scoped properly, which can avoid errors (especially forgetting to > > close() them, which happens automagically when they go out of scope). > > Assuming, of course, that the scoping added by your change is correct, > > and doesn't close a handle during a loop that we may have wanted to keep > > open (I didn't check carefully). > > > > But in the patch itself: > > > - open(C,">",$compose_filename) > > > + open my $C,'>',$compose_filename > > > > There are actually two things happening here: > > > > 1. s/C/my $C/, which I think is good > > > > 2. losing the parentheses around open(). This is a style issue, but I > > think we usually prefer the parenthesized form of most perl > > builtins (and certainly in the absence of other information, it > > should be left as-is). > > > > And why not go the full way and using IO::File? Because that would be travelling back in time. The most efficient and preferred way is three-arg lexical: open my $fh, "<", $filename or die "$filename: $!"; while (<$fh>) { # ... } close $fh or die "$filename: $!"; give or take quoting style, some spaces and/or indents > my $fh = new IO::File; > > $fh->open("/the/file", O_RDONLY|...) Why use a module for something that is neatly buit in? -- H.Merijn Brand http://tux.nl Perl Monger http://amsterdam.pm.org/ using & porting perl 5.6.2, 5.8.x, 5.10.x, 5.11.x on HP-UX 10.20, 11.00, 11.11, 11.23, and 11.31, OpenSuSE 10.3, 11.0, and 11.1, AIX 5.2 and 5.3. http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/ http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 6/6] Remove bareword filehandles in git-send-email.perl 2009-05-04 6:12 ` H.Merijn Brand @ 2009-05-04 6:53 ` Francis Galiegue 2009-05-04 7:41 ` H.Merijn Brand 0 siblings, 1 reply; 24+ messages in thread From: Francis Galiegue @ 2009-05-04 6:53 UTC (permalink / raw) To: H.Merijn Brand; +Cc: Jeff King, Bill Pemberton, git, gitster Le lundi 04 mai 2009, vous avez écrit : [...] > > > > And why not go the full way and using IO::File? > > Because that would be travelling back in time. > The most efficient and preferred way is three-arg lexical: > > open my $fh, "<", $filename or die "$filename: $!"; > while (<$fh>) { > # ... > } > close $fh or die "$filename: $!"; > I don't see how using IO::File is going back in time at all. It's a standard perl module, even in 5.10. > > > my $fh = new IO::File; > > > > $fh->open("/the/file", O_RDONLY|...) > > Why use a module for something that is neatly buit in? > Because it reads better? YMMV, of course. I prefer using IO::File because perl has too many keywords for its own good :p -- Francis Galiegue ONE2TEAM Ingénieur système Mob : +33 (0) 683 877 875 Tel : +33 (0) 178 945 552 fge@one2team.com 40 avenue Raymond Poincaré 75116 Paris ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 6/6] Remove bareword filehandles in git-send-email.perl 2009-05-04 6:53 ` Francis Galiegue @ 2009-05-04 7:41 ` H.Merijn Brand 0 siblings, 0 replies; 24+ messages in thread From: H.Merijn Brand @ 2009-05-04 7:41 UTC (permalink / raw) To: Francis Galiegue; +Cc: Jeff King, Bill Pemberton, git, gitster On Mon, 4 May 2009 08:53:44 +0200, Francis Galiegue <fge@one2team.com> wrote: > Le lundi 04 mai 2009, vous avez écrit : > [...] > > > > > > And why not go the full way and using IO::File? > > > > Because that would be travelling back in time. > > The most efficient and preferred way is three-arg lexical: > > > > open my $fh, "<", $filename or die "$filename: $!"; > > while (<$fh>) { > > # ... > > } > > close $fh or die "$filename: $!"; > > > > I don't see how using IO::File is going back in time at all. It's > a standard perl module, even in 5.10. It was written to be able to have lexical handles and pass them around. With the above implementation you don't need to read a 600+ line module to have every file action go through methods that are not needed at all, and you also do not have to read the documentation for the deviating syntax. I'd rather stick to simple, easy and standard. > > > my $fh = new IO::File; > > > $fh->open("/the/file", O_RDONLY|...) > > > > Why use a module for something that is neatly buit in? > > Because it reads better? YMMV, of course. Because it is more efficient? And yes, it reads better, because it is used in a zillion places already. > I prefer using IO::File because perl has too many keywords for its > own good :p In the syntax I wrote down are now new keywords at all. -- H.Merijn Brand http://tux.nl Perl Monger http://amsterdam.pm.org/ using & porting perl 5.6.2, 5.8.x, 5.10.x, 5.11.x on HP-UX 10.20, 11.00, 11.11, 11.23, and 11.31, OpenSuSE 10.3, 11.0, and 11.1, AIX 5.2 and 5.3. http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/ http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 5/6] Re: Remove mix of high and low-precedence booleans 2009-04-29 13:12 ` [PATCH 5/6] Remove mix of high and low-precedence booleans Bill Pemberton 2009-04-29 13:12 ` [PATCH 6/6] Remove bareword filehandles in git-send-email.perl Bill Pemberton @ 2009-04-29 16:54 ` Nicolas Sebrecht 2009-04-29 17:00 ` Bill Pemberton 1 sibling, 1 reply; 24+ messages in thread From: Nicolas Sebrecht @ 2009-04-29 16:54 UTC (permalink / raw) To: Bill Pemberton; +Cc: git, gitster On Wed, Apr 29, 2009 at 09:12:22AM -0400, Bill Pemberton wrote: > Booleans such as &&, ||, ! have higher precedence than and, or, not. > They should not be mixed. But round brackets have higher precedence than both '&&' and 'and', right? If so, why thoses changes? > - } elsif (-d $f and !check_file_rev_conflict($f)) { > + } elsif (-d $f && !check_file_rev_conflict($f)) { > - } elsif ((-f $f or -p $f) and !check_file_rev_conflict($f)) { > + } elsif ((-f $f || -p $f) && !check_file_rev_conflict($f)) { > - if (!defined $valid_re or $resp =~ /$valid_re/) { > + if (!defined $valid_re || $resp =~ /$valid_re/) { -- Nicolas Sebrecht ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 5/6] Re: Remove mix of high and low-precedence booleans 2009-04-29 16:54 ` [PATCH 5/6] Re: Remove mix of high and low-precedence booleans Nicolas Sebrecht @ 2009-04-29 17:00 ` Bill Pemberton 0 siblings, 0 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 17:00 UTC (permalink / raw) To: Nicolas Sebrecht; +Cc: git, gitster > > Booleans such as &&, ||, ! have higher precedence than and, or, not. > > They should not be mixed. > > But round brackets have higher precedence than both '&&' and 'and', > right? If so, why thoses changes? > While those particular statements may be correct, mixing the low precedence logical operators with the high precedence ones is likely to introduce bugs down the road. See the book "Perl Best Practices" for more information on this. -- Bill ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 4/6] Add explict return to end of subroutines 2009-04-29 13:12 ` [PATCH 4/6] Add explict return to end of subroutines Bill Pemberton 2009-04-29 13:12 ` [PATCH 5/6] Remove mix of high and low-precedence booleans Bill Pemberton @ 2009-05-03 20:31 ` Jeff King 1 sibling, 0 replies; 24+ messages in thread From: Jeff King @ 2009-05-03 20:31 UTC (permalink / raw) To: Bill Pemberton; +Cc: git, gitster On Wed, Apr 29, 2009 at 09:12:21AM -0400, Bill Pemberton wrote: > In perl a subroutine that ends without an explicit return will return > the value of the last expression evalutated. This can lead to > unexpected return values. I am not opposed to this, but it is really not helping anything. These functions aren't meant to return any value, and their return values are not used. In C, they would simply be declared "void", but there is no way (AFAIK) to do that in perl. But for some of them, I wonder if you would do better instead of returning _nothing_ to return something that might make a little bit of sense. For example, make_message_id munges a global variable. A useful refactoring might be to have it return the value of the global variable, and then perhaps even the global could go away, which _would_ be a real improvement. -Peff ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/6] Remove return undef from ask() 2009-04-29 13:12 ` [PATCH 3/6] Remove return undef from ask() Bill Pemberton 2009-04-29 13:12 ` [PATCH 4/6] Add explict return to end of subroutines Bill Pemberton @ 2009-05-03 20:26 ` Jeff King 2009-05-04 2:26 ` Jay Soffian 1 sibling, 1 reply; 24+ messages in thread From: Jeff King @ 2009-05-03 20:26 UTC (permalink / raw) To: Bill Pemberton; +Cc: Jay Soffian, git, gitster On Wed, Apr 29, 2009 at 09:12:20AM -0400, Bill Pemberton wrote: > Returning undef is rarely the correct way to return a failure. > Replace it with bare return I'm not sure this makes sense. The function is meant to be (and is always) called in a scalar context, so "return" and "return undef" produce exactly the same results. I find the latter much more clear, because it is explicit about what the function is doing: return the user's desire; if that fails, return the default; if no default, return undef. Returning undef can be a problem for programs which are meant to be used in list context; you generally want to return the empty list in that case (not a list with a single undef in it). So that is the reason for the advice you are quoting. I am not sure it is worth making this function behave properly in a list context; it is not a library function, so we can see that all of the existing callers use it in a scalar context (and we would have to define sensible semantics for a list context). But even if we _did_ want to do that, your patch is only the first step. You would have to also fix the other returns which can return undef instead of an empty list. So there is not much point to your patch as it stands. On a side note, while looking at this function, I wonder if that "return undef" is correct after all. We get there only if the user has failed to give valid input 10 times, so presumably it is a sanity check to prevent runaway input errors (and I am cc'ing Jay, who added the function not too long ago). Should we be respecting the default here, as we do when we get EOF? Although I tend to think if the user is repeatedly giving us bogus input that we should not just proceed, but should probably die. Because otherwise we are guessing at what they might have wanted. -Peff ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 3/6] Remove return undef from ask() 2009-05-03 20:26 ` [PATCH 3/6] Remove return undef from ask() Jeff King @ 2009-05-04 2:26 ` Jay Soffian 0 siblings, 0 replies; 24+ messages in thread From: Jay Soffian @ 2009-05-04 2:26 UTC (permalink / raw) To: Jeff King; +Cc: Bill Pemberton, git, gitster On Sun, May 3, 2009 at 4:26 PM, Jeff King <peff@peff.net> wrote: > On a side note, while looking at this function, I wonder if that "return > undef" is correct after all. We get there only if the user has failed to > give valid input 10 times, so presumably it is a sanity check to > prevent runaway input errors Correct, that is why it is there. > (and I am cc'ing Jay, who added the > function not too long ago). Should we be respecting the default here, as > we do when we get EOF? The original motivation was a user who was running send-email from cron and it was looping forever. That case is now actually handled before the loop, and all other normal cases are handled inside the loop. So the only thing that can cause the loop to exit (AFAIK) is when $valid_re is passed in and the user provides invalid input 10x. > Although I tend to think if the user is > repeatedly giving us bogus input that we should not just proceed, but > should probably die. Because otherwise we are guessing at what they > might have wanted. Well, it returns undef, at which point it's up to the caller to figure out what to do. You'll notice the one caller which passes in $valid_re dies: die "Send this email reply required" unless defined $_; Letting the caller decide what to do provides more flexibility. j. ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 2/6] Remove function prototypes from git-send-email.perl 2009-04-29 13:12 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Bill Pemberton 2009-04-29 13:12 ` [PATCH 3/6] Remove return undef from ask() Bill Pemberton @ 2009-05-03 20:27 ` Jeff King 1 sibling, 0 replies; 24+ messages in thread From: Jeff King @ 2009-05-03 20:27 UTC (permalink / raw) To: Bill Pemberton; +Cc: git, gitster On Wed, Apr 29, 2009 at 09:12:19AM -0400, Bill Pemberton wrote: > Use of function prototypes is considered bad practice in perl. The > ones used here didn't accomplish anything anyhow, so they've been > removed. > > Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> I think this one is sensible. -Peff ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 1/6] Remove return undef from validate_patch 2009-04-29 13:12 ` [PATCH 1/6] Remove return undef from validate_patch Bill Pemberton 2009-04-29 13:12 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Bill Pemberton @ 2009-05-03 19:46 ` Jeff King 1 sibling, 0 replies; 24+ messages in thread From: Jeff King @ 2009-05-03 19:46 UTC (permalink / raw) To: Bill Pemberton; +Cc: git, gitster On Wed, Apr 29, 2009 at 09:12:18AM -0400, Bill Pemberton wrote: > Returning undef is rarely the correct way to return a failure. > Replace it with return 0 No, it's the right way to return failure here. The function returns either an error string, prefixed with the problematic line number, or undef. So 'undef' is working as a sentinel value here, not as part of a boolean. That being said, the _calling_ code is a bit sloppy in checking "$error" instead of "defined($error)". It is not an actual bug because the beginning of the string is always a line number >= 1, so it always triggers as desired. However, it would probably be more clear to write it like this: --- diff --git a/git-send-email.perl b/git-send-email.perl index cccbf45..168b2c2 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -495,7 +495,7 @@ if ($validate) { foreach my $f (@files) { unless (-p $f) { my $error = validate_patch($f); - $error and die "fatal: $f: $error\nwarning: no patches were sent\n"; + defined($error) and die "fatal: $f: $error\nwarning: no patches were sent\n"; } } } ^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH 0/6] cleanups for git-send-email 2009-04-29 13:12 [PATCH 0/6] cleanups for git-send-email Bill Pemberton 2009-04-29 13:12 ` [PATCH 1/6] Remove return undef from validate_patch Bill Pemberton @ 2009-04-29 19:18 ` Junio C Hamano 2009-04-29 19:48 ` Bill Pemberton 1 sibling, 1 reply; 24+ messages in thread From: Junio C Hamano @ 2009-04-29 19:18 UTC (permalink / raw) To: Bill Pemberton; +Cc: git Bill Pemberton <wfp5p@virginia.edu> writes: > The following are some code cleanups for git-send-email.perl. They're > based on suggestions by perlcritc. > > Bill Pemberton (6): > Remove return undef from validate_patch > Remove function prototypes from git-send-email.perl > Remove return undef from ask() > Add explict return to end of subroutines > Remove mix of high and low-precedence booleans > Remove bareword filehandles in git-send-email.perl Perl styles are highly personal. While I admit that the changes these patches bring in match my personal taste more or less exactly [*1*], there was somebody (sorry I lost track) who volunteered to take the maintenance responsibility of that program over to clean up or even rewrite it, so I would rather have that person have a say in the overall styles of the (rewritten) program. [Footnote] *1* ...except for the "and/or vs &&/||" bits, even though I prefer the latter myself solely because I am old fashioned. I think it is simply silly to say "precedence of ! and and/or does not mix". "!" and "&&" have different precedence and rewriting (A and !B) into (A && !B) would not make things any better nor worse. After all, nobody would have problems with "$a + $b * $c" even though + and * have different precedence. Oh, I also do not agree with "always explicitly return". If the change and explanation were limited to the subs whose return values are _used_, I would agree with the change, though. ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/6] cleanups for git-send-email 2009-04-29 19:18 ` [PATCH 0/6] cleanups for git-send-email Junio C Hamano @ 2009-04-29 19:48 ` Bill Pemberton 2009-04-29 20:23 ` Junio C Hamano 2009-04-29 22:27 ` [PATCH 0/6] " Nicolas Sebrecht 0 siblings, 2 replies; 24+ messages in thread From: Bill Pemberton @ 2009-04-29 19:48 UTC (permalink / raw) To: Junio C Hamano; +Cc: git > Perl styles are highly personal. > So are C styles, but the kernel and git doesn't allow all sorts of mixed styles. My changes are also not just coding style, they have actual meaning in perl. My changes come directly from the book "Perl Best Practices". Just as you do things like "don't allow assignment in conditionals" in C, even though it's legal. There are good reasons to do these things in perl to prevent bugs down the road. > > *1* ...except for the "and/or vs &&/||" bits, even though I prefer the > latter myself solely because I am old fashioned. > Again, it prevents bugs. People use "and" vs "&&" as the same thing, when they are not. The have different precedence in perl. For example, next if not $finished || $x < 5; next if !$finished || $x < 5; do not mean the same thing. > I think it is simply silly to say "precedence of ! and and/or does not > mix". "!" and "&&" have different precedence and rewriting (A and !B) > into (A && !B) would not make things any better nor worse. After all, > nobody would have problems with "$a + $b * $c" even though + and * have > different precedence. > It's not that ! and && have different precedence. It's that "not" and ! have different precedence. Using your math example, it would be like having an operator named plus that had a higher precedence than "*". Now if you wrote "$a plus $b * $c" it would have different result than "$a + $b * $c". > Oh, I also do not agree with "always explicitly return". If the change > and explanation were limited to the subs whose return values are _used_, I > would agree with the change, though. > Again, it prevents potential bugs down the road. Currently those functions return something. While they are not used, the something they return can be interpreted by developers as an intentional return value and that property may get used. If some other developer changes the original function in some way that the implicit return becomes something else, it'll create a bug. If a subroutine isn't supposed to return a meaningful value, it should do it explicitly. -- Bill Pemberton wfp5p@virginia.edu ITC/Unix Systems flash@virginia.edu University of Virginia ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/6] cleanups for git-send-email 2009-04-29 19:48 ` Bill Pemberton @ 2009-04-29 20:23 ` Junio C Hamano 2009-04-29 22:27 ` [PATCH 0/6] " Nicolas Sebrecht 1 sibling, 0 replies; 24+ messages in thread From: Junio C Hamano @ 2009-04-29 20:23 UTC (permalink / raw) To: Bill Pemberton; +Cc: Junio C Hamano, git wfp5p@viridian.itc.Virginia.EDU (Bill Pemberton) writes: > My changes come directly from the book "Perl Best Practices". Just as > ... > Again, it prevents bugs. People use "and" vs "&&" as the same thing, > when they are not. The have different precedence in perl. > > For example, > > next if not $finished || $x < 5; > next if !$finished || $x < 5; > > do not mean the same thing. > ... > Again, it prevents potential bugs down the road.... Earlier I did guide the community not to use "more advanced" (aka "obscure") Perl features so that people not so familiar with Perl can still tweak scripts without breaking them; the tricks in your patches that "prevent potential bugs" are in line with that, and that is why I said my personal taste more or less agrees with your patch already. But the line between "more advanced and tricky" and "if you are coding in Perl you should know your language" is not so black and white as you seem to think. I'd rather defer that decision to whoever is taking send-email over. ^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 0/6] Re: cleanups for git-send-email 2009-04-29 19:48 ` Bill Pemberton 2009-04-29 20:23 ` Junio C Hamano @ 2009-04-29 22:27 ` Nicolas Sebrecht 2009-04-30 8:11 ` Andreas Ericsson 1 sibling, 1 reply; 24+ messages in thread From: Nicolas Sebrecht @ 2009-04-29 22:27 UTC (permalink / raw) To: Bill Pemberton; +Cc: Junio C Hamano, git On Wed, Apr 29, 2009 at 03:48:51PM -0400, Bill Pemberton wrote: > Again, it prevents bugs. People use "and" vs "&&" as the same thing, > when they are not. The have different precedence in perl. I agree with you except that the chapter 4.16 from the Perl Best Practices book does not apply here. FMPOV, we don't really mix booleans because the precedence is explicitly given by the parentheses. [ Notice _how_ the author raises the ambiguity to explain his point in the book: he uses parentheses. ] > For example, > > next if not $finished || $x < 5; > next if !$finished || $x < 5; > > do not mean the same thing. True. But the lines we are talking about are different. We have: next if ($finished or $x < 5); If we add a "not"/"!" or append a "&&"/"and" - or whatever -, we do know what will be evaluated easily: next if !($finished or $x < 5); looks rather different from next if (!$finished or $x < 5); -- Nicolas Sebrecht ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 0/6] Re: cleanups for git-send-email 2009-04-29 22:27 ` [PATCH 0/6] " Nicolas Sebrecht @ 2009-04-30 8:11 ` Andreas Ericsson 0 siblings, 0 replies; 24+ messages in thread From: Andreas Ericsson @ 2009-04-30 8:11 UTC (permalink / raw) To: Nicolas Sebrecht; +Cc: Bill Pemberton, Junio C Hamano, git Nicolas Sebrecht wrote: > On Wed, Apr 29, 2009 at 03:48:51PM -0400, Bill Pemberton wrote: > >> Again, it prevents bugs. People use "and" vs "&&" as the same thing, >> when they are not. The have different precedence in perl. > > I agree with you except that the chapter 4.16 from the Perl Best > Practices book does not apply here. FMPOV, we don't really mix booleans > because the precedence is explicitly given by the parentheses. > > [ Notice _how_ the author raises the ambiguity to explain his point in > the book: he uses parentheses. ] > >> For example, >> >> next if not $finished || $x < 5; >> next if !$finished || $x < 5; >> >> do not mean the same thing. > > True. But the lines we are talking about are different. We have: > > next if ($finished or $x < 5); > > If we add a "not"/"!" or append a "&&"/"and" - or whatever -, we do know what will > be evaluated easily: > > next if !($finished or $x < 5); > > looks rather different from > > next if (!$finished or $x < 5); > I'm rather clueless when it comes to perl coding, but I know what I don't know, so I've got enough sense to look these things up whenever I have to hack some perl. I hope others do the same. Personally, I've found that never using 'or', 'not' or 'and', and overparenthesize when I'm uncertain seems to work rather nicely, even though perl gurus would probably shunt my code as overly explicit. -- Andreas Ericsson andreas.ericsson@op5.se OP5 AB www.op5.se Tel: +46 8-230225 Fax: +46 8-230231 Register now for Nordic Meet on Nagios, June 3-4 in Stockholm http://nordicmeetonnagios.op5.org/ Considering the successes of the wars on alcohol, poverty, drugs and terror, I think we should give some serious thought to declaring war on peace. ^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2009-05-04 7:41 UTC | newest] Thread overview: 24+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-04-29 13:12 [PATCH 0/6] cleanups for git-send-email Bill Pemberton 2009-04-29 13:12 ` [PATCH 1/6] Remove return undef from validate_patch Bill Pemberton 2009-04-29 13:12 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Bill Pemberton 2009-04-29 13:12 ` [PATCH 3/6] Remove return undef from ask() Bill Pemberton 2009-04-29 13:12 ` [PATCH 4/6] Add explict return to end of subroutines Bill Pemberton 2009-04-29 13:12 ` [PATCH 5/6] Remove mix of high and low-precedence booleans Bill Pemberton 2009-04-29 13:12 ` [PATCH 6/6] Remove bareword filehandles in git-send-email.perl Bill Pemberton 2009-05-03 20:58 ` Jeff King 2009-05-03 21:34 ` Francis Galiegue 2009-05-04 6:12 ` H.Merijn Brand 2009-05-04 6:53 ` Francis Galiegue 2009-05-04 7:41 ` H.Merijn Brand 2009-04-29 16:54 ` [PATCH 5/6] Re: Remove mix of high and low-precedence booleans Nicolas Sebrecht 2009-04-29 17:00 ` Bill Pemberton 2009-05-03 20:31 ` [PATCH 4/6] Add explict return to end of subroutines Jeff King 2009-05-03 20:26 ` [PATCH 3/6] Remove return undef from ask() Jeff King 2009-05-04 2:26 ` Jay Soffian 2009-05-03 20:27 ` [PATCH 2/6] Remove function prototypes from git-send-email.perl Jeff King 2009-05-03 19:46 ` [PATCH 1/6] Remove return undef from validate_patch Jeff King 2009-04-29 19:18 ` [PATCH 0/6] cleanups for git-send-email Junio C Hamano 2009-04-29 19:48 ` Bill Pemberton 2009-04-29 20:23 ` Junio C Hamano 2009-04-29 22:27 ` [PATCH 0/6] " Nicolas Sebrecht 2009-04-30 8:11 ` Andreas Ericsson
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).