auxをコミットできないようにするスクリプト

30分プログラム、その610。
レポジトリを破壊する簡単な方法しってます? aux.txtというファイルをコミットするだけで、Windowsでそのレポジトリをチェックアウトできなくなるんですよ。
よくは知らないですが、MS-DOSから続く伝統らしいです。誰が得すんだよ・・・。

ここでWindowsについて文句をならべてもしょうがないので、svnのフックスクリプトでダメなファイルを弾くようにしてみました。

$ touch aux.txt
$ svn add aux.txt
A         aux.txt
$ svn ci -m 'add aux file'
追加しています              aux.txt
ファイルのデータを送信しています .svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: コミットが pre-commit フックによって妨げられました (終了コード: 1)。出力:
`aux.txt' is illegal filename at Windows

ちなみに類似の問題として、foo.txtとFoo.txtをコミットすると、case insensitiveファイルシステムで困る、というのがあります。それは、また別の機会に。

使い方

下記のソースコードを$REPOS/hooks/pre-commitとして置く。
実行権限を付加する必要があります。
あと、PATHが空の状態で実行されるらしいので、shebang(#!)はフルパスでお願いします。

ソースコード

#!/usr/bin/python
import sys
import os.path
import fnmatch
from subprocess import *

NG_LIST = ["aux","con","prn"]

repos       = sys.argv[1]
transaction = sys.argv[2]

output = Popen(["svnlook", "tree",repos,'-t',transaction,'--full-paths'], stdout=PIPE).communicate()[0]

for path in output.split("\n"):
    filename = os.path.basename(path.strip())
    for ng in NG_LIST:
        if fnmatch.fnmatchcase(filename,ng) or fnmatch.fnmatchcase(filename,ng+".*"):
            sys.stderr.write("`%s' is illegal filename at Windows" % filename)
            sys.exit(1)