private void RunPolicy(IFeed feed, IFeedConfiguration config) { var directory = config.PackagesDirectory; if (!config.RetentionPolicyEnabled) { _log.Debug(string.Format("The '{0}' feed does not use a package retention policy, no packages will be deleted.", feed.Name)); return; } if (!IsPackageDirectoryValid(directory)) { _log.Warn(String.Format("The package directory for the '{0}' feed does not exist. This can happen when no packages have been uploaded to the feed yet.", feed.Name)); return; } _log.Info(string.Format("Running package retention policy for '{0}'. Max release packages: {1}, Max prerelease packages: {2}.", feed.Name, config.MaxReleasePackages, config.MaxPrereleasePackages)); List <IInternalPackage> packages; using (var transaction = Store.BeginTransaction()) { packages = transaction.Query <IInternalPackage>().Where("FeedId = @feedId").Parameter("feedId", feed.Id).ToList(); } Dictionary <string, List <IInternalPackage> > packagesGroupedById = packages.GroupBy(x => x.PackageId).ToDictionary(x => x.Key, x => x.ToList()); int releasePackagesDeleted = 0; int prereleasePackagesDeleted = 0; foreach (var packageGroupList in packagesGroupedById) { var releasePackages = packageGroupList.Value.Where(pk => !pk.IsPrerelease).ToList(); var prereleasePackages = packageGroupList.Value.Where(pk => pk.IsPrerelease).ToList(); if (releasePackages.Count() > config.MaxReleasePackages) { releasePackagesDeleted += FindAndRemoveOldReleasePackages(config, releasePackages); } if (prereleasePackages.Count() > config.MaxPrereleasePackages) { prereleasePackagesDeleted += FindAndRemoveOldPrereleasePackages(config, prereleasePackages); } } _log.Info(string.Format("Finished package retention policy for '{0}'. {1} release packages deleted. {2} prerelease packages deleted.", feed.Name, releasePackagesDeleted, prereleasePackagesDeleted)); }
private int FindAndRemoveOldPrereleasePackages(IFeedConfiguration config, List <IInternalPackage> packages) { packages.Sort((a, b) => a.GetSemanticVersion().CompareTo(b.GetSemanticVersion())); var packageCount = packages.Count(); for (int i = packageCount; i-- > 0;) { var package = packages[i]; //We never want to remove the latest absolute version unless 0 is specified as the max if (package.IsAbsoluteLatestVersion && config.MaxPrereleasePackages > 0) { packages.RemoveAt(i); } } int toDeleteCount = packages.Count() - config.MaxPrereleasePackages; if (toDeleteCount > 0) { _log.Info(string.Format("Deleting {0} prerelease versions of the '{1}' package.", toDeleteCount, packages.First().PackageId)); var packageRepo = PackageRepositoryFactory.Create(config.FeedId); var toDeletePackages = Enumerable.Reverse(packages).Take(toDeleteCount); foreach (var packageToDelete in toDeletePackages) { try { packageRepo.RemovePackage(packageToDelete); } catch (Exception ex) { _log.ErrorException(string.Format("There was an error trying to remove the '{0}' package with version '{1}' for the retention policy.", packageToDelete.PackageId, packageToDelete.Version), ex); } } } return(toDeleteCount > 0 ? toDeleteCount : 0); }