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)