public ObsoleteFiles(
List<ManifestReferences> manifestReferencesList,
FileMetadataSet metadataSet) {
// Combine all currently referenced and obsolete files into a
// global sets.
var currentFiles = new HashSet<string>();
var obsoleteFiles = new HashSet<string>();
foreach (var manifestReferences in manifestReferencesList) {
currentFiles.UnionWith(manifestReferences.currentFiles);
obsoleteFiles.UnionWith(manifestReferences.obsoleteFiles);
}
// Fold in obsolete files that are not referenced by manifests.
foreach (var metadataByVersion in metadataSet.Values) {
obsoleteFiles.UnionWith(
metadataByVersion.FindObsoleteVersions());
}
// Filter the obsoleteFiles set for all obsolete files currently
// in use and add to a dictionary indexed by filename
// which contains a list of manifest filenames which reference
// each file.
var referencedObsoleteFiles =
new Dictionary<string, List<string>>();
var obsoleteFilesToDelete = new HashSet<string>();
foreach (var obsoleteFile in obsoleteFiles) {
var manifestsReferencingFile = new List<string>();
foreach (var manifestReferences in manifestReferencesList) {
if (manifestReferences.currentFiles.Contains(
obsoleteFile)) {
manifestsReferencingFile.Add(
manifestReferences.currentMetadata.filename);
}
}
// If the referenced file doesn't exist, ignore it.
if (!File.Exists(obsoleteFile)) {
continue;
}
if (manifestsReferencingFile.Count > 0) {
referencedObsoleteFiles[obsoleteFile] =
manifestsReferencingFile;
} else {
obsoleteFilesToDelete.Add(obsoleteFile);
}
}
unreferenced = obsoleteFilesToDelete;
referenced = referencedObsoleteFiles;
}
}