Как получить журнал SVN Commit, используя c # Process - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно получить журнал фиксации по дате для проекта svn, использующего приложение C #, т. Е. Если мы предоставили URl, дату начала и окончания, мы должны использовать svn.exe в процессе для получения подробностей журнала

Я использую команду svn log -r {"2007-07-07"}: {2019-11-08}, чтобы получить команду в командной строке.

            SourcePath = args[0];  // URL link
            var startDate = args[1];
            var endDate = args[2];
            var svnSource = args[3];  // svn.exe location in my machine

            var cmd1 = "cd /";
            var cmd2 = "c:";
            var cmd3 = string.Concat("cd ", svnSource);                              
            var cmd4 = string.Concat("svn log ", SourcePath, " -r {",  startDate, "}:{", endDate, "}");

            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "svn.exe";              
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            startInfo.UseShellExecute = false;
            Process process = new Process();
            process.StartInfo = startInfo;


            process.Start();
            process.StandardInput.WriteLine(cmd1);
            process.StandardInput.WriteLine(cmd2);
            process.StandardInput.WriteLine(cmd3);
            process.StandardInput.WriteLine(cmd4);

while (! Process.StandardOutput.EndOfStream) {

            string line = process.StandardOutput.ReadLine();
            if (!string.IsNullOrEmpty(line))
            {
                if (!process.HasExited)
                {

                }
            }

}

Я ожидаю результата в строке "строка" со всеми значениями журнала, ноя получаю фактическое выходное значение как пустое. точка останова не попадает в саму часть «while (! process.StandardOutput.EndOfStream)» при отладке.

Как решить эту проблему? что я тут не так делаю?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Привет @thomas, спасибо за обновление, я использовал код и получил желаемый результат, но у меня есть еще одна проблема при использовании времени также в startdate, endDate. при использовании формата like-r {"2019-11-07 15:06"}: {"2019-11-08 16:00"} я получаю коммиты до этого времени, так как я нахожусь в r604287 |Дипакрайс |2019-11-07 14:39:29 +0530 (четверг, 07 ноября 2019 г.) |1 строка, но если время использовалось как -r {"2019-11-07 15:07"}: {"2019-11-08 16:00"} журнал фиксации начинается с r604289 |Дипакрайс |2019-11-07 15:27:44 +0530 (четверг, 07 ноября 2019 г.) |1 строкаПочему такая разница во времени составляет 1 минуту?

Мне нужно получить журналы с точным временем, но здесь присутствует разница в 45 минут.

0 голосов
/ 11 ноября 2019

Прежде всего, svn.exe не будет интерпретировать подобные команды, поэтому вместо этого вы должны запустить оболочку, например cmd.exe.

Если вы указываете URL-адрес для вашего SourcePath, тогда svn может запускаться изначиная с cmd, поэтому вам не нужны первые 3 команды: cmd1, cmd2, cmd3. При этом вам также не понадобится переменная svnSource.

Конечно, вы можете перейти в корневой каталог, чтобы сделать ваш вывод более чистым.

Так что это изменения, которые ясделано по вашему коду:

var SourcePath = args[0];  // URL link
var startDate = args[1];
var endDate = args[2];    

var cmd1 = "cd c:\\";
var cmd2 = string.Concat("svn log ", SourcePath, " -r {", startDate, "}:{", endDate, "}");

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "cmd.exe";
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
Process process = new Process();
process.StartInfo = startInfo;

process.Start();
process.StandardInput.WriteLine(cmd1);
process.StandardInput.WriteLine(cmd2);

// It's always a good idea to close your standard input when you're not gonna need it anymore,
// otherwise the process will wait indefinitely for any input and your while condition will never
// be true or in other words it will become an infinite loop...
process.StandardInput.Close();

string result = string.Empty; // for storing the svn commit log

while (!process.StandardOutput.EndOfStream)
{
    string line = process.StandardOutput.ReadLine();
    if (!string.IsNullOrEmpty(line))
    {
        if (!process.HasExited)
        {
            result += line + Environment.NewLine;
        }
    }                
}
...