1

我正在开发一个 .net 提交后挂钩,以通过他们的 Soap SDK 将数据输入 OnTime。我的钩子在 Windows 上工作得很好,但在我们的生产 RHEL4 颠覆服务器上,当从 shell 脚本调用时它不会工作。

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

当我从命令行使用参数执行它时,它可以正常工作。当通过 shell 脚本执行时,我收到以下错误:(看起来我用来获取修订日志数据的 SVN 的进程执行存在一些问题):

未处理的异常:System.InvalidOperationException:进程必须退出才能获取请求的信息。
  在 System.Diagnostics.Process.get_ExitCode () [0x0003f] 在 /tmp/monobuild/build/BUILD/mono-1.9.1/mcs/class/System/System.Diagnostics/Process.cs:149
  在 (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]

我尝试使用mkbundleandmkbundle2制作一个可以命名的独立设备post-commit,但我收到一条不同的错误消息:

未处理的异常:System.ArgumentNullException:参数不能为空。
参数名称:值不能为空。
  在 System.Guid.CheckNull (System.Object o) [0x00000]
  在 System.Guid..ctor (System.String g) [0x00000]
  在 SVNCommit2OnTime.Program.Main (System.String[] args) [0x00000]

任何想法为什么它可能会从 shell 脚本失败或捆绑版本可能有什么问题?

编辑: @Herms,我已经用回声试过了,看起来不错。至于$1/hooks/post-commit.exe.net 程序集,我已经尝试了带有和不带有 .net 程序集的完整路径的脚本,结果相同。

编辑: @Leon,我都试过了$1 $2"$@"结果都一样。它是一个颠覆后提交挂钩,它需要两个参数,因此需要将这些参数传递给 .net 程序集。这"$@"是 mono 站点推荐的从 shell 脚本调用 .net 程序集的方法。shell 脚本正在执行 .net 程序集并使用正确的参数,但它抛出了一个异常,该异常在直接从命令行运行时不会抛出。

编辑: @Vinko,除了BASH_LINENOBASH_SOURCE

编辑: @Luke,我累了,但这也没什么区别。我首先在我的机器上从 TortoiseSVN 测试时注意到了这个问题(当它作为 subversion 守护进程的子进程运行时),但也发现从 hooks 目录执行脚本时我得到了相同的结果(即./post-commit REPOS REV,在post-commit哪里上面的 sh 脚本。mono post-commit.exe REPOS REV工作正常。主要问题是要执行,我需要有一些名称post-commit以便调用它。但它不能从 shell 脚本工作,如上所述,mkbundle它不起作用有不同的问题。

4

6 回答 6

2

某些进程在关闭其标准输出后会挂起一段时间是正常的(即,您会从它们那里读取文件结尾)。您需要proc.WaitForExit()在读取所有数据后但在检查 ExitCode 之前调用。

于 2008-09-15T17:47:13.413 回答
0

只是一个可能有助于调试的随机想法。尝试将您的 shell 脚本更改为:

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

检查并查看它打印的行是否与您期望它运行的命令匹配。您在 shell 脚本中处理的命令行参数可能没有按照您的意愿进行。

我不知道您对脚本的预期输入是什么,但路径前的 $1 对我来说有点不合适。

于 2008-09-10T16:07:59.277 回答
0

你确定你想做

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

$@ 扩展到所有参数。"$@" 扩展到所有由空格连接的参数。我怀疑你的shell脚本不正确。您没有确切说明您希望脚本做什么,所以这确实限制了我们提出建议的可能性。

于 2008-09-10T16:10:17.227 回答
0

比较 shell 和脚本中的环境变量。

于 2008-09-10T16:20:39.060 回答
0

尝试将“cd $1/hooks/”放在运行单声道的行之前。您可能在该文件夹中有一些程序集,当您从 shell 中的该文件夹运行单声道时可以找到这些程序集,但在运行脚本时找不到这些程序集。

于 2008-09-10T17:43:30.483 回答
0

在验证了我的代码确实可以从命令行运行后,我发现它不再工作了!我查看了我的 .net 代码,看看是否有任何意义。

这是我所拥有的:

        静态公共 int 执行(字符串 sCMD,字符串 sParams,字符串 sComment,
                                  字符串 sUserPwd,SVNCallback 回调)
        {
            System.Diagnostics.Process proc = new 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();
            诠释 nLine = 0;
            字符串 sLine = "";
            而 ((sLine = proc.StandardOutput.ReadLine()) != null)
            {
                ++n线;
                如果(回调!= null)
                {
                    callback.Invoke(nLine, sLine);
                }
            }
            int errorCode = proc.ExitCode;
            proc.Close();
            返回错误代码;
        }

我改变了这个:

            而(!proc.HasExited)
            {
                sLine = proc.StandardOutput.ReadLine();
                如果(sLine!= null)
                {
                    ++n线;
                    如果(回调!= null)
                    {
                        callback.Invoke(nLine, sLine);
                    }
                }
            }
            int errorCode = proc.ExitCode;

看起来进程比我得到输出的时间长了一点,因此proc.ExitCode抛出了一个错误。

于 2008-09-10T19:38:04.733 回答