private PatchResult CreateRepairPatch()
        {
            if (cancel)
            {
                return(PatchResult.Failed);
            }

            Directory.CreateDirectory(repairPatchOutputPath);

            Log(Localization.Get(StringId.CreatingRepairPatch));
            Stopwatch timer = Stopwatch.StartNew();

            // Compress repair patch files and move them to the destination
            Log(Localization.Get(StringId.CompressingFilesToDestination));
            Stopwatch compressTimer = Stopwatch.StartNew();

            for (int i = 0; i < versionInfo.Files.Count; i++)
            {
                if (cancel)
                {
                    return(PatchResult.Failed);
                }

                VersionItem patchItem        = versionInfo.Files[i];
                string      fromAbsolutePath = rootPath + patchItem.Path;
                string      toAbsolutePath   = repairPatchOutputPath + patchItem.Path + PatchParameters.REPAIR_PATCH_FILE_EXTENSION;

                Log(Localization.Get(StringId.CompressingXToY, fromAbsolutePath, toAbsolutePath));
                compressTimer.Reset();
                compressTimer.Start();

                ZipUtils.CompressFile(fromAbsolutePath, toAbsolutePath, compressionFormatRepairPatch);
                Log(Localization.Get(StringId.CompressionFinishedInXSeconds, compressTimer.ElapsedSeconds()));

                patchItem.OnCompressed(new FileInfo(toAbsolutePath));
            }

            if (cancel)
            {
                return(PatchResult.Failed);
            }

            Log(Localization.Get(StringId.PatchCreatedInXSeconds, timer.ElapsedSeconds()));

            // Calculate compression ratio
            long uncompressedTotal = 0L, compressedTotal = 0L;

            for (int i = 0; i < versionInfo.Files.Count; i++)
            {
                uncompressedTotal += versionInfo.Files[i].FileSize;
                compressedTotal   += versionInfo.Files[i].CompressedFileSize;
            }

            Log(Localization.Get(StringId.CompressionRatioIsX, ((double)compressedTotal * 100 / uncompressedTotal).ToString("F2")));

            return(PatchResult.Success);
        }
Beispiel #2
0
        private PatchResult CreateRepairPatch()
        {
            if (cancel)
            {
                return(PatchResult.Failed);
            }

            Directory.CreateDirectory(repairPatchOutputPath);

            Log(Localization.Get(StringId.CreatingRepairPatch));
            Stopwatch timer = Stopwatch.StartNew();

            // Compress repair patch files and move them to the destination
            Log(Localization.Get(StringId.CompressingFilesToDestination));
            Stopwatch compressTimer = Stopwatch.StartNew();

            // Check if we can use existing repair patch files for files that didn't change since the last patch
            string previousRepairPatchFilesRoot = null;

            if (previousVersionInfo != null && previousVersionInfo.CompressionFormat == compressionFormatRepairPatch)
            {
                previousRepairPatchFilesRoot = previousPatchFilesRoot + PatchParameters.REPAIR_PATCH_DIRECTORY + Path.DirectorySeparatorChar;
                if (!Directory.Exists(previousRepairPatchFilesRoot))
                {
                    previousRepairPatchFilesRoot = null;
                }
            }

            for (int i = 0; i < versionInfo.Files.Count; i++)
            {
                if (cancel)
                {
                    return(PatchResult.Failed);
                }

                VersionItem patchItem        = versionInfo.Files[i];
                string      fromAbsolutePath = rootPath + patchItem.Path;
                string      toAbsolutePath   = repairPatchOutputPath + patchItem.Path + PatchParameters.REPAIR_PATCH_FILE_EXTENSION;

                if (previousRepairPatchFilesRoot != null)
                {
                    VersionItem previousPatchItem = previousVersionInfo.Files.Find((item) => item.Path == patchItem.Path);
                    if (previousPatchItem != null && previousPatchItem.FileSize == patchItem.FileSize && previousPatchItem.Md5Hash == patchItem.Md5Hash)
                    {
                        if (dontCreatePatchFilesForUnchangedFiles)
                        {
                            patchItem.CompressedFileSize = previousPatchItem.CompressedFileSize;
                            patchItem.CompressedMd5Hash  = previousPatchItem.CompressedMd5Hash;

                            continue;
                        }

                        FileInfo previousCompressedFile = new FileInfo(previousRepairPatchFilesRoot + patchItem.Path + PatchParameters.REPAIR_PATCH_FILE_EXTENSION);
                        if (previousCompressedFile.Exists && previousCompressedFile.MatchesSignature(previousPatchItem.CompressedFileSize, previousPatchItem.CompressedMd5Hash))
                        {
                            Log(Localization.Get(StringId.CopyingXToPatch, previousCompressedFile.FullName));
                            PatchUtils.CopyFile(previousCompressedFile.FullName, toAbsolutePath);

                            patchItem.CompressedFileSize = previousPatchItem.CompressedFileSize;
                            patchItem.CompressedMd5Hash  = previousPatchItem.CompressedMd5Hash;

                            continue;
                        }
                    }
                }

                Log(Localization.Get(StringId.CompressingXToY, fromAbsolutePath, toAbsolutePath));
                compressTimer.Reset();
                compressTimer.Start();

                ZipUtils.CompressFile(fromAbsolutePath, toAbsolutePath, compressionFormatRepairPatch);
                Log(Localization.Get(StringId.CompressionFinishedInXSeconds, compressTimer.ElapsedSeconds()));

                patchItem.OnCompressed(new FileInfo(toAbsolutePath));
            }

            if (cancel)
            {
                return(PatchResult.Failed);
            }

            Log(Localization.Get(StringId.PatchCreatedInXSeconds, timer.ElapsedSeconds()));

            // Calculate compression ratio
            long uncompressedTotal = 0L, compressedTotal = 0L;

            for (int i = 0; i < versionInfo.Files.Count; i++)
            {
                uncompressedTotal += versionInfo.Files[i].FileSize;
                compressedTotal   += versionInfo.Files[i].CompressedFileSize;
            }

            Log(Localization.Get(StringId.CompressionRatioIsX, ((double)compressedTotal * 100 / uncompressedTotal).ToString("F2")));

            return(PatchResult.Success);
        }