Friday, September 11, 2009

Perl::Critic-Regeln durchsetzen...

Auf der diesjährigen FrOSCon habe ich im Perl-Raum Perl::Critic vorgestellt. Dabei habe ich auch kurz gezeigt, wie man diese Regeln durchsetzen kann. Eine Möglichkeit ist, die Überprüfung gleich beim Einchecken von Code durchzuführen - wenn denn ein Versionsverwaltungstool verwendet wird.

Das ist natürlich dann die ganz strenge Variante, aber es ist eine gute Variante, wenn man sichergehen will. In diesem Blog-Post zeige ich kurz, wie man mit einem SVN-Hook den commit vermeiden kann, wenn der Code nicht den eigenen Regeln entspricht.

Das ganze habe ich für einen SVN-Server unter Windows gemacht, sollte aber analog auch auf anderen Umgebungen funktionieren. Dort muss man statt des Batch-Skripts halt ein Shell-Skript machen.

Das Batch-Skript wird als "pre-commit.bat" im "hooks"-Verzeichnis des SVN-Servers gespeichert und sieht so aus:

Das Batch-Skript ruft also ein Perl-Skript auf. In diesem Perl-Skript wird dann die eigentliche Überprüfung des Codes vorgenommen. Da es ein "pre-commit"-Hook ist, kann man den eigentlichen Commit verhindern.

Das Perl-Skript sieht wie folgt aus:

Und wenn der Code, der eingecheckt werden soll, nicht sauber ist, bekommt man einen Fehler:



Siehe auch:

2 comments:

Anonymous said...

Hi,

für Mercurial sieht das ganze wie folgt aus:
#!/usr/bin/perl

use strict;
use warnings;
use Perl::Critic;

my @files = qx{ hg status };
my $fail=0;

for my $file (@files) {
chomp($file);
my ($type, $name) = split /\s+/, $file;
my $content = qx{ hg cat $name };
my $pc = Perl::Critic->new( -severity => 5 );
my @violations = $pc->critique( \$content );

print STDERR $_,"\n" for @violations;
$fail = 1 if @violations;
}

exit $fail;


Viel Spass

Roland

Anonymous said...

Hi,

"Critic wem Kritik gebührt", oder so ähnlich ...
In dem Mercurial Hook habe ich vergessen das ganze auch auf Perl Dateien zu begrenzen. Nach dem
my ($type, $name) = split /\s+/, $file;

sollte noch folgende Zeile
next unless $name =~ /\.p[lm]\z/;

eingefügt werden.

Roland