static async Task <IRestResponse> UploadPackageAsyncImpl(PackageFile packageFile, MemoryStream packageStream, string token, CancellationToken cancellationToken) { if (packageFile == null) { throw new ArgumentNullException(nameof(packageFile)); } if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } var client = WithRestClient($"https://{packageFile.NugetPackageEndpoint}/{packageFile.Owner}/", x => { x.Authenticator = new HttpBasicAuthenticator(user, token); }); var request = new RestRequest(Method.PUT); packageStream.Seek(0, SeekOrigin.Begin); cancellationToken.ThrowIfCancellationRequested(); request.AddFile("package", packageStream.CopyTo, packageFile.Filename, packageStream.Length); Console.WriteLine($"[{packageFile.Filename}]: Uploading package."); var response = await client.ExecuteAsync(request, cancellationToken); packageFile.IsUploaded = response.StatusCode == HttpStatusCode.OK; if (packageFile.IsUploaded) { Console.WriteLine($"[{packageFile.Filename}]: {response.Content}"); return(response); } if (FindWarning(response) is { } warning) { Console.WriteLine($"[{packageFile.Filename}]: {warning}"); return(response); } if (response.StatusCode == HttpStatusCode.NotFound) { Console.WriteLine($"[{packageFile.Filename}]: {response.StatusDescription}"); Console.WriteLine($"[{packageFile.Filename}]: Check that '{packageFile.RepositoryUrl}' exists"); return(response); } Console.WriteLine($"[{packageFile.Filename}]: {response.StatusDescription}"); foreach (var header in response.Headers) { Console.WriteLine($"[{packageFile.Filename}]: {header.Name}: {header.Value}"); } return(response); }
public static bool BuildOwnerAndRepositoryFromUrl(PackageFile packageFile, string repositoryUrl) { if (repositoryUrl == null) { return(false); } repositoryUrl = repositoryUrl.Trim(); if (Uri.IsWellFormedUriString(repositoryUrl, UriKind.Relative)) { repositoryUrl = $"https://github.com/{repositoryUrl}"; } if (!Uri.TryCreate(repositoryUrl, UriKind.Absolute, out var repositoryUri) || !IsSupportedHost(repositoryUri.Host)) { return(false); } if (repositoryUri.Scheme != Uri.UriSchemeHttps) { repositoryUri = new UriBuilder(repositoryUri) { Scheme = Uri.UriSchemeHttps, Port = -1 }.Uri; } var ownerAndRepositoryName = repositoryUri.PathAndQuery .Substring(1) .Replace("\\", "/") .Split("/", StringSplitOptions.RemoveEmptyEntries) .ToList(); if (ownerAndRepositoryName.Count != 2) { return(false); } packageFile.Owner = ownerAndRepositoryName[0]; packageFile.RepositoryName = ownerAndRepositoryName[1]; packageFile.RepositoryUrl = $"https://{repositoryUri.Host}/{packageFile.Owner}/{packageFile.RepositoryName}"; if (repositoryUri.Host != "github.com") { packageFile.NugetPackageEndpoint = $"nuget.{repositoryUri.Host}"; } else { packageFile.NugetPackageEndpoint = $"nuget.pkg.github.com"; } return(true); }
public static PackageFile BuildPackageFile(string filename, string repositoryUrl) { var packageFile = new PackageFile { Filename = Path.GetFileName(filename), FilenameAbsolutePath = Path.GetFullPath(filename) }; BuildOwnerAndRepositoryFromUrl(packageFile, repositoryUrl); return(packageFile); }
public static bool ShouldRewriteNupkg(PackageFile packageFile, NuGetVersion nuGetVersion = null) { if (packageFile == null) { throw new ArgumentNullException(nameof(packageFile)); } var manifest = ReadNupkgManifest(packageFile.FilenameAbsolutePath); if (nuGetVersion != null && !nuGetVersion.Equals(manifest.Metadata.Version)) { return(true); } return(!string.Equals(packageFile.RepositoryUrl, FindRepositoryUrl(manifest), StringComparison.OrdinalIgnoreCase)); }
static async Task UploadPackageAsync(PackageFile packageFile, NuGetVersion nuGetVersion, string token, IAsyncPolicy <IRestResponse> retryPolicy, CancellationToken cancellationToken) { if (packageFile == null) { throw new ArgumentNullException(nameof(packageFile)); } cancellationToken.ThrowIfCancellationRequested(); NuGetVersion packageVersion; var shouldRewriteNuspec = NuGetUtilities.ShouldRewriteNupkg(packageFile, nuGetVersion); if (shouldRewriteNuspec) { NuGetUtilities.RewriteNupkg(packageFile, nuGetVersion); var manifest = NuGetUtilities.ReadNupkgManifest(packageFile.FilenameAbsolutePath); packageVersion = manifest.Metadata.Version; } else { var manifest = NuGetUtilities.ReadNupkgManifest(packageFile.FilenameAbsolutePath); packageVersion = manifest.Metadata.Version; } await using var packageStream = packageFile.FilenameAbsolutePath.ReadSharedToStream(); Console.WriteLine($"[{packageFile.Filename}]: " + $"Repository url: {packageFile.RepositoryUrl}. " + $"Version: {packageVersion}. " + $"Size: {packageStream.Length} bytes. "); await retryPolicy.ExecuteAndCaptureAsync(retryCancellationToken => UploadPackageAsyncImpl(packageFile, packageStream, token, retryCancellationToken), cancellationToken); }
public static bool BuildOwnerAndRepositoryFromUrlFromNupkg(PackageFile packageFile) { var manifest = ReadNupkgManifest(packageFile.FilenameAbsolutePath); return(BuildOwnerAndRepositoryFromUrl(packageFile, FindRepositoryUrl(manifest))); }
public static void RewriteNupkg(PackageFile packageFile, NuGetVersion nuGetVersion = null) { if (packageFile == null) { throw new ArgumentNullException(nameof(packageFile)); } var randomId = Guid.NewGuid().ToString("N"); using var packageArchiveReader = new PackageArchiveReader( packageFile.FilenameAbsolutePath.ReadSharedToStream(), false); var nuspecXDocument = packageArchiveReader.NuspecReader.Xml; var packageXElement = nuspecXDocument.Single("package"); var metadataXElement = packageXElement.Single("metadata"); var packageId = packageXElement.Single("id").Value; var versionXElement = metadataXElement.Single("version"); if (nuGetVersion != null) { versionXElement.SetValue(nuGetVersion); } else { nuGetVersion = NuGetVersion.Parse(versionXElement.Value); } var repositoryXElement = metadataXElement.SingleOrDefault("repository"); if (repositoryXElement == null) { repositoryXElement = new XElement("repository"); repositoryXElement.SetAttributeValue("url", packageFile.RepositoryUrl); repositoryXElement.SetAttributeValue("type", "git"); metadataXElement.Add(repositoryXElement); } else { repositoryXElement.SetAttributeValue("url", packageFile.RepositoryUrl); repositoryXElement.SetAttributeValue("type", "git"); } using var nuspecMemoryStream = new MemoryStream(); nuspecXDocument.Save(nuspecMemoryStream); nuspecMemoryStream.Seek(0, SeekOrigin.Begin); var packageFileWorkingDirectoryAbsolutePath = Path.GetDirectoryName(packageFile.FilenameAbsolutePath); var packageFileRewriteWorkingDirectory = Path.Combine(packageFileWorkingDirectoryAbsolutePath, $"{packageId}.{nuGetVersion}_{randomId}"); using var tmpDirectory = new DisposableDirectory(packageFileRewriteWorkingDirectory); ZipFile.ExtractToDirectory(packageFile.FilenameAbsolutePath, tmpDirectory); var nuspecDstFilename = Path.Combine(tmpDirectory, $"{packageId}.nuspec"); File.WriteAllBytes(nuspecDstFilename, nuspecMemoryStream.ToArray()); using var outputStream = new MemoryStream(); var packageBuilder = new PackageBuilder(nuspecMemoryStream, tmpDirectory, propertyProvider => throw new NotImplementedException()); packageBuilder.Save(outputStream); packageFile.Filename = $"{packageId}.{nuGetVersion}.nupkg"; packageFile.FilenameAbsolutePath = Path.Combine(packageFileWorkingDirectoryAbsolutePath, Path.ChangeExtension(packageFile.Filename, ".zip")); packageFile.IsNuspecRewritten = true; File.WriteAllBytes(packageFile.FilenameAbsolutePath, outputStream.ToArray()); }