50 lines
2.0 KiB
C#
50 lines
2.0 KiB
C#
using sh.actions.package_cleanup.Models;
|
|
|
|
namespace sh.actions.package_cleanup.Service;
|
|
|
|
public class PackageService(IGiteaPackageService packageService) : IPackageService
|
|
{
|
|
public async Task<List<GiteaPackage>> GetFilteredPackages()
|
|
{
|
|
return (await packageService.GetPackagesByOwnerAsync()).ToList();
|
|
}
|
|
|
|
public List<GiteaPackage> FilterPackagesToDelete(List<GiteaPackage> packages)
|
|
{
|
|
var versionMap = packages.ToDictionary(p => p.Version, p => SoftwareVersion.Parse(p.Version));
|
|
var versionsToKeep = new HashSet<string>();
|
|
|
|
foreach (var package in packages
|
|
.Where(p => string.IsNullOrEmpty(versionMap[p.Version].Suffix))
|
|
.GroupBy(p => versionMap[p.Version].ToString())
|
|
.Select(g => g.OrderBy(p => p.Version.Length).First()))
|
|
{
|
|
versionsToKeep.Add(package.Version);
|
|
}
|
|
|
|
var latestVersion = packages.FirstOrDefault(p => versionMap[p.Version].IsLatest);
|
|
if (latestVersion != null)
|
|
{
|
|
versionsToKeep.Add(latestVersion.Version);
|
|
}
|
|
|
|
var suffixedVersionsToKeep = packages
|
|
.Where(p => !string.IsNullOrEmpty(versionMap[p.Version].Suffix) &&
|
|
!(versionMap[p.Version].Major == 0 && versionMap[p.Version].Minor == 0 &&
|
|
versionMap[p.Version].Patch == 0))
|
|
.GroupBy(p => (versionMap[p.Version].Suffix, versionMap[p.Version].Major, versionMap[p.Version].Minor))
|
|
.SelectMany(g => g
|
|
.OrderByDescending(p => versionMap[p.Version].Patch)
|
|
.ThenByDescending(p => versionMap[p.Version].Build)
|
|
.Take(2)
|
|
.GroupBy(p => versionMap[p.Version].ToString())
|
|
.Select(group => group.OrderBy(p => p.Version.Length).First()));
|
|
|
|
foreach (var package in suffixedVersionsToKeep)
|
|
{
|
|
versionsToKeep.Add(package.Version);
|
|
}
|
|
|
|
return packages.Where(p => !versionsToKeep.Contains(p.Version)).ToList();
|
|
}
|
|
} |