Как мне сделать обновление SVN из ASP.NET? - PullRequest
2 голосов
/ 13 ноября 2008

Я бы хотел вызвать svn со страницы asp.net, чтобы люди могли перейти на страницу, чтобы обновить репозиторий. (Кстати: я использую хостинг Beanstalk.com svn, который не допускает перехваты пост-фиксации, поэтому я делаю это таким образом).

Посмотри, что у меня ниже. Процесс запускается (он отображается в разделе «Процессы» в диспетчере задач) и завершается через несколько секунд без вывода сообщения (по крайней мере, ни одно из них не выводится на страницу). Хранилище не обновляется. Но он делает что-то с репозиторием, потому что в следующий раз, когда я пытаюсь обновить его вручную из командной строки, он говорит, что репозиторий заблокирован. Я должен запустить очистку SVN, чтобы получить его для обновления.

Идеи? * * 1005

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 ]

2 голосов
/ 13 ноября 2008

Вы также можете использовать библиотеку Subversion, которая поставляется с Ankh SVN. Я использовал его в проекте для управления файлами в хранилище Subversion, и он работал хорошо.

Если вы настаиваете на использовании клиента командной строки, обязательно проверьте выходные данные StandardError на наличие сообщений об ошибках. Также убедитесь, что пользователь, с которым вы запускаете процесс, обладает соответствующими правами.

1 голос
/ 13 ноября 2008

Возможно, вы сможете сделать это более эффективно, используя оболочку .net SVN или библиотеку, подобную этой one . Я уверен, что есть и другие, которые также поддерживают ограничения бобового стебля.

0 голосов
/ 22 марта 2018

Я исследовал это подробно. Самый простой способ сделать это - использовать подсистему обмена сообщениями Windows (журнал событий Windows - вы создаете свой собственный журнал и пишете в него сообщения). Asp.Net создает сообщение. Затем вам нужно написать службу Windows, которая читает сообщения каждые 3 секунды или около того. В тот момент, когда он сталкивается с сообщением «обновите svn, пожалуйста», вы запускаете cmd.exe / c svn.exe бла-бла из своей только что созданной службы Windows ... она работает очень хорошо, но много работы ... Тогда есть библиотека SharpSVN, но она требует небольшой настройки, и вы можете столкнуться с проблемами. Наконец, большинство людей, кажется, пытаются использовать класс 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 и почему мы это делаем ... Вам необходимо указать config-dir для любой учетной записи, которая проверила svn dir. IIS работает под другой учетной записью. Если он не может найти файл конфигурации для SVN, вы получите сообщение об остановке. Неинтерактивный и --trust-сервер-сертификат в основном пропускают запрос, чтобы принять вызовы безопасности. Наконец, вам нужно будет указать имя пользователя и пароль, так как это по какой-то причине не отправляется (в любом случае, с моей версией svn.exe). Кроме того, подключение по протоколу https к серверу svn приводило к ошибкам, поскольку имя хоста, сообщаемое IIS, отличается от имени хоста на рабочем столе (несоответствие ssl-сертификата), поэтому ему не нравится имя хоста в файле конфигурации - см. Рисунок , Итак, я решил, что если я переверну прокси-сервер с http на https (так что теперь у меня есть два веб-сайта на одном сервере, один из которых - reversesvn.domain.com:80 с проксированием к svn.domain.com:8443) Это пропустит все выдача сертификата и это был последний кусок головоломки. Вот как это сделать - просто: https://blog.ligos.net/2016-11-14/Reverse-Proxy-With-IIS-And-Lets-Encrypt.html.

0 голосов
/ 13 ноября 2008

Использование SharpSvn :

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

Но я бы порекомендовал не использовать передаваемую пользователем переменную напрямую из соображений безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...