using AutomationTool; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnrealBuildTool; namespace BuildGraph.Tasks { /// /// Parameters for a copy task /// public class CopyTaskParameters { /// /// The directory to copy from /// [TaskParameter] public string FromDir; /// /// The directory to copy to /// [TaskParameter] public string ToDir; /// /// List of file specifications separated by semicolons (eg. *.cpp;Engine/.../*.bat), or the name of a tag set /// [TaskParameter(Optional = true)] public string Files; } /// /// Task which copies files from one directory to another /// [TaskElement("Copy", typeof(CopyTaskParameters))] public class CopyTask : CustomTask { /// /// Parameters for this task /// CopyTaskParameters Parameters; /// /// Constructor /// /// Parameters for this task public CopyTask(CopyTaskParameters InParameters) { Parameters = InParameters; } /// /// Execute the task. /// /// Information about the current job /// Set of build products produced by this node. /// Mapping from tag names to the set of files they include /// True if the task succeeded public override bool Execute(JobContext Job, HashSet BuildProducts, Dictionary> TagNameToFileSet) { DirectoryReference FromDir = ResolveDirectory(Parameters.FromDir); DirectoryReference ToDir = ResolveDirectory(Parameters.ToDir); if(FromDir != ToDir) { // Get the source files to copy IEnumerable SourceFiles; if(Parameters.Files == null) { SourceFiles = FromDir.EnumerateFileReferences("*", System.IO.SearchOption.AllDirectories); } else { SourceFiles = ResolveFilespec(FromDir, Parameters.Files, TagNameToFileSet); } // Figure out matching target files IEnumerable TargetFiles = SourceFiles.Select(x => FileReference.Combine(ToDir, x.MakeRelativeTo(FromDir))); CommandUtils.ThreadedCopyFiles(SourceFiles.Select(x => x.FullName).ToList(), TargetFiles.Select(x => x.FullName).ToList()); } return true; } } }