public bool ParseManifests(FileMetadataByVersion metadataByVersion,
FileMetadataSet metadataSet) {
currentFiles = new HashSet<string>();
obsoleteFiles = new HashSet<string>();
int versionIndex = 0;
int numberOfVersions = metadataByVersion.Values.Count;
foreach (FileMetadata metadata in metadataByVersion.Values) {
versionIndex++;
if (!metadata.isManifest) return false;
bool manifestNeedsUpdate = false;
HashSet<string> filesInManifest =
versionIndex < numberOfVersions ?
obsoleteFiles : currentFiles;
StreamReader manifestFile =
new StreamReader(metadata.filename);
string line;
while ((line = manifestFile.ReadLine()) != null) {
var manifestFileMetadata = new FileMetadata(line.Trim());
string filename = manifestFileMetadata.filename;
// Check for a renamed file.
var existingFileMetadata =
metadataSet.FindMetadata(
manifestFileMetadata.filenameCanonical,
manifestFileMetadata.CalculateVersion());
if (existingFileMetadata != null &&
!manifestFileMetadata.filename.Equals(
existingFileMetadata.filename)) {
filename = existingFileMetadata.filename;
manifestNeedsUpdate = true;
}
filesInManifest.Add(filename);
}
manifestFile.Close();
// If this is the most recent manifest version, remove all
// current files from the set to delete.
if (versionIndex == numberOfVersions) {
currentMetadata = metadata;
foreach (var currentFile in filesInManifest) {
obsoleteFiles.Remove(currentFile);
}
}
// Rewrite the manifest to track renamed files.
if (manifestNeedsUpdate) {
File.Delete(metadata.filename);
var writer = new StreamWriter(metadata.filename);
foreach (var filename in filesInManifest) {
writer.WriteLine(filename);
}
writer.Close();
}
}
this.filenameCanonical = metadataByVersion.filenameCanonical;
return true;
}