From 298b62e07bb2092fafff5c73c8c5d87611697ced Mon Sep 17 00:00:00 2001 From: Jakub Horak Date: Fri, 29 Aug 2008 19:28:14 +0200 Subject: [PATCH] Added pre-commit patch checker. --- build/git/pre-commit | 100 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 build/git/pre-commit diff --git a/build/git/pre-commit b/build/git/pre-commit new file mode 100644 index 00000000..5b112663 --- /dev/null +++ b/build/git/pre-commit @@ -0,0 +1,100 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by git-commit with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, make this file executable. + +# This is slightly modified from Andrew Morton's Perfect Patch. +# Lines you introduce should not have trailing whitespace. +# Also check for an indentation that has SP before a TAB. + +if git-rev-parse --verify HEAD 2>/dev/null +then + git-diff-index -p -M --cached HEAD -- +else + # NEEDSWORK: we should produce a diff with an empty tree here + # if we want to do the same verification for the initial import. + : +fi | +perl -e ' + my $found_bad = 0; + my $filename; + my $reported_filename = ""; + my $lineno; + my @sh_checks; + sub bad_line { + my ($why, $line) = @_; + if (!$found_bad) { + print STDERR "*\n"; + print STDERR "* You have some suspicious patch lines:\n"; + print STDERR "*\n"; + $found_bad = 1; + } + if ($reported_filename ne $filename) { + print STDERR "* In $filename\n"; + $reported_filename = $filename; + } + print STDERR "* $why ($filename:$lineno)\n"; + print STDERR "$lineno:$line\n" if ($line); + } + sub sh_check { + open(IN, "$filename") || die ("Cannot open $filename"); + my $has_loc = 0; + my $has_glob = 0; + my $has_copy = 0; + my $empty = 0; + + $lineno = 0; + while() { + if (/^\s*\#include\s+"/) { + bad_line("sherlock includes after global includes", $_) if (!$has_loc && $has_glob); + $has_loc++; + } + $has_glob++ if (/^\s*\#include\s+\) { + if (m|^diff --git a/(.*) b/\1$|) { + $filename = $1; + push (@sh_checks, $filename) if ($filename =~ /\.[ch]$/); + next; + } + if (/^@@ -\S+ \+(\d+)/) { + $lineno = $1 - 1; + next; + } + if (/^ /) { + $lineno++; + next; + } + if (s/^\+//) { + $lineno++; + chomp; + if (/\s$/) { + bad_line("trailing whitespace", $_); + } + if (/^\s* \t/) { + bad_line("indent SP followed by a TAB", $_); + } + #if (/^\s*\#define\s+LOCAL_DEBUG/) { + # bad_line("LOCAL_DEBUG in commit", $_); + #} + if (/^([<>])\1{6} |^={7}$/) { + bad_line("unresolved merge conflict", $_); + } + } + } + foreach $filename (@sh_checks) { + sh_check(); + } + exit($found_bad); +' -- 2.39.2