public async Task <PackageFromBuiltInFeedResource> PushPackage(string fileName, Stream contents, OverwriteMode overwriteMode, bool useDeltaCompression) { if (useDeltaCompression) { try { var deltaResult = await AttemptDeltaPush(fileName, contents, overwriteMode).ConfigureAwait(false); if (deltaResult != null) { return(deltaResult); } } catch (Exception ex) when(!(ex is OctopusValidationException)) { Logger.Info("Something went wrong while performing a delta transfer: " + ex.Message); } Logger.Info("Falling back to pushing the complete package to the server"); } else { Logger.Info("Pushing the complete package to the server, as delta compression was explicitly disabled"); } var link = await repository.Link("PackageUpload").ConfigureAwait(false); object pathParameters; // if the link contains overwriteMode then we're connected to a new server, if not use the old `replace` parameter if (link.Contains(OverwriteModeLink.Link)) { pathParameters = new { overwriteMode = overwriteMode }; } else { pathParameters = new { replace = overwriteMode.ConvertToLegacyReplaceFlag(Logger) }; } contents.Seek(0, SeekOrigin.Begin); var result = await repository.Client.Post <FileUpload, PackageFromBuiltInFeedResource>( link, new FileUpload() { Contents = contents, FileName = fileName }, pathParameters).ConfigureAwait(false); Logger.Info("Package transfer completed"); return(result); }
public async Task <OctopusPackageMetadataMappedResource> Push(string packageId, string version, OctopusPackageMetadata octopusMetadata, OverwriteMode overwriteMode) { if (string.IsNullOrWhiteSpace(packageId)) { throw new ArgumentException("A package Id must be supplied", nameof(packageId)); } if (string.IsNullOrWhiteSpace(version)) { throw new ArgumentException("A version must be supplied", nameof(version)); } var resource = new OctopusPackageMetadataVersionResource { PackageId = packageId, Version = version, OctopusPackageMetadata = octopusMetadata }; if (await repository.HasLink("BuildInformation")) { Logger.Warn("Connected to an Octopus server that supports the BuildInformation API. It is recommended you move to using the BuildInformationRepository as the PackageMetadataRepository is deprecated."); } if (!(await repository.HasLink("PackageMetadata"))) { throw new OperationNotSupportedByOctopusServerException( OctopusPackageMetadata.PackageMetadataRequiresOctopusVersionMessage, OctopusPackageMetadata.PackageMetadataRequiresOctopusVersion); } var link = await repository.Link("PackageMetadata"); // if the link contains overwriteMode then we're connected to a new server, if not use the old `replace` parameter if (link.Contains(OverwriteModeLink.Link)) { return(await repository.Client.Post <OctopusPackageMetadataVersionResource, OctopusPackageMetadataMappedResource>(link, resource, new { overwriteMode = overwriteMode })); } else { return(await repository.Client.Post <OctopusPackageMetadataVersionResource, OctopusPackageMetadataMappedResource>(link, resource, new { replace = overwriteMode.ConvertToLegacyReplaceFlag(Logger) })); } }
private PackageFromBuiltInFeedResource AttemptDeltaPush(string fileName, Stream contents, OverwriteMode overwriteMode) { if (!repository.HasLink("PackageDeltaSignature")) { Logger.Info("Server does not support delta compression for package push"); return(null); } if (!PackageIdentityParser.TryParsePackageIdAndVersion(Path.GetFileNameWithoutExtension(fileName), out var packageId, out var version)) { Logger.Info("Could not determine the package ID and/or version based on the supplied filename"); return(null); } PackageSignatureResource signatureResult; try { Logger.Info($"Requesting signature for delta compression from the server for upload of a package with id '{packageId}' and version '{version}'"); signatureResult = repository.Client.Get <PackageSignatureResource>(repository.Link("PackageDeltaSignature"), new { packageId, version }); } catch (OctopusResourceNotFoundException) { Logger.Info("No package with the same ID exists on the server"); return(null); } using (var deltaTempFile = new TemporaryFile()) { var shouldUpload = DeltaCompression.CreateDelta(contents, signatureResult, deltaTempFile.FileName); if (!shouldUpload) { return(null); } using (var delta = File.OpenRead(deltaTempFile.FileName)) { var link = repository.Link("PackageDeltaUpload"); object pathParameters; // if the link contains overwriteMode then we're connected to a new server, if not use the old `replace` parameter if (link.Contains(OverwriteModeLink.Link)) { pathParameters = new { overwriteMode = overwriteMode, packageId, signatureResult.BaseVersion }; } else { pathParameters = new { replace = overwriteMode.ConvertToLegacyReplaceFlag(Logger), packageId, signatureResult.BaseVersion }; } var result = repository.Client.Post <FileUpload, PackageFromBuiltInFeedResource>( link, new FileUpload() { Contents = delta, FileName = Path.GetFileName(fileName) }, pathParameters); Logger.Info($"Delta transfer completed"); return(result); } } }