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:
Friday, September 11, 2009
Perl::Critic-Regeln durchsetzen...
Gepostet von
ReneeB
unter
11:27 AM
Labels: FrOSCon, Hook, Perl::Critic, SVN
Subscribe to:
Post Comments (Atom)

2 Kommentare:
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
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
Post a Comment