Skip to content

Commit cadbe1b

Browse files
committed
Extract BestKey logic
1 parent 853ca9a commit cadbe1b

File tree

3 files changed

+34
-12
lines changed

3 files changed

+34
-12
lines changed

pkg/sat/loader.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sat
22

33
import (
4+
"cmp"
45
"fmt"
56
"regexp"
67
"sort"
@@ -22,12 +23,30 @@ type Loader struct {
2223
varsCount int
2324
}
2425

26+
// BestKey groups packages for the purpose of `--nobest` option disabled,
27+
// so that for each set of packages sharing this key, only the "best" package will be preserved
28+
// (best in terms of repo priority, version criteria).
29+
type BestKey struct {
30+
name string
31+
}
32+
33+
// CompareBestKey provides an arbitrary, deterministic, total order on BestKey
34+
func CompareBestKey(k1 BestKey, k2 BestKey) int {
35+
return cmp.Or(
36+
cmp.Compare(k1.name, k2.name),
37+
)
38+
}
39+
40+
func MakeBestKey(pkg *api.Package) BestKey {
41+
return BestKey{name: pkg.Name}
42+
}
43+
2544
func NewLoader() *Loader {
2645
return &Loader{
2746
m: &Model{
2847
packages: map[string][]*Var{},
2948
vars: map[string]*Var{},
30-
bestPackages: map[string]*api.Package{},
49+
bestPackages: map[BestKey]*api.Package{},
3150
forceIgnoreWithDependencies: map[api.PackageKey]*api.Package{},
3251
},
3352
provides: map[string][]*Var{},
@@ -97,17 +116,18 @@ func (loader *Loader) Load(packages []*api.Package, matched, ignoreRegex, allowR
97116

98117
// Create an index to pick the best candidates
99118
for _, pkg := range packages {
100-
if loader.m.bestPackages[pkg.Name] == nil {
101-
loader.m.bestPackages[pkg.Name] = pkg
102-
} else if rpm.ComparePackage(pkg, loader.m.bestPackages[pkg.Name], archOrder) > 0 {
103-
loader.m.bestPackages[pkg.Name] = pkg
119+
key := MakeBestKey(pkg)
120+
if loader.m.bestPackages[key] == nil {
121+
loader.m.bestPackages[key] = pkg
122+
} else if rpm.ComparePackage(pkg, loader.m.bestPackages[key], archOrder) > 0 {
123+
loader.m.bestPackages[key] = pkg
104124
}
105125
}
106126

107127
if !nobest {
108128
packages = nil
109129
bestPackagesKeys := maps.Keys(loader.m.bestPackages)
110-
slices.Sort(bestPackagesKeys)
130+
slices.SortFunc(bestPackagesKeys, CompareBestKey)
111131
for _, v := range bestPackagesKeys {
112132
packages = append(packages, loader.m.bestPackages[v])
113133
}

pkg/sat/loader_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func expectedBest(g *WithT, m *Model, pkgVersions map[string]string) {
3838
g.Expect(m.bestPackages).To(HaveLen(len(pkgVersions)))
3939

4040
for k, version := range pkgVersions {
41-
g.Expect(m.bestPackages[k].Version.String()).To(Equal(version))
41+
g.Expect(m.bestPackages[BestKey{name: k}].Version.String()).To(Equal(version))
4242
}
4343
}
4444

pkg/sat/sat.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ type Model struct {
5454
// vars contain as key an exact identifier for a provided resource and the actual SAT variable as value
5555
vars map[string]*Var
5656

57-
bestPackages map[string]*api.Package
57+
bestPackages map[BestKey]*api.Package
5858

5959
ands []bf.Formula
6060
forceIgnoreWithDependencies map[api.PackageKey]*api.Package
@@ -68,8 +68,8 @@ func (m *Model) Var(v string) *Var {
6868
return m.vars[v]
6969
}
7070

71-
func (m *Model) BestPackage(p string) *api.Package {
72-
return m.bestPackages[p]
71+
func (m *Model) BestPackage(k BestKey) *api.Package {
72+
return m.bestPackages[k]
7373
}
7474

7575
func (m *Model) Ands() bf.Formula {
@@ -186,8 +186,10 @@ func Resolve(model *Model) (install []*api.Package, excluded []*api.Package, for
186186
}
187187
}
188188
for _, v := range installMap {
189-
if rpm.Compare(model.BestPackage(v.Name).Version, v.Version) != 0 {
190-
logrus.Infof("Picking %v instead of best candiate %v", v, model.BestPackage(v.Name))
189+
key := MakeBestKey(v)
190+
bestPackage := model.BestPackage(key)
191+
if bestPackage != v {
192+
logrus.Infof("Picking %v instead of best candiate %v", v, bestPackage)
191193
}
192194
install = append(install, v)
193195
}

0 commit comments

Comments
 (0)