The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

perlcritic-checker.pl - Perl::Critic Subversion Hook

SYNOPSIS

perlcritic-checker.pl [options]

 Options:
   --revision|-r       Revision ID
   --transaction|-t    Transaction ID
   --repository|-p     Path to SVN repository
   --config|-c         Path to config file
   --help|-?           Show brief help message
   --man               Show full documentation
 

USAGE EXAMPLE

Put this into your Subversion's pre-commit hook:

/abs/path/to/perlcritic-checker.pl -p $REPOS -c /abs/path/to/perlcritic-checker.conf -t $TXN || exit 1

DESCRIPTION

perlcritic-checker is a subversion hook that allows commits to go through if and only if the code passes validation using Perl::Critic module. This way you can apply consistent coding practices inside your team.

Main features:

  • you can specify different Perl::Critic's profiles for different paths in your repository

  • you can bypass checks when you do need this

  • you can apply the checker to your existing large legacy Perl project by using "progressive mode" feature: in progressive mode perlcritic-checker doesn't complain about existing violations but prevents introducing new ones

  • perlcritic-checker comes with a test suite

CONFIGURATION FILE

Configuration file example follows. In fact, it's a ordinary Perl hash. You can check it using `perl -c' to avoid syntax errors.

 {
     # Progressive mode: {0|1}. In progressive mode perlcritic-checker
     # doesn't complains about existing violations but prevents
     # introducing new ones. Nice feature for applying Perl::Critic
     # to the existing projects gradually.
     progressive_mode => 1,
 
     # Emergency commits: {0|1}. There are situations when you *do* need
     # to commit changes bypassing all checks (e.g. emergency bug fixes).
     # This featue allows you bypass Perl::Critic using "magic" prefix in
     # comment message, e.g.: svn ci -m "NO CRITIC: I am in hurry" FooBar.pm
     allow_emergency_commits  => 1,
 
     # Magic prefix described above can be customized:
     emergency_comment_prefix => 'NO CRITIC',

     # Limit maximal number of reported violations. This parameter works
     # differently in strict and progressive modes. In strict mode it
     # will truncate long list of violations: only N most severe violations
     # will be shown. In progressive mode such behaviour has no sense,
     # that's why user will be asked to run perlcritic locally.
     #
     # In fact, this parameter is a workaround for a subtle bug in generic
     # svn-client that happens when svn hook (i.e. perlcritic-checker.pl)
     # outputs too much data: svn-client just reports "Connection closed
     # unexpectedly". In order to reproduce this bug several additional
     # conditions should be met:
     # - repository access scheme: 'svn://' (svnserve daemon)
     # - client and server on different machines
     # - svn-client and -server are running on linux
     # 
     # If you face the same problem, try to use the option below.
     #max_violations => 50,
 
     # SVN repository path -- to -- Perl::Critic's profile mapping.
     #
     # This feature allows you to apply different Perl::Critic's
     # policies for different paths in the repository. For example,
     # you can be very strict with brand-new projects, make an
     # indulgence for some existing project and completely disable
     # checking of auto-generated or third-party code.
     #
     # Each modified (added, updated, copied, moved) file name in the
     # repository is matched against a sequence of patterns below.
     # Keep in mind, *last* matching rule - wins.
     #
     # Profile paths can be either absolute or relative. In the later
     # case they will be mapped under $REPOS/hooks/perlcritic.d directory.
     profiles => [
         # Apply default profile for all Perl-code under 'project_name/trunk'
         {
             pattern => qr{project_name/trunk/.*?[.](pm|pl|t)$},
             profile => 'default-profile.conf',
         },
 
         # Disable checking of autogenerated Perl-code
         {
             pattern => qr{autogenerated-script[.]pl$},
             profile => undef,
         },
     ],
 }

Format of Perl::Critic's profiles is described in perlcritic(1p). Here is an example:

 # Make perlcritic very exacting
 severity = brutal
 
 # You can choose any level from 1 to 11, but 8 is recommended
 verbose = 8
 
 # Colorize violations depending on their severity level
 color = 1
 
 # Halt if this file contains errors
 profile-strictness = fatal
 
 # Ask perlcritic for a little indulgence
 exclude = Documentation
 
 # Explicitly set full path to Perl::Tidy's config
 [CodeLayout::RequireTidyCode]
 perltidyrc = /etc/perltidyrc

EXIT STATUS

0 - No code violations found, allow commit

1 - Code violations have been found, deny commit

255 - Error has occured, deny commit

SEE ALSO

http://perlcritic.com

AUTHOR

Alexander Simakov, <xdr (dot) box (at) Google Mail>

http://alexander-simakov.blogspot.com/

http://code.google.com/p/perlcritic-checker

LICENSE AND COPYRIGHT

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.