public override IEnumerable<object> Evaluate(BuildInstance instance, IEnumerable<object> inputs)
{
// figure out the final names of each output
var outputs = new List<string>();
outputs.Add(instance.OutputPath);
outputs.AddRange(instance.Byproducts);
// make sure we have enough inputs to satisfy each output
var inputArray = inputs.ToArray();
if (inputArray.Length != outputs.Count)
{
instance.Log.Error("Number of inputs does not match number of outputs for '{0}' (line {1}).", instance.OutputName, LineNumber);
return null;
}
instance.Results = inputs;
if (instance.IsTempBuild && !instance.Env.WriteTempBuilds)
return null;
// match each input to an output name
for (int i = 0; i < inputArray.Length; i++)
{
// if we have a filestream, we can do a straight file copy because we know it hasn't been changed
var outputPath = outputs[i];
var stream = inputArray[i] as Stream;
if (stream == null)
return null;
var file = stream as FileStream;
if (file != null)
File.Copy(file.Name, outputPath, true);
else if (stream == null)
{
instance.Log.Error("Inputs to Build() node must all be of type stream ('{0}' on line {1}).", instance.OutputName, LineNumber);
return null;
}
else
{
// otherwise, write to file
stream.Seek(0, SeekOrigin.Begin);
using (var outputStream = File.Create(outputPath))
stream.CopyTo(outputStream);
}
stream.Close();
}
return Enumerable.Empty<Stream>();
}