3

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%

私と一緒に試したことがある人は、修正してもう一度やり直してください。/bpre-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 %*

4

2 に答える 2

1

SVNは、コンソールが関連付けられていない状態でスクリプトを実行しています。したがって、STDOUTには何も表示されません。スクリプトが0とは異なるエラーコードを返した場合、STDERRに送信されたものはすべてSVNにメッセージとして表示されます。

この種のスクリプトは無人で実行する必要があり、ユーザーからの入力または出力とは無関係です。

プロパティ値を追加のコマンドラインパラメータとして渡すことができます。これを行うには、.batを次のように変更します。

@echo off
set /p NEWTEXT=
test.py %* %NEWTEXT%
exit /b %ERRORLEVEL%

そして、.py to:

import os, sys

if __name__ == '__main__':   
    newtext = sys.argv[6]
    sys.stderr.write('newtext is: %s\n'% newtext)
    exit(2)

バッチSTDINからNEWTEXT変数を読み取り、それを追加のコマンドラインパラメーターとしてスクリプトに渡します。

このソリューションは、複数行の値に対しては機能しません。それで、私はあなたの元の解決策を再試行しました、そしてそれはうまくいきました。

svn propset svn:log --revprop -r 3 -F svn.txt

この場合、プロパティ値は、複数行のテキストファイルであるsvn.txtファイルから読み取られます。この場合、コメントで説明したように、set/pを指定したオプションは機能しません。ただし、元のスクリプトは機能します。

詳細については、5つのプロパティがコマンドラインで渡されます。

1-リポジトリ

2-リビジョン番号

3-ユーザー

4-プロパティ名

5-操作(この場合はM)

プロパティ値は、バッチスクリプトのstdinに渡されます。

@Chen、ついに画像をダウンロードしました。フックバッチを次のように変更すると、問題は解決します。

c:\python27\python.exe d:\svntest\testhook.py %*
exit %ERRORLEVEL%

XPマシンがPythonを直接実行する方法が正しく構成されていないようです。

于 2012-09-18T09:58:45.713 に答える
0

受け取った stdin を呼び出すスクリプトに送信するのは、バッチ ファイル次第ではないでしょうか。

参考: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true

これを実現するには、スクリプトへの呼び出しの前に > 記号を付けるだけでよいでしょうか?

> D:\svntest\testhook.py %*
exit /b %ERRORLEVEL%

バッチ ファイルが stdin から読み取ることができる場合、SVN は想定されていることを実行しており、呼び出す追加のスクリプトでそれを利用できるようにするのはバッチ ファイル次第です。

于 2012-09-18T12:35:10.160 に答える