Example #1
0
        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));
        }
Example #2
0
        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);
        }