#!/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 # * git config --add checkstyle.checkfile # * git config --add java.command [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 () { 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; }