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();
            }
        }
Beispiel #2
0
        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);
                }
            }
        }