# New Ticket Created by  "Paul Cochrane" 
# Please include the string:  [perl #40482]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=40482 >


Hi,

This patch adds a new policy for the Parrot Perl::Critic tests, namely
to check that the shebang line doesn't use 'perl -w', rather 'use
warnings;' and that the shebang line doesn't use something unix
specific such as '#!/usr/bin/perl' and rather '#! perl'.  Would it be
a good idea to group all of the code standards-related stuff into a
directory CodeStandards?  As such, should I then make a patch for
CodeLayout::UseParrotCoda to go under CodeStandards::UseParrotCoda
instead?  I'm also wondering what the policy is on svn Id keywords in
files, and whether or not the svn:keywords property is set to a
particular value.  I don't think there's a standard or anything
defined for this yet.  Should there be?  If so, should I put a request
into RT?

TIA

Regards,

Paul

files affected:

lib/Perl/Critic/Policy/CodeStandards/CheckPerlShebang.pm
Index: lib/Perl/Critic/Policy/CodeStandards/CheckPerlShebang.pm
===================================================================
--- lib/Perl/Critic/Policy/CodeStandards/CheckPerlShebang.pm	(revision 0)
+++ lib/Perl/Critic/Policy/CodeStandards/CheckPerlShebang.pm	(revision 0)
@@ -0,0 +1,76 @@
+# $Id#
+package Perl::Critic::Policy::CodeStandards::CheckPerlShebang;
+
+use strict;
+use warnings;
+use Perl::Critic::Utils;
+use Perl::Critic::Violation;
+use base 'Perl::Critic::Policy';
+
+our $VERSION = '0.1';
+$VERSION = eval $VERSION;    ## no critic
+
+my $minus_w_desc = q{Need to use 'perl -w' instead of 'use warnings;'};
+my $minus_w_expl = q{All perl source in parrot must 'use warnings;' not the older 'perl -w' usage};
+
+my $unix_desc = q{Found unix-specific perl shebang line};
+my $unix_expl = q{Perl source in parrot should use the platform-independent shebang line: #! perl};
+
+#----------------------------------------------------------------------------
+
+sub default_severity { return $SEVERITY_LOW }
+sub applies_to       { return 'PPI::Document' }
+
+#----------------------------------------------------------------------------
+
+sub violates {
+    my ( $self, $elem, $doc ) = @_;
+
+    my @elements = $doc->children();
+
+    # look for the shebang line, if any
+    foreach my $element ( @elements) {
+        if ($element =~ m/^#! .* perl/xgs) {
+            # if the shebang line matches 'perl -w', report the violation
+            if ($element =~ m/perl \s* -w/xgs) {
+                my $sev = $self->get_severity();
+                return Perl::Critic::Violation
+                    ->new( $minus_w_desc, $minus_w_expl, $element, $sev ); 
+            }
+            elsif ($element =~ m{/usr(/local)?/bin/perl}xgs) {
+                my $sev = $self->get_severity();
+                return Perl::Critic::Violation
+                    ->new( $unix_desc, $unix_expl, $element, $sev ); 
+            }
+            else {
+                last;  # shebang line ok; skip to the end of the elements
+            }
+        }
+    }
+
+    # we didn't find any dodgy shebang lines, so return with success
+    return;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Perl::Critic::Policy::CodeStandards::CheckPerlShebang
+
+=head1 DESCRIPTION
+
+Check to see if the old 'perl -w' shebang line is used to switch on
+warnings.  Also check to see that the perl shebang line isn't unix-specific 
+i.e. uses something like #!/usr/bin/perl instead of the cross-platform #! perl.
+
+=cut
+
+# Local Variables:
+#   mode: cperl
+#   cperl-indent-level: 4
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:

Reply via email to