Lea la salida de svn en una cadena

Ok, entonces, después de mi idea de SSHing para un server y usar el cliente de línea de command svn en lugar del escritorio remoto (no mucho de una idea tbh), mi jefe y yo decidimos que sería mejor si pudiéramos actualizar cada proyecto desde un única página web local (esto es solo para nuestro server de desarrollo). Ahora, hice que esto funcione (una vez), sin embargo, a menudo no lo hace.

Estoy usando el siguiente código:

ProcessStartInfo start = new ProcessStartInfo("C:\Program Files (x86)\CollabNet\Subversion Client\svn.exe", "update " + UpdatePath); start.RedirectStandardOutput = true; start.UseShellExecute = false; start.ErrorDialog = false; start.CreateNoWindow = true; start.WindowStyle = ProcessWindowStyle.Hidden; Process process = Process.Start(start); StreamReader output = process.StandardOutput; string text = output.ReadToEnd(); process.WaitForExit(); Response.Write(text + "<br />" + UpdatePath); 

en teoría, esto debería recoger el resultado de la aplicación svn y escribirlo en la página, pero no es así (a less que en el raro caso en que se haya actualizado realmente, ¡sin embargo, no es así cuando en particular necesito la salida!)

¿Alguien puede detectar el problema?

Aquí hay algunos códigos tomados de una de mis aplicaciones: básicamente es solo la muestra de MSDN. ( http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx )

 private void SvnOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) { Process p = sendingProcess as Process; // Save the output lines here } private void RunSVNCommand() { ProcessStartInfo psi = new ProcessStartInfo("svn.exe", string.Format("update \"{0}\" {1}", parm1, parm2)); 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() } 

No es exactamente una respuesta a su pregunta original, pero un enfoque diferente podría ser usar SharpSvn ( http://sharpsvn.open.collab.net ). Al brindarle un acceso más directo a la API, podría brindarle un mejor control y resultados.

Lo he usado para monitorear y actualizar las áreas de trabajo de svn y parecía haber hecho el trabajo.

Creo que necesitas moverte

 StreamReader output = process.StandardOutput; string text = output.ReadToEnd(); 

después de WaitToExit()

También es posible que desee networkingirigir el error estándar en caso de que algo malo suceda, es probable que desee saber al respecto.

También puede acortar su código haciendo string text= process.StandardOutput.ReadToEnd();

Necesitará leer periódicamente desde la tubería de salida estándar del process mientras se está ejecutando. Si no lo hace, el buffer de salida estándar se llenará y Windows suspenderá el process y esperará hasta que esté despejado antes de continuar. Por supuesto, su process se encuentra en WaitForExit() por lo que tiene un punto muerto.

Esta es una respuesta genérica porque no estoy lo suficientemente familiarizado con las primitivas de administración de processs .NET como para dar un ejemplo. Sin embargo, el principio es el mismo que en cualquier otro sistema de salida por cañería.

Primero, recomendaría la sugerencia de Rusty. En segundo lugar, puede revisar este código para get un ejemplo de trabajo de captura del resultado del process.

Si solo quieres usar la class contenedora desde el enlace aquí, es lo que necesitas:

 using CSharpTest.Net.Processes; static void Update(string sourcePath, Action<string> output) { ProcessRunner run = new ProcessRunner("svn.exe", "update", "{0}"); run.OutputReceived += delegate(Object o, ProcessOutputEventArgs e) { output(e.Data); }; int exitCode = run.RunFormatArgs(sourcePath); if (exitCode != 0) throw new ApplicationException( String.Format("SVN.exe returned {0}.", exitCode) ); }