From a3cfebf438266029452f2173119182388db79798 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Tue, 8 Dec 2020 10:58:08 +0100 Subject: [PATCH] Create BuildFormula from installed with InstallDatabase Instead of using the DefinitionDB which supposedly contains only the relations present in the online repositories. In this way the solver its more consistent and tries to solve with only the internal definitions. This also fixes quirks with luet upgrade --universe --- pkg/solver/parallel.go | 12 ++++++------ pkg/solver/solver.go | 39 +++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/pkg/solver/parallel.go b/pkg/solver/parallel.go index 1dca5bdb..4b5226d1 100644 --- a/pkg/solver/parallel.go +++ b/pkg/solver/parallel.go @@ -76,7 +76,7 @@ func (s *Parallel) noRulesInstalled() bool { return true } -func (s *Parallel) buildParallelFormula(formulas []bf.Formula, packages pkg.Packages) (bf.Formula, error) { +func (s *Parallel) buildParallelFormula(db pkg.PackageDatabase, formulas []bf.Formula, packages pkg.Packages) (bf.Formula, error) { var wg = new(sync.WaitGroup) var wg2 = new(sync.WaitGroup) @@ -87,7 +87,7 @@ func (s *Parallel) buildParallelFormula(formulas []bf.Formula, packages pkg.Pack go func(wg *sync.WaitGroup, c <-chan pkg.Package) { defer wg.Done() for p := range c { - solvable, err := p.BuildFormula(s.DefinitionDatabase, s.ParallelDatabase) + solvable, err := p.BuildFormula(db, s.ParallelDatabase) if err != nil { panic(err) } @@ -126,13 +126,13 @@ func (s *Parallel) BuildInstalled() (bf.Formula, error) { var packages pkg.Packages for _, p := range s.Installed() { packages = append(packages, p) - for _, dep := range p.Related(s.DefinitionDatabase) { + for _, dep := range p.Related(s.InstalledDatabase) { packages = append(packages, dep) } } - return s.buildParallelFormula(formulas, packages) + return s.buildParallelFormula(s.InstalledDatabase, formulas, packages) } // BuildWorld builds the formula which olds the requirements from the package definitions @@ -148,7 +148,7 @@ func (s *Parallel) BuildWorld(includeInstalled bool) (bf.Formula, error) { //f = bf.And(f, solvable) formulas = append(formulas, solvable) } - return s.buildParallelFormula(formulas, s.World()) + return s.buildParallelFormula(s.DefinitionDatabase, formulas, s.World()) } // BuildWorld builds the formula which olds the requirements from the package definitions @@ -200,7 +200,7 @@ func (s *Parallel) BuildPartialWorld(includeInstalled bool) (bf.Formula, error) close(results) wg2.Wait() - return s.buildParallelFormula(formulas, packages) + return s.buildParallelFormula(s.DefinitionDatabase, formulas, packages) //return s.buildParallelFormula(formulas, s.World()) } diff --git a/pkg/solver/solver.go b/pkg/solver/solver.go index 4a53adc4..918548fa 100644 --- a/pkg/solver/solver.go +++ b/pkg/solver/solver.go @@ -134,13 +134,13 @@ func (s *Solver) BuildInstalled() (bf.Formula, error) { var packages pkg.Packages for _, p := range s.Installed() { packages = append(packages, p) - for _, dep := range p.Related(s.DefinitionDatabase) { + for _, dep := range p.Related(s.InstalledDatabase) { packages = append(packages, dep) } } for _, p := range packages { - solvable, err := p.BuildFormula(s.DefinitionDatabase, s.SolverDatabase) + solvable, err := p.BuildFormula(s.InstalledDatabase, s.SolverDatabase) if err != nil { return nil, err } @@ -399,6 +399,7 @@ func (s *Solver) UpgradeUniverse(dropremoved bool) (pkg.Packages, PackagesAssert notUptodate := pkg.Packages{} removed := pkg.Packages{} toUpgrade := pkg.Packages{} + replacements := map[pkg.Package]pkg.Package{} // TODO: this is memory expensive, we need to optimize this universe := pkg.NewInMemoryDatabase(false) @@ -424,6 +425,7 @@ func (s *Solver) UpgradeUniverse(dropremoved bool) (pkg.Packages, PackagesAssert if !bestmatch.Matches(p) { notUptodate = append(notUptodate, p) toUpgrade = append(toUpgrade, bestmatch) + replacements[p] = bestmatch } } @@ -437,28 +439,37 @@ func (s *Solver) UpgradeUniverse(dropremoved bool) (pkg.Packages, PackagesAssert // Treat removed packages from universe as marked for deletion if dropremoved { - notUptodate = append(notUptodate, removed...) + // SAT encode the clauses against the world + for _, p := range removed.Unique() { + encodedP, err := p.Encode(universe) + if err != nil { + return nil, nil, errors.Wrap(err, "couldn't encode package") + } + P := bf.Var(encodedP) + formulas = append(formulas, bf.And(bf.Not(P), r)) + } } - // SAT encode the clauses against the world - for _, p := range notUptodate.Unique() { - encodedP, err := p.Encode(universe) + for old, new := range replacements { + oldP, err := old.Encode(universe) if err != nil { return nil, nil, errors.Wrap(err, "couldn't encode package") } - P := bf.Var(encodedP) - formulas = append(formulas, bf.And(bf.Not(P), r)) - } - - for _, p := range toUpgrade { - encodedP, err := p.Encode(universe) + oldencodedP := bf.Var(oldP) + newP, err := new.Encode(universe) if err != nil { return nil, nil, errors.Wrap(err, "couldn't encode package") } - P := bf.Var(encodedP) - formulas = append(formulas, bf.And(P, r)) + newEncodedP := bf.Var(newP) + + //solvable, err := old.BuildFormula(s.DefinitionDatabase, s.SolverDatabase) + solvablenew, err := new.BuildFormula(s.DefinitionDatabase, s.SolverDatabase) + + formulas = append(formulas, bf.And(bf.Not(oldencodedP), bf.And(append(solvablenew, newEncodedP)...))) } + //formulas = append(formulas, r) + markedForRemoval := pkg.Packages{} if len(formulas) == 0 {