svnリポジトリ内のヤバげなファイルをあぶり出す方法
- ある程度以上古くて
- ある程度以上放置されている
ファイルをあぶり出してみた。
以下の2つのスクリプトを組み合わせて、
sh anasvn.sh | ruby warning.rb
みたいにして使う。(スクリプトの名前は適当。)閾値とかファイルの洗い出しルールは自分で勝手に書き換えてください。
読めば分かるけど必要なのは
- svn
- find
- awk
- ruby
です。CVS ? svk ? git ? RCS ? 現物合わせで適当にしてください。
確認は gawk 3.1.4, Ruby 1.8.4, svn 1.4.4 で行いました。
anasvn.sh
対象ファイル群を洗い出すための find のルールを適当に書き換える。例では
- 実行したディレクトリ以下で
- 拡張子 .php のファイル
をダーっと洗い出してチェックします。で、出力は
filename TAB 最初のcommit日時 TAB 変更のあった回数
という形式です。
#! /bin/sh
LANG=C
for i in `find . -name '*.php'`;
do
svn log -q $i | awk -v filename=$i '
BEGIN {
sum = 0;
FS = "|";
OFS = "\t";
}
/^r[0-9]+ / {
sum++;
time = $3;
}
END {
# time means first commit datetime
print filename, time, sum;
}
'
done
warning.rb
TOO_OLD, TOO_FEW を適当に書き換える。
出力は上のものをそのままスルーで出します。
#! /usr/bin/env ruby
require 'time'
FS = "\t"
TOO_OLD = Time.parse( '2006-01-01' )
TOO_FEW = 5
while ( line = gets )
arr = line.chop.split( FS )
filename = arr[0]
date = Time.parse( arr[1] )
times = arr[2].to_i
if ( date < TOO_OLD and times <= TOO_FEW )
puts line
end
end
最終的にはある程度「作った」のが古くてあんまり人の手に触れていないファイルを TSV の形式で抜き出すことができます。
これで出力されるファイルはカタいライブラリか、さもなくば見捨てられている可能性があります。
cron で回すようにすると「この子は可愛そうです、相手してあげてください」アピールになってよいかもしれない。どうだろ。