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