Windowsマシンでpre-revprop-changeフックスクリプトを試していますが、難しい問題が見つかりました。
私は自分の問題を次のシナリオに蒸留します。
C:\ csvn \ data \ repository \ tr1 \ hooks \ pre-revprop-change.batに次のコンテンツが含まれています:
D:\svntest\testhook.py %*
exit %ERRORLEVEL%
testhook.pyは次のとおりです。
import os, sys
if __name__ == '__main__':
# sys.stderr.write(sys.version+'\n') # this is OK, tried.
newtext = sys.stdin.read() # try to read new log message
sys.stderr.write('newtext is: %s\n'%newtext)
exit(2)
ただし、クライアント側svn propset svn:log --revprop -r 2 "newtext"
で実行すると、Pythonエラーが発生しました。
Traceback (most recent call last):
File "D:\svntest\testhook.py", line 5, in <module>
newtext = sys.stdin.read() # try to read new log message
IOError: [Errno 9] Bad file descriptor
このエラーの原因は何ですか?
pre-revprop-change.batはSTDINハンドルをpyスクリプトに渡さないようです。はい、pre-revprop-change.batがSTDINからテキストをフェッチできることを確認しました(バッチファイルのstdinストリームの読み取りの 指示に従って)。
また、コマンドラインから直接pre-revprop-change.batを実行しようとしましたが、問題ありませんsys.stdin.read()
。
親切に助けてください。
以下のスクリーンショット:
環境:
- Windows Server 2003
- Collabnet Subversion Edge 2.3(svn1.7.3およびApache2.2.22)
- python.orgからPython2.7.1msiをインストールします
============== [最新のアップデート] ====================:
申し訳ありませんが、.batに書き込む必要がありました
exit %ERRORLEVEL%
それ以外の
exit /b %ERRORLEVEL%
私と一緒に試したことがある人は、修正してもう一度やり直してください。/b
pre-revprop-change.batは常に0で終了するようです。ヒント:がない場合/b
、cmdウィンドウから直接.batを実行すると、cmdウィンドウが閉じるため、。を使用して試してみてくださいcmd /c "pre-revprop-change.bat some param"
。
以下でこの問題を再現する簡単な方法
さらに、まだ興味のある方はどうぞ
- このファイルパッケージをダウンロードhttp://down.nlscan.com/misc/chjsvnpyhook.zip、
- それらをD:\に抽出します。
- D:\ svntest \ tr1_localにcd、
- elog.bat(
svn propset svn:log --revprop -r 2 "newtext"
)を実行します
その後、私の問題が再現されます。(要件:svn.exe 1.7コマンドライン(collabnetまたはTortoiseSVN)、およびPython 2.7がインストールされている)
それでもエラーを再現できない場合。問題を正確に示すVMware仮想マシンを用意しました。http://down.nlscan.com/misc/chj/winxp-svnhook-py-stdin-error.7zでVMをダウンロードします(リンクは2013年9月まで有効であると予想されます)。そのVMを実行するには、VMware Player 3.0(無料)で十分です。
-
@nmenezesによって提供される非常に優れた回避策c:\Python27\python.exe D:\svntest\testhook.py %*
。