gitで怪しいファイルを追加すると警告する

前にCSSの整形を正規表現だけで何とかするというエントリを書いて、このままだと面倒で誰も使わないので、怪しいCSSを書くとgitで警告を表示するようにした。警告を出すだけでファイルの中身は書き換わらない。

使い方

.gitattributesとgit-configに設定する。

$ echo '*.css filter=reviewcss' >> .gitattributes
$ git config filter.reviewcss.clean './sample.rb %f'
$ vim hell.css
$ cat hell.css
    .entry-content a,.entry-content p{
   color:black; 
    background: url('http://tinyurl.com/8ye9tro')no-repeat;
    }

$ git add hell.css
**** WARNING!! ****
hell.css:1 中括弧の前に空白がない
hell.css:1 "."がインデントされている
hell.css:2 末尾に空白がある
hell.css:2 幅1〜3のインデントがある
hell.css:2 コロンの後に空白がない
hell.css:3 括弧の後に空白がない
hell.css:4 "}"がインデントされている

設計

.gitattributesでreviewcssという名前のfilterを定義し、git-configでreviewcssのために利用するコマンドを指定する。%fを付けると、実行時に適用されるファイル名に展開されるので、引数として受け取ってスクリプト内でファイル名を参照する。

.gitattributesを利用するとcommitに含まれてしまうので、.git/info/attributesに記述しても良い。個人的にはgit-configの設定をcommitに含めるというのがしたいけど、どうすればいいのか分からない。.gitconfigをレポジトリルートに置いておけばそれを読んでくれる、みたいな機能がgitに欲しい。Ruby Style Guideとか、こういうコードスタイル的なものを正規表現で記述できると良さそう。

利用したsample.rbはこんな感じ。

#!/usr/bin/env ruby

str        = STDIN.read
filename   = ARGV.first
conditions = {
  /\t/                => 'タブ文字がある',
  / +$/               => '末尾に空白がある',
  / +,/               => 'コロンの前に空白がある',
  /[^ ]\{/            => '中括弧の前に空白がない',
  /\)\w/              => '括弧の後に空白がない',
  /^ .*:[^ ^D^\/]/    => 'コロンの後に空白がない',
  /^ {1,3}[^ ]/       => '幅1〜3のインデントがある',
  /^ {5,7}[^ ]/       => '幅5〜7のインデントがある',
  /^ +\./             => '"."がインデントされている',
  /^ +\}/             => '"}"がインデントされている',
  /^ +#[^\d^A-F^a-f]/ => '"#"がインデントされている'
}

warnings = ''
str.lines.with_index do |line, num|
  conditions.each do |regexp, msg|
    warnings << "#{filename}:#{num + 1} #{msg}\n" if line.match regexp
  end
end

if warnings.size > 0
  STDERR.puts '**** WARNING!! ****'
  STDERR.puts warnings
end

STDOUT.puts str