public void DetailFiles( List <FileHash> movedFileOrder, Dictionary <FileHash, MovedFileSet> movedFileSets, bool reverseOrder = false) { if (Detail) { foreach (FileHash nextHash in movedFileOrder) { Write(" "); MovedFileSet nextFileSet = movedFileSets[nextHash]; List <ManifestFileInfo> leftSide = nextFileSet.OldFiles; List <ManifestFileInfo> rightSide = nextFileSet.NewFiles; if (reverseOrder) { List <ManifestFileInfo> temp = leftSide; leftSide = rightSide; rightSide = temp; } foreach (ManifestFileInfo nextOldFile in leftSide) { Write(Manifest.MakeStandardPathString(nextOldFile)); Write(" "); } Write("->"); foreach (ManifestFileInfo nextNewFile in rightSide) { Write(" "); Write(Manifest.MakeStandardPathString(nextNewFile)); } WriteLine(); } WriteLine(); } }
public void DoUpdate() { // Update manifest information if (Mirror) { if (Manifest.CompareManifestDates(SourceRep.Manifest.ManifestInfoLastModifiedUtc, DestRep.Manifest.ManifestInfoLastModifiedUtc) == false) { WriteLine("Updating destination manifest information."); if (Preview == false) { DestRep.CopyManifestInformation(SourceRep); } } } else if (Manifest.CompareManifestDates(SourceRep.Manifest.ManifestInfoLastModifiedUtc, DestRep.Manifest.ManifestInfoLastModifiedUtc) == false) { WriteLine("Updating destination manifest information."); if (Preview == false) { DestRep.CopyManifestInformation(SourceRep); } } else if (BothWays && SourceRep.Manifest.ManifestInfoLastModifiedUtc < DestRep.Manifest.ManifestInfoLastModifiedUtc) { WriteLine("Updating source manifest information."); if (Preview == false) { SourceRep.CopyManifestInformation(DestRep); } } // Add any new files that are only in source foreach (ManifestFileInfo nextSourceFile in SourceOnlyFiles) { Write( "Adding to dest: " + Manifest.MakeStandardPathString(nextSourceFile)); PutFileHelper( SourceRep, DestRep, nextSourceFile); WriteLine(); } // Deal with files that are only in dest if (Mirror) { foreach (ManifestFileInfo nextDestFile in DestOnlyFiles) { Write( "Removing from dest: " + Manifest.MakeStandardPathString(nextDestFile)); RemoveFileHelper( DestRep, nextDestFile); WriteLine(); } } else if (BothWays) { foreach (ManifestFileInfo nextDestFile in DestOnlyFiles) { Write( "Adding to source: " + Manifest.MakeStandardPathString(nextDestFile)); PutFileHelper( DestRep, SourceRep, nextDestFile); WriteLine(); } } // Update files as needed foreach (ManifestFileInfo nextSourceFile in ChangedFiles.Keys) { ManifestFileInfo nextDestFile = ChangedFiles[nextSourceFile]; if (nextSourceFile.LastModifiedUtc > nextDestFile.LastModifiedUtc) { Write( "Updating dest: " + Manifest.MakeStandardPathString(nextSourceFile)); PutFileHelper( SourceRep, DestRep, nextSourceFile); WriteLine(); } else if ( nextSourceFile.LastModifiedUtc < nextDestFile.LastModifiedUtc) { if (Mirror) { Write( "Updating dest: " + Manifest.MakeStandardPathString(nextSourceFile)); PutFileHelper( SourceRep, DestRep, nextSourceFile); WriteLine(); } else if (BothWays) { Write( "Updating source: " + Manifest.MakeStandardPathString(nextSourceFile)); PutFileHelper( DestRep, SourceRep, nextDestFile); WriteLine(); } } } // Move any files in dest that were moved in source foreach (FileHash nextHash in MovedFileOrder) { MovedFileSet fileSet = MovedFiles[nextHash]; // Determine if dest is newer than source. // Note that moved files can be a group of source files and a // group of dest files. We check for the definitive case // where all source files are more recently modified than all // dest files. So we compare the earliest source modification // against the latest dest modification. DateTime earliestSourceTime = DateTime.MaxValue; DateTime latestSourceTime = DateTime.MinValue; foreach (ManifestFileInfo nextSourceFile in fileSet.SourceFiles) { if (nextSourceFile.RegisteredUtc < earliestSourceTime) { earliestSourceTime = nextSourceFile.RegisteredUtc; } if (nextSourceFile.RegisteredUtc > latestSourceTime) { latestSourceTime = nextSourceFile.RegisteredUtc; } } DateTime earliestDestTime = DateTime.MaxValue; DateTime latestDestTime = DateTime.MinValue; foreach (ManifestFileInfo nextDestFile in fileSet.DestFiles) { if (nextDestFile.RegisteredUtc < earliestDestTime) { earliestDestTime = nextDestFile.RegisteredUtc; } if (nextDestFile.RegisteredUtc > latestDestTime) { latestDestTime = nextDestFile.RegisteredUtc; } } // Only handle the definitive cases bool ambiguousSet = true; if (Mirror || earliestSourceTime > latestDestTime) { ambiguousSet = false; MoveFileSet( SourceRep, fileSet.SourceFiles, DestRep, fileSet.DestFiles); } else if (earliestDestTime > latestSourceTime) { ambiguousSet = false; if (BothWays) { MoveFileSet( DestRep, fileSet.DestFiles, SourceRep, fileSet.SourceFiles); } } if (ambiguousSet == true) { WriteLine("Ambiguous - files were moved on both sides:"); foreach (ManifestFileInfo nextSourceFile in fileSet.SourceFiles) { Write( " Source: " + Manifest.MakeStandardPathString(nextSourceFile)); } foreach (ManifestFileInfo nextDestFile in fileSet.DestFiles) { Write( " Dest: " + Manifest.MakeStandardPathString(nextDestFile)); } WriteLine(); } } HashSet <ManifestFileInfo> infoUpdatedFiles = new HashSet <ManifestFileInfo>(); // Handle last modified dates foreach (ManifestFileInfo nextSourceFile in LastModifiedDateFiles.Keys) { if (infoUpdatedFiles.Contains(nextSourceFile) == false) { ManifestFileInfo nextDestFile = LastModifiedDateFiles[nextSourceFile]; WriteLine( "Updating dest information: " + Manifest.MakeStandardPathString(nextSourceFile)); DestRep.CopyFileInformation(nextDestFile, nextSourceFile); infoUpdatedFiles.Add(nextSourceFile); } } // Handle registered dates foreach (ManifestFileInfo nextSourceFile in RegisteredDateFiles.Keys) { if (infoUpdatedFiles.Contains(nextSourceFile) == false) { ManifestFileInfo nextDestFile = RegisteredDateFiles[nextSourceFile]; WriteLine( "Updating dest information: " + Manifest.MakeStandardPathString(nextSourceFile)); DestRep.CopyFileInformation(nextDestFile, nextSourceFile); infoUpdatedFiles.Add(nextSourceFile); } } }