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 で回すようにすると「この子は可愛そうです、相手してあげてください」アピールになってよいかもしれない。どうだろ。

More