diff --git a/contrib/hooks/git-pre-commit-hook.pl b/contrib/hooks/git-pre-commit-hook.pl new file mode 100644 index 000000000..586dfd8fd --- /dev/null +++ b/contrib/hooks/git-pre-commit-hook.pl @@ -0,0 +1,72 @@ +#!/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; +} \ No newline at end of file