Beispiel #1
0
        private async Task <Package> PublishPackageAsync(MigrationContext context, MigratedPackageVersion version, CancellationToken cancellationToken)
        {
            //REST API doesn't currently expose way to publish packages so we have to use the command line

            //Push to target server using NuGet
            await context.Command.PushPackageAsync(Settings.TargetPackageSource, version.FilePath, cancellationToken).ConfigureAwait(false);

            //Now get the package that was just pushed
            var package = await context.TargetService.GetPackageAsync(Settings.TargetFeed, version.PackageName, true, cancellationToken).ConfigureAwait(false);

            if (package == null)
            {
                throw new Exception($"Publish failed for package '{version.PackageName}");
            }

            return(package);
        }
Beispiel #2
0
        private async Task <MigratedPackage> MigratePackageAsync(MigrationContext context, Package package, CancellationToken cancellationToken)
        {
            Logger.StartActivity($"Migrating package '{package.Name}'");

            var migratedPackage = new MigratedPackage(package);

            using (var logger = Logger.BeginScope("MigratePackage"))
            {
                try
                {
                    //Is this blacklisted
                    if (Settings.ExcludePackages.Contains(package.Name, StringComparer.OrdinalIgnoreCase))
                    {
                        Logger.Warning($"Package is excluded, skipping");
                        migratedPackage.Skipped = true;
                        return(migratedPackage);
                    }
                    ;

                    //Does the package already exist
                    var existingPackage = await context.TargetService.GetPackageAsync(Settings.TargetFeed, migratedPackage.Name, true, cancellationToken).ConfigureAwait(false);

                    //For each version of the package to migrate (sorted by version)
                    foreach (var version in package.Versions.OrderBy(v => v.Version))
                    {
                        var migratedVersion = new MigratedPackageVersion()
                        {
                            PackageName = migratedPackage.Name, Version = version.Version
                        };
                        migratedPackage.Versions.Add(migratedVersion);

                        //If it is delisted and we aren't migrating them then skip it
                        if (!version.IsListed && !Settings.IncludeDelistedVersions)
                        {
                            Logger.Warning($"Version {version.Version} is delisted, skipping");
                            migratedVersion.Skipped = true;
                            continue;
                        }
                        else if (existingPackage?.ContainsVersion(version) ?? false)
                        {
                            Logger.Warning($"Version {version.Version} already in target, skipping");
                            migratedVersion.Skipped = true;
                            continue;
                        }
                        ;

                        //Download it
                        migratedVersion.FilePath = FileSystem.BuildPath(context.OutputPath, $"{package.Name}.{version.Version}.nupkg");

                        await context.SourceService.SavePackageAsync(Settings.SourceFeed, migratedVersion.PackageName, migratedVersion.Version, migratedVersion.FilePath, cancellationToken).ConfigureAwait(false);

                        Logger.Info($"Downloaded package '{migratedVersion.FileName}'");

                        cancellationToken.ThrowIfCancellationRequested();
                        var newPackage = await PublishPackageAsync(context, migratedVersion, cancellationToken).ConfigureAwait(false);

                        //If this version is delisted
                        if (!version.IsListed)
                        {
                            cancellationToken.ThrowIfCancellationRequested();
                            await context.TargetService.DelistPackageAsync(Settings.TargetFeed, package.Name, version.Version, cancellationToken).ConfigureAwait(false);

                            Logger.Debug($"Delisted version '{version.Version}'");
                        }
                        ;

                        Logger.Info($"Migrated version '{version.NormalizedVersion}', Id = {newPackage.Id}");
                    }
                    ;
                } catch (Exception e)
                {
                    migratedPackage.Error = e;

                    Logger.Error(e);
                };
            };

            return(migratedPackage);
        }