What is the correct way to exclude RequireRcsKeywords from Perl Critic?
Asked Answered
M

4

9

I'm trying to exclude checks of Perl Critic's RequireRcsKeywords in a single Perl script. I don't want to change my default policy in .perlcriticrc so I added a "no critic" line to the top of the source. Despite that change, Perl Critic still complains about the lack of RCS keywords.

Here is my test case (critictest.pl):

#!/usr/bin/perl
## no critic (RequireRcsKeywords)
use warnings;
use strict;
print "Hello, World.\n";

When I execute perlcritic -1 --verbose 8 critictest.pl I get the following output:

[Miscellanea::RequireRcsKeywords] RCS keywords $Id$ not found at line 1, column 1.  (Severity: 2)
[Miscellanea::RequireRcsKeywords] RCS keywords $Revision$, $HeadURL$, $Date$ not found at line 1, column 1.  (Severity: 2)
[Miscellanea::RequireRcsKeywords] RCS keywords $Revision$, $Source$, $Date$ not found at line 1, column 1.  (Severity: 2)
[Modules::RequireVersionVar] No package-scoped "$VERSION" variable found at line 1, column 1.  (Severity: 2)
[Miscellanea::ProhibitUselessNoCritic] Useless '## no critic' annotation at line 2, column 1.  (Severity: 2)
[InputOutput::RequireCheckedSyscalls] Return value of flagged function ignored - print at line 5, column 1.  (Severity: 1)

I know that Perl Critic is working because if I add ## no critic (RequireCheckedSyscalls) then that error in the output goes away. I also tried adding `## no critic (Miscellanea::RequireRcsKeywords) but that didn't cause any change. What is the correct way to tell Perl Critic to ignore the RequireRcsKeywords policy in my file without having to use an external policy file?

EDIT: I'm using Perl 5.10.1, Perl Critic 1.108, and Debian 6.0.3.

Mutualize answered 7/2, 2012 at 18:35 Comment(0)
M
5

You can add one-off adjustments to your .perlcriticrc file with --include and --exclude on the command line.

$ perlcritic --exclude RcsKeywords -1 --verbose 8 critictest.pl
[Modules::RequireVersionVar] No package-scoped "$VERSION" variable found at line 1, column 1.  (Severity: 2)
[InputOutput::RequireCheckedSyscalls] Return value of flagged function ignored - print at line 4, column 1.  (Severity: 1)
Melodimelodia answered 7/2, 2012 at 20:4 Comment(0)
M
3

You can put both the shebang and the "no critic" annotation on the first line. Like this:

#!/usr/bin/perl -- ## no critic RequireRcsKeywords
Magel answered 7/2, 2012 at 19:24 Comment(2)
This makes the shebang line fail: Can't open perl script "## no critic RequireRcsKeywords": No such file or directoryMelodimelodia
You could say #!/usr/bin/perl -- ## no critic ..., though (I think).Melodimelodia
F
2

Notice that the violation occurs on Line 1 of your file. If I delete your first line, I do not get the RCS violation. I suspect that this policy applies to the entire file and can only be ignored if the no critic pragma appears on the first line of your file.

Note also that it is telling you it is ignoring your pragma:

[Miscellanea::ProhibitUselessNoCritic] Useless '## no critic' annotation at line 2, column 1.  (Severity: 2)
Forester answered 7/2, 2012 at 18:58 Comment(2)
Thanks for pointing that out. I had missed it. Deleting the first line does now let Perl Critic ignore the policy. Unfortunately, I can no longer run the command without prefixing it with perl because the #! is gone.Mutualize
Submit a request for this behavior: rt.cpan.org/NoAuth/Bugs.html?Dist=Perl-CriticForester
C
0

A hack might be to use the following first line:

#!/usr/bin/perl -F## no critic (Miscellanea::RequireRcsKeywords)

The documentation says the -F flag doesn't do anything by itself so it should be harmless.

Cornute answered 7/2, 2012 at 22:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.