コード例 #1
0
        public int Execute(string[] commandLineArguments)
        {
            options.Parse(commandLineArguments);

            if (string.IsNullOrWhiteSpace(signatureFilePath))
            {
                throw new OptionException("No signature file was specified", "new-file");
            }
            if (string.IsNullOrWhiteSpace(newFilePath))
            {
                throw new OptionException("No new file was specified", "new-file");
            }

            newFilePath       = Path.GetFullPath(newFilePath);
            signatureFilePath = Path.GetFullPath(signatureFilePath);

            var delta = new DeltaBuilder();

            foreach (var config in configuration)
            {
                config(delta);
            }

            if (!File.Exists(signatureFilePath))
            {
                throw new FileNotFoundException("File not found: " + signatureFilePath, signatureFilePath);
            }

            if (!File.Exists(newFilePath))
            {
                throw new FileNotFoundException("File not found: " + newFilePath, newFilePath);
            }

            if (string.IsNullOrWhiteSpace(deltaFilePath))
            {
                deltaFilePath = newFilePath + ".octodelta";
            }
            else
            {
                deltaFilePath = Path.GetFullPath(deltaFilePath);
                var directory = Path.GetDirectoryName(deltaFilePath);
                if (directory != null && !Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
            }

            using (var newFileStream = new FileStream(newFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                using (var signatureStream = new FileStream(signatureFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                    using (var deltaStream = new FileStream(deltaFilePath, FileMode.Create, FileAccess.Write, FileShare.Read))
                    {
                        delta.BuildDeltaAsync(newFileStream, new SignatureReader(signatureStream, delta.ProgressReport), new AggregateCopyOperationsDecorator(new BinaryDeltaWriter(deltaStream))).GetAwaiter().GetResult();
                    }

            return(0);
        }
コード例 #2
0
        public async Task PatchingAsyncXXHash_ForOctodiffSignature_PatchesFile(int baseNumberOfBytes, int newDataNumberOfBytes, short chunkSize)
        {
            // Arrange
            var(baseDataStream, baseSignatureStream, newData, newDataStream) = PrepareTestDataWithOctodiffSignature(baseNumberOfBytes, newDataNumberOfBytes, chunkSize);

            var progressReporter = Substitute.For <IProgress <ProgressReport> >();

            // Act
            var deltaStream  = new MemoryStream();
            var deltaBuilder = new DeltaBuilder();
            await deltaBuilder.BuildDeltaAsync(newDataStream, new SignatureReader(baseSignatureStream, null), new AggregateCopyOperationsDecorator(new BinaryDeltaWriter(deltaStream))).ConfigureAwait(false);

            deltaStream.Seek(0, SeekOrigin.Begin);

            var patchedDataStream = new MemoryStream();
            var deltaApplier      = new DeltaApplier();
            await deltaApplier.ApplyAsync(baseDataStream, new BinaryDeltaReader(deltaStream, progressReporter), patchedDataStream).ConfigureAwait(false);

            // Assert
            CollectionAssert.AreEqual(newData, patchedDataStream.ToArray());
            progressReporter.Received().Report(Arg.Any <ProgressReport>());
        }
コード例 #3
0
        public async Task PatchingAsyncXXHash_ForTheSameData_PatchesFile(int numberOfBytes, short chunkSize)
        {
            // Arrange
            var baseData = new byte[numberOfBytes];

            new Random().NextBytes(baseData);
            var baseDataStream      = new MemoryStream(baseData);
            var baseSignatureStream = new MemoryStream();

            var signatureBuilder = new SignatureBuilder
            {
                ChunkSize = chunkSize
            };

            signatureBuilder.Build(baseDataStream, new SignatureWriter(baseSignatureStream));
            baseSignatureStream.Seek(0, SeekOrigin.Begin);

            var newDataStream = new MemoryStream(baseData);

            var progressReporter = Substitute.For <IProgress <ProgressReport> >();

            // Act
            var deltaStream  = new MemoryStream();
            var deltaBuilder = new DeltaBuilder();
            await deltaBuilder.BuildDeltaAsync(newDataStream, new SignatureReader(baseSignatureStream, null), new AggregateCopyOperationsDecorator(new BinaryDeltaWriter(deltaStream))).ConfigureAwait(false);

            deltaStream.Seek(0, SeekOrigin.Begin);

            var patchedDataStream = new MemoryStream();
            var deltaApplier      = new DeltaApplier();
            await deltaApplier.ApplyAsync(baseDataStream, new BinaryDeltaReader(deltaStream, progressReporter), patchedDataStream).ConfigureAwait(false);

            // Assert
            CollectionAssert.AreEqual(baseData, patchedDataStream.ToArray());
            progressReporter.Received().Report(Arg.Any <ProgressReport>());
        }