public ISet<TargetRelativePath> Restore(BuildKey builder, IFileSystemDirectory targetRoot, bool aggressive, Regex[] aggressiveExceptions = null)
{
var lck = GetOrCreateLock(builder);
lck.EnterReadLock();
try
{
var dirName = GetCacheDirectoryName(builder);
if (cacheRoot.Value.ChildDirectories.Contains(dirName))
{
var cacheDir = cacheRoot.Value.GetChildDirectory(dirName);
if (cacheDir.Files.Contains(NamesFileName))
{
using (var reader = cacheDir.ReadTextFile(NamesFileName))
{
var result = new HashSet<TargetRelativePath>();
int idx = 0;
string line;
while ((line = reader.ReadLine()) != null)
{
var parts = line.Split(';');
if (parts.Length == 2)
{
var relativeRoot = parts[0];
var relativePath = parts[1];
var fullPath = Path.Combine(relativeRoot, relativePath);
var cacheFileName = idx.ToString(CultureInfo.InvariantCulture);
// It is possible that only a file name (a virtual file) was cached without any contents:
if (cacheDir.Exists(cacheFileName))
{
if (aggressive && BeAggressive(aggressiveExceptions, fullPath))
cacheDir.CopyFile(cacheFileName, targetRoot, fullPath);
else
{
if (aggressive)
log.DebugFormat("Agressive cache restore is disabled for file {0}", fullPath);
CopyIfDifferent(cacheDir, cacheFileName, targetRoot, fullPath);
}
}
result.Add(new TargetRelativePath(relativeRoot, relativePath));
}
idx++;
}
return result;
}
}
}
return new HashSet<TargetRelativePath>();
}
finally
{
lck.ExitReadLock();
}
}