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