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); }
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>()); }
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>()); }