in src/Artifacts/Tasks/Robocopy.cs [128:168]
private void CopySearch(IList<RobocopyMetadata> bucket, bool isRecursive, string match, DirectoryInfo source, string subDirectory)
{
bool hasSubDirectory = !string.IsNullOrEmpty(subDirectory);
foreach (FileInfo sourceFile in FileSystem.EnumerateFiles(source, match))
{
foreach (RobocopyMetadata item in bucket)
{
if (item.IsMatch(sourceFile.Name, subDirectory, isFile: true))
{
foreach (string destination in item.DestinationFolders)
{
string fullDest = hasSubDirectory ? Path.Combine(destination, subDirectory) : destination;
FileInfo destFile = new FileInfo(Path.Combine(fullDest, sourceFile.Name));
Verify(destFile, false, false);
CopyFile(sourceFile, destFile, true, item);
}
}
}
}
// Doing recursion manually so we can consider DirExcludes
if (isRecursive)
{
foreach (DirectoryInfo childSource in FileSystem.EnumerateDirectories(source))
{
// per dir we need to re-items for those items excluding a specific dir
string childSubDirectory = hasSubDirectory ? Path.Combine(subDirectory, childSource.Name) : childSource.Name;
IList<RobocopyMetadata> subBucket = new List<RobocopyMetadata>();
foreach (RobocopyMetadata item in bucket)
{
if (item.IsMatch(childSubDirectory, subDirectory, isFile: false))
{
subBucket.Add(item);
}
}
CopySearch(subBucket, isRecursive: true, match, childSource, childSubDirectory);
}
}
}