mirror update: add -max-versions to keep the N most recent versions

This commit is contained in:
Rascalov authored and André Roth committed 2026-11-05 11:21:36 +01:00
1 parent 296e901cb6
commit 5bc1047ba8
4 files changed
+81 -36

No files matched your search

+27 -24
View File
@@ -173,33 +173,21 @@ func (l *PackageList) ForEach(handler func(*Package) error) error {
}
// FilterLatest creates a copy of the package list containing only the
// latest version for each package name/architecture pair.
func (l *PackageList) FilterLatest() (*PackageList, error) {
// count latest versions for each package name/architecture pair.
func (l *PackageList) FilterLatest(count int) (*PackageList, error) {
if l == nil {
return nil, fmt.Errorf("package list is nil")
}
filtered := make(map[string]*Package, l.Len())
if count < 1 {
return nil, fmt.Errorf("number of latest versions should be at least 1, got %d", count)
}
groups := make(map[string][]*Package, l.Len())
err := l.ForEach(func(p *Package) error {
key := p.Architecture + "|" + p.Name
existing, found := filtered[key]
if !found {
filtered[key] = p
return nil
}
cmp, compareErr := CompareVersions(p.Version, existing.Version)
switch compareErr {
case nil:
if cmp > 0 {
filtered[key] = p
}
case RightInvalid:
filtered[key] = p
case LeftInvalid, BothInvalid:
}
groups[key] = append(groups[key], p)
return nil
})
@@ -207,11 +195,26 @@ func (l *PackageList) FilterLatest() (*PackageList, error) {
return nil, err
}
result := NewPackageListWithDuplicates(l.duplicatesAllowed, len(filtered))
result := NewPackageListWithDuplicates(l.duplicatesAllowed, len(groups)*count)
for _, pkg := range filtered {
if err = result.Add(pkg); err != nil {
return nil, err
for _, pkgs := range groups {
// sort from latest to oldest
sort.Slice(pkgs, func(i, j int) bool {
return CompareVersions(pkgs[i].Version, pkgs[j].Version) > 0
})
versions := 0
for i, p := range pkgs {
if i == 0 || CompareVersions(p.Version, pkgs[i-1].Version) != 0 {
versions++
if versions > count {
break
}
}
if err = result.Add(p); err != nil {
return nil, err
}
}
}
+15 -7
View File
@@ -698,18 +698,26 @@ func (repo *RemoteRepo) ApplyFilter(dependencyOptions int, filterQuery PackageQu
return
}
// BuildDownloadQueue builds queue, discards current PackageList
func (repo *RemoteRepo) BuildDownloadQueue(packagePool aptly.PackagePool, packageCollection *PackageCollection, checksumStorage aptly.ChecksumStorage, skipExistingPackages, latestOnly bool) (queue []PackageDownloadTask, downloadSize int64, err error) {
// FilterLatest keeps only count latest versions of each package (per architecture)
func (repo *RemoteRepo) FilterLatest(count int) (oldLen, newLen int, err error) {
if repo.packageList == nil {
err = fmt.Errorf("package list is empty, please (re)download package indexes")
return
}
if latestOnly {
repo.packageList, err = repo.packageList.FilterLatest()
if err != nil {
return
}
oldLen = repo.packageList.Len()
repo.packageList, err = repo.packageList.FilterLatest(count)
if repo.packageList != nil {
newLen = repo.packageList.Len()
}
return
}
// BuildDownloadQueue builds queue, discards current PackageList
func (repo *RemoteRepo) BuildDownloadQueue(packagePool aptly.PackagePool, packageCollection *PackageCollection, checksumStorage aptly.ChecksumStorage, skipExistingPackages bool) (queue []PackageDownloadTask, downloadSize int64, err error) {
if repo.packageList == nil {
err = fmt.Errorf("package list is empty, please (re)download package indexes")
return
}
queue = make([]PackageDownloadTask, 0, repo.packageList.Len())