public override IEnumerable<object> Evaluate(BuildInstance instance, IEnumerable<object> inputs)
{
if (!File.Exists(fileName))
{
instance.Log.Error("Could not find external program '{0}'. (line {1})", fileName, LineNumber);
return null;
}
if (resultProviders.Count == 0)
{
instance.Log.Error("Running an external tool requires at least one Result specifier. (line {0})", LineNumber);
return null;
}
// perform argument replacement
var argProvider = new ArgProvider(instance, inputs, LineNumber);
string currentArguments = instance.Match.Result(argumentFormat);
currentArguments = string.Format(currentArguments, argProviders.Select(p => p(argProvider)).ToArray());
var startInfo = new ProcessStartInfo(fileName, currentArguments);
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = (options & RunOptions.RedirectOutput) != 0;
startInfo.RedirectStandardError = (options & RunOptions.RedirectError) != 0;
var process = new Process();
process.StartInfo = startInfo;
process.EnableRaisingEvents = true;
process.OutputDataReceived += (o, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
instance.Log.Info(e.Data);
};
process.ErrorDataReceived += (o, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
instance.Log.Error(e.Data);
};
process.Start();
if (startInfo.RedirectStandardOutput)
process.BeginOutputReadLine();
if (startInfo.RedirectStandardError)
process.BeginErrorReadLine();
process.WaitForExit();
if ((options & RunOptions.DontCheckResultCode) == 0 && process.ExitCode != 0)
{
instance.Log.Error("Running tool '{0}' failed with result code {1}. (line {2})", fileName, process.ExitCode, LineNumber);
return null;
}
var results = new List<Stream>();
foreach (var output in resultProviders.Select(p => p(argProvider)))
{
string path = instance.Match.Result(output);
results.Add(File.OpenRead(path));
}
return results;
}