#!/usr/bin/perl # # Pre-commit hook for running checkstyle on changed Java sources # # To use this you need: # 1. checkstyle's jar file somewhere # 2. a checkstyle XML check file somewhere # 3. To configure git: # * git config –add checkstyle.jar <location of jar> # * git config –add checkstyle.checkfile <location of checkfile> # * git config –add java.command <path to java executale> [optional # defaults to assuming it's in your path] # 4. Put this in your .git/hooks directory as pre-commit # # Now, when you commit, you will be disallowed from doing so # until you pass your checkstyle checks.
$command = “git-diff-index –cached HEAD 2>&1 | sed 's/^:.* //' | uniq”; open (FILES,$command . “|”) || die “Cannot run '$command': $!n”;
$CONFIG_CHECK_FILE = “checkstyle.checkfile”; $CONFIG_JAR = “checkstyle.jar”; $CONFIG_JAVA = “java.command”;
$check_file = `git config –get $CONFIG_CHECK_FILE`; $checkstyle_jar = `git config –get $CONFIG_JAR`; $java_command = `git config –get $CONFIG_JAVA`;
if (!$check_file || !$checkstyle_jar) {
die "You must configure checkstyle in your git config:\n" . "\t$CONFIG_CHECK_FILE - path to your checkstyle.xml file\n" . "\t$CONFIG_JAR - path to your checkstyle jar file\n" . "\t$CONFIG_JAVA - path to your java executable (optional)\n" ;
}
$java_command = “java” if (!$java_command);
chomp $check_file; chomp $checkstyle_jar; chomp $java_command;
$command = “$java_command -jar $checkstyle_jar -c $check_file”;
@java_files = ();
foreach (<FILES>) {
chomp; next if (!(/\.java$/)); push @java_files,$_; $command .= " "; $command .= $_;
} if ($#java_files >= 0) {
if (&run_and_log_system ($command)) { print STDERR "Commit aborted.\n"; exit -1; }
}
exit 0;
sub run_and_log_system {
($cmd) = @_; system $cmd;
}