#!/usr/bin/perl -w use Encode; use Text::Tabs; use Getopt::Std; use strict; our ($opt_n, $opt_t); getopts('t:n'); # this removes -t and -n from @ARGV; my $tabstop = $opt_t if ($opt_t); my $dry_run = $opt_n; my $any_bad = 0; my @files = @ARGV; unless (@files) { open FLIST, "git ls-files|" or die "Can't run git ls-files"; @files = ; close FLIST; } for (@files) { chomp; next if -d $_; -f $_ or (print(STDERR "Can't read $_\n"), next); next if /webserver\/static\/scripts\/contrib\//i; next if /\.(png|gif|ttf|ico|icns|fig|tex|eps|pdf)$/i; next if /\.(sln|vim|pbxproj|vsprops|plist|csproj|config|cs)$/i; next if /\.(vcproj|vcproj\.user|vcxproj|vcxproj\.filters)$/i; next if m[(^|/)\.git(modules|attributes)$]; next if /\.(lex|tab)\./; next if !/\./; my $tab = /\.(rb|pl|sh)$/; # Allow tabs for these files. $tab = 1 if /Makefile/i; # ... and for makefiles. my $bom = /\.js$/; # And BOM for these. $bom = 1 if /CREDITS/; undef local $/; open F, "<$_" or die "Can't open $_"; my $file = $_; my $cont=$_=; close F; eval{decode("UTF-8", "$_", Encode::FB_CROAK)}; if ($@) { print "invalid UTF-8: $file\n"; # We don't know the actual encoding, assume a Windows-using american/ # frenchman/german/finn. Sorry, polacks and russkies. Encode::from_to($_, "CP1252", "UTF-8"); } $_.="\n", print "missing newline at eof: $file\n" unless /\n$/s or /^$/; print "extra newlines at eof: $file\n" if s/\n+\n$/\n/s; $_=expand $_, print "tab: $file\n" if !$tab && /\t/; print "spaces at eol: $file\n" if s/ +\n/\n/sg; print "CR: $file\n" if s/\r//sg; # Note: it's a byte string, as we had to handle invalid encodings above, # and $cont may be invalid. print "zero width space: $file\n" if s/\xe2\x80\x8b//sg; # U+200B print "BOM: $file\n" if !$bom && s/\xef\xbb\xbf//sg; # U+FFEF print "Control statement space: $file\n" if $file =~ /\.(cc|h|js)$/i && s/\b(if|while|for|switch|catch)\(/$1 (/sg; if ($_ ne $cont) { $any_bad = 1; if (!$dry_run) { open F, ">$file" or die; print F; close F; } } } exit 1 if ($dry_run and $any_bad);