1

Soap SDK を介して OnTime にデータをフィードする .net ポストコミット フックに取り組んでいます。私のフックは Windows では問題なく動作しますが、本番環境の RHEL4 サブバージョン サーバーでは、シェル スクリプトから呼び出されたときに機能しません。

#!/ビン/sh
/usr/bin/mono $1/hooks/post-commit.exe "$@"

コマンドラインからパラメータを指定して実行すると、正常に動作します。シェル スクリプトを介して実行すると、次のエラーが発生します: (リビジョンのログ データを取得するために使用する SVN のプロセス実行に問題があるようです):

未処理の例外: System.InvalidOperationException: 要求された情報を取得する前にプロセスを終了する必要があります。
  /tmp/monobuild/build/BUILD/mono-1.9.1/mcs/class/System/System.Diagnostics/Process.cs:149 の System.Diagnostics.Process.get_ExitCode () [0x0003f] で
  at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:get_ExitCode ()
  SVNLib.SVN.Execute (System.String sCMD、System.String sParams、System.String sComment、System.String sUserPwd、SVNLib.SVNCallback コールバック) [0x00000] で
  SVNLib.SVN.Log (System.String sUrl、Int32 nRevLow、Int32 nRevHigh、SVNLib.SVNCallback コールバック) [0x00000] で
  SVNLib.SVN.LogAsString (System.String sUrl、Int32 nRevLow、Int32 nRevHigh) で [0x00000]
  SVNCommit2OnTime.Program.Main (System.String[] args) [0x00000] で

と を使用して、 という名前のスタンドアロンを作成しようとしましmkbundleたが、別のエラー メッセージが表示されます。mkbundle2post-commit

未処理の例外: System.ArgumentNullException: 引数を null にすることはできません。
パラメーター名: 値を null にすることはできません。
  System.Guid.CheckNull (System.Object o) で [0x00000]
  System.Guid..ctor で (System.String g) [0x00000]
  SVNCommit2OnTime.Program.Main (System.String[] args) [0x00000] で

シェル スクリプトで失敗する理由や、バンドルされているバージョンの何が問題なのか、何か考えはありますか?

編集: @Herms、私はすでにエコーで試しましたが、正しく見えます。については$1/hooks/post-commit.exe、スクリプトを .net アセンブリへのフル パスの有無にかかわらず試してみましたが、結果は同じでした。

編集: @Leon$1 $2 、両方を試してみまし"$@"たが、同じ結果が得られました。これは Subversion ポスト コミット フックであり、2 つのパラメーターを使用するため、これらを .net アセンブリに渡す必要があります。これ"$@"は、シェル スクリプトから .net アセンブリを呼び出すために mono サイトで推奨されていたものでした。シェル スクリプト、正しいパラメーターを使用して .net アセンブリを実行していますが、コマンド ラインから直接実行した場合にはスローされない例外をスローしています。

編集: @VinkoBASH_LINENO 、次のようなもの以外に環境に違いは見られませんBASH_SOURCE

編集: @Luke、疲れましたが、それでも違いはありません。自分のマシンで TortoiseSVN からテストしたとき (Subversion デーモンのサブプロセスとして実行されたとき) に最初に問題に気付きましたが、フック ディレクトリからスクリプトを実行したときにも同じ結果が得られることがわかりました (つまり./post-commit REPOS REVpost-commit上記のshスクリプト.mono post-commit.exe REPOS REV正常に動作します. 主な問題は、実行するには、post-commit呼び出されるように名前の何かが必要であることです. しかし、シェルスクリプトからは機能しませんmkbundle.別の問題で。

4

6 に答える 6

2

一部のプロセスが stdout を閉じた後、しばらくハングアップするのは正常です (つまり、エンドオブファイルの読み取りを取得します)。proc.WaitForExit()すべてのデータを読み取った後、ExitCode をチェックする前に呼び出す必要があります。

于 2008-09-15T17:47:13.413 に答える
0

mono を実行する行の前に「cd $1/hooks/」を追加してみてください。そのフォルダーに、シェルでそのフォルダーから mono を実行すると検出されるが、スクリプトを実行すると検出されないアセンブリがいくつかある場合があります。

于 2008-09-10T17:43:30.483 に答える
0

私のコードコマンド ラインから機能することを確認した後、機能していないことがわかりました。.net コードを調べて、何か意味があるかどうかを確認しました。

これが私が持っていたものです:

        static public int Execute(string sCMD, string sParams, string sComment,
                                  文字列 sUserPwd、SVNCallback コールバック)
        {
            System.Diagnostics.Process proc = 新しい System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.Verb = "開く";
            proc.StartInfo.FileName = "svn";
            proc.StartInfo.Arguments = Cmd(sCMD, sParams, sComment, UserPass());
            proc.Start();
            int nLine = 0;
            文字列 sLine = "";
            while ((sLine = proc.StandardOutput.ReadLine()) != null)
            {
                ++n行;
                if (コールバック != null)
                {
                    callback.Invoke(nLine, sLine);
                }
            }
            int errorCode = proc.ExitCode;
            proc.Close();
            errorCode を返します。
        }

私はこれを変更しました:

            while (!proc.HasExited)
            {
                sLine = proc.StandardOutput.ReadLine();
                if (sLine != null)
                {
                    ++n行;
                    if (コールバック != null)
                    {
                        callback.Invoke(nLine, sLine);
                    }
                }
            }
            int errorCode = proc.ExitCode;

プロセスが出力を取得するよりも少し長くぶら下がっているように見えるためproc.ExitCode、エラーがスローされます。

于 2008-09-10T19:38:04.733 に答える
0

デバッグに役立つかもしれない単なるランダムな考え。シェル スクリプトを次のように変更してみてください。

#!/bin/sh
echo /usr/bin/mono $1/hooks/post-commit.exe "$@"

印刷された行が、実行する予定のコマンドと一致するかどうかを確認してください。シェル スクリプトでのコマンド ライン引数の処理が、意図したとおりに実行されていない可能性があります。

スクリプトへの入力がどうなるかはわかりませんが、パスの前の $1 は少し場違いに見えます。

于 2008-09-10T16:07:59.277 に答える
0

本当にやりたいですか?

/usr/bin/mono $1/hooks/post-commit.exe "$@"

$@ はすべての引数に展開されます。"$@" は、スペースで結合されたすべての引数に展開されます。シェルスクリプトが間違っていると思われます。スクリプトで何をしたいかを正確に述べていないため、提案を行う可能性が制限されています.

于 2008-09-10T16:10:17.227 に答える
0

シェルとスクリプト内の環境変数を比較します。

于 2008-09-10T16:20:39.060 に答える