Ejemplo n.º 1
0
            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);
            }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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));
        }
Ejemplo n.º 5
0
            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);
            }
Ejemplo n.º 6
0
        public static bool BuildOwnerAndRepositoryFromUrlFromNupkg(PackageFile packageFile)
        {
            var manifest = ReadNupkgManifest(packageFile.FilenameAbsolutePath);

            return(BuildOwnerAndRepositoryFromUrl(packageFile, FindRepositoryUrl(manifest)));
        }
Ejemplo n.º 7
0
        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());
        }