如何从ASP.NET执行SVN更新?

时间:2008-11-12 22:25:29

标签: asp.net svn

我想从asp.net页面调用svn,以便人们可以点击页面来更新存储库。 (顺便说一句:我正在使用Beanstalk.com svn托管,它不允许提交后挂钩,这就是我这样做的原因)。

看看我在下面得到了什么。该过程开始(它显示在任务管理器中的进程中)并在几秒钟后退出,没有输出消息(至少没有输出到页面)。存储库不会更新。但它确实对存储库做了一些事情,因为下次我尝试从命令行手动更新它时,它说repo被锁定。我必须运行svn cleanup才能让它更新。

想法?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    startInfo = New System.Diagnostics.ProcessStartInfo("svn")
    startInfo.RedirectStandardOutput = True     
    startInfo.UseShellExecute = False
    startInfo.Arguments = "up " & Request.QueryString("path")

    pStart.StartInfo = startInfo
    pStart.Start()
    pStart.WaitForExit()

    Response.Write(pStart.StandardOutput.ReadToEnd())
End Sub

4 个答案:

答案 0 :(得分:2)

您还可以使用Ankh SVN附带的Subversion库。 我在一个项目中使用它来管理Subversion存储库中的文件,它运行良好。

如果您坚持使用命令行客户端,请确保检查StandardError输出是否有任何错误消息。还要确保您运行该流程的用户具有适当的权限。

答案 1 :(得分:1)

您可以通过使用.net SVN包装器或类似one的库来更有效地执行此操作。我相信还有其他人会支持beanstalk的限制。

答案 2 :(得分:0)

使用SharpSvn

using(SvnClient client = new SvnClient())
{
   client.Update(Request["path"]);
}

但我建议不要出于安全原因直接使用用户传递的变量。

答案 3 :(得分:0)

我已经详细研究了这一点。一个很好的方法是使用Windows Messaging Subsystem(Windows事件日志 - 您创建自己的日志并向其写入消息)。 Asp.Net创建了一条消息。然后你需要编写一个Windows服务,每隔3秒左右读取一次消息。它遇到'更新svn请消息'的那一刻,你从你刚刚创建的Windows服务中运行你的cmd.exe / c svn.exe等等......它工作得非常好,但它的工作很多......然后有SharpSVN lib,但它需要一些设置,你可能会遇到问题。最后,大多数人似乎都在尝试使用ProcessStartInfo类,但很少有人能够正确使用它...是的,它并不容易,而且还有很长的路要走,但这里是代码......这里的代码将运行svn。 exe为你并将所有屏幕输出记录到输出缓冲区....

    private static int lineCount = 0;
    private static StringBuilder outputBuffer = new StringBuilder();
    private void SvnOutputHandler(object sendingProcess,
                                  DataReceivedEventArgs e)
    {
        Process p = sendingProcess as Process;

        // Save the output lines here
        // Prepend line numbers to each line of the output.
        if (!String.IsNullOrEmpty(e.Data))
        {
            lineCount++;
            outputBuffer.Append("\n[" + lineCount + "]: " + e.Data);
        }
    }

    private void RunSVNCommand()
    {
        ProcessStartInfo psi = new ProcessStartInfo("cmd.exe",
                                                    string.Format("/c svn.exe --config-dir=%APPDATA%\\Subversion --username=yrname --password=yrpassword --trust-server-cert --non-interactive   update d:\\inetpub\\wwwroot\\yourpath"));

        psi.UseShellExecute = false;
        psi.CreateNoWindow = true;

        // Redirect the standard output of the sort command.  
        // This stream is read asynchronously using an event handler.
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;

        Process p = new Process();

        // Set our event handler to asynchronously read the sort output.
        p.OutputDataReceived += SvnOutputHandler;
        p.ErrorDataReceived += SvnOutputHandler;
        p.StartInfo = psi;

        p.Start();

        p.BeginOutputReadLine();
        p.BeginErrorReadLine();

        p.WaitForExit();
    }

有关svn.exe参数的快速说明以及我们为什么这样做...您需要为已签出svn目录的帐户指定config-dir。 IIS在不同的帐户下运行。如果找不到svn的配置文件,您将收到一条停止消息。 - 非交互式和--trust-server-certificate基本上是跳过提示来接受安全挑战。最后,您需要指定用户名和密码,因为某些原因不会发送(无论如何我的svn.exe版本)。现在,除此之外,通过https连接到svn服务器给我的错误,因为IIS报告的主机名与桌面主机名(ssl证书不匹配)不同,因此它不喜欢配置文件中的主机名 - 去图。所以,我想,如果我将代理从http转换为https(所以现在我在一台服务器上有两个网站,其中一个是reverseesvn.domain.com:80,代表svn.domain.com:8443)这将跳过所有证书问题,这是拼图的最后一块。这是怎么做的 - 简单:https://blog.ligos.net/2016-11-14/Reverse-Proxy-With-IIS-And-Lets-Encrypt.html