Add Best() to solver for package selection based on version

This commit is contained in:
Ettore Di Giacinto
2019-11-16 14:40:58 +01:00
parent 602f5c68d5
commit 32dea6f7fd
4 changed files with 62 additions and 1 deletions

View File

@@ -17,8 +17,10 @@ package solver
import (
"errors"
"sort"
"github.com/crillab/gophersat/bf"
"github.com/hashicorp/go-version"
pkg "github.com/mudler/luet/pkg/package"
)
@@ -29,6 +31,7 @@ type PackageSolver interface {
Uninstall(candidate pkg.Package) ([]pkg.Package, error)
ConflictsWithInstalled(p pkg.Package) (bool, error)
ConflictsWith(p pkg.Package, ls []pkg.Package) (bool, error)
Best([]pkg.Package) pkg.Package
}
// Solver is the default solver for luet
@@ -51,6 +54,31 @@ func NewSolver(init []pkg.Package, w []pkg.Package, db pkg.PackageDatabase) Pack
return &Solver{Installed: init, World: w, Database: db}
}
// TODO: []pkg.Package should have its own type with this kind of methods in (+Unique, sort, etc.)
func (s *Solver) Best(set []pkg.Package) pkg.Package {
var versionsMap map[string]pkg.Package = make(map[string]pkg.Package)
if len(set) == 0 {
panic("Best needs a list with elements")
}
versionsRaw := []string{}
for _, p := range set {
versionsRaw = append(versionsRaw, p.GetVersion())
versionsMap[p.GetVersion()] = p
}
versions := make([]*version.Version, len(versionsRaw))
for i, raw := range versionsRaw {
v, _ := version.NewVersion(raw)
versions[i] = v
}
// After this, the versions are properly sorted
sort.Sort(version.Collection(versions))
return versionsMap[versions[len(versions)-1].Original()]
}
// SetWorld is a setter for the list of all known packages to the solver
func (s *Solver) SetWorld(p []pkg.Package) {