TeamCity.dotCover/ProcessRunner.cs (41 lines of code) (raw):
namespace TeamCity.dotCover;
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
internal class ProcessRunner : IProcessRunner
{
private readonly IToolProcess _process;
private readonly IConsole _console;
private readonly ITrace _trace;
public ProcessRunner(
IToolProcess process,
IConsole console,
ITrace trace)
{
_process = process;
_console = console;
_trace = trace;
}
public int Run()
{
void OnOutputDataReceived(object sender, DataReceivedEventArgs args) => _console.WriteStdLine(args.Data);
void OnErrorDataReceived(object sender, DataReceivedEventArgs args) => _console.WriteErrLine(args.Data);
var process = _process.CreateProcess();
process.OutputDataReceived += OnOutputDataReceived;
process.ErrorDataReceived += OnErrorDataReceived;
_trace.WriteLine($"Starting process: {process.StartInfo.FileName} {process.StartInfo.Arguments}");
_trace.WriteLine($"From directory: {process.StartInfo.WorkingDirectory}");
process.Start();
try
{
process.BeginOutputReadLine();
process.BeginErrorReadLine();
}
finally
{
process.WaitForExit();
process.OutputDataReceived -= OnOutputDataReceived;
process.ErrorDataReceived -= OnErrorDataReceived;
}
return process.ExitCode;
}
public void Dispose() => _process.Dispose();
}