From ff3b322ea258e68c52af8700cc8268d12a8bbe2f Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Fri, 29 Nov 2019 19:01:55 +0100 Subject: [PATCH] Expand also when selecting candidates to install/uninstall --- pkg/solver/decoder_test.go | 8 +++--- pkg/solver/solver.go | 24 ++++++++++++++--- pkg/solver/solver_test.go | 53 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 8 deletions(-) diff --git a/pkg/solver/decoder_test.go b/pkg/solver/decoder_test.go index a9c80ac3..b929e3b9 100644 --- a/pkg/solver/decoder_test.go +++ b/pkg/solver/decoder_test.go @@ -72,7 +72,7 @@ var _ = Describe("Decoder", func() { Expect(len(solution)).To(Equal(6)) Expect(err).ToNot(HaveOccurred()) - solution = solution.Order(A.GetFingerPrint()) + solution = solution.Order(dbDefinitions, A.GetFingerPrint()) // Expect(len(solution)).To(Equal(6)) Expect(solution[0].Package.GetName()).To(Equal("G")) Expect(solution[1].Package.GetName()).To(Equal("H")) @@ -188,7 +188,7 @@ var _ = Describe("Decoder", func() { Expect(len(solution)).To(Equal(6)) Expect(err).ToNot(HaveOccurred()) - solution = solution.Order(A.GetFingerPrint()) + solution = solution.Order(dbDefinitions, A.GetFingerPrint()) // Expect(len(solution)).To(Equal(6)) Expect(solution[0].Package.GetName()).To(Equal("G")) Expect(solution[1].Package.GetName()).To(Equal("H")) @@ -206,7 +206,7 @@ var _ = Describe("Decoder", func() { Expect(len(solution)).To(Equal(6)) Expect(err).ToNot(HaveOccurred()) - solution = solution.Order(B.GetFingerPrint()) + solution = solution.Order(dbDefinitions, B.GetFingerPrint()) hash2 := solution.AssertionHash() // Expect(len(solution)).To(Equal(6)) @@ -243,7 +243,7 @@ var _ = Describe("Decoder", func() { solution2, err := s.Install([]pkg.Package{Z}) Expect(err).ToNot(HaveOccurred()) - Expect(solution.Order(Y.GetFingerPrint()).Drop(Y).AssertionHash() == solution2.Order(Z.GetFingerPrint()).Drop(Z).AssertionHash()).To(BeTrue()) + Expect(solution.Order(dbDefinitions, Y.GetFingerPrint()).Drop(Y).AssertionHash() == solution2.Order(dbDefinitions, Z.GetFingerPrint()).Drop(Z).AssertionHash()).To(BeTrue()) }) }) diff --git a/pkg/solver/solver.go b/pkg/solver/solver.go index ee9b847d..f6bf9590 100644 --- a/pkg/solver/solver.go +++ b/pkg/solver/solver.go @@ -114,12 +114,18 @@ func (s *Solver) BuildWorld(includeInstalled bool) (bf.Formula, error) { func (s *Solver) getList(db pkg.PackageDatabase, lsp []pkg.Package) ([]pkg.Package, error) { var ls []pkg.Package + w := db.World() + for _, pp := range lsp { cp, err := db.FindPackage(pp) if err != nil { - cp = pp //Relax search, otherwise we cannot compute solutions for packages not in definitions - - //return nil, errors.Wrap(err, "Package not found in db") + packages, err := pp.Expand(&w) + // Expand, and relax search - if not found pick the same one + if err != nil || len(packages) == 0 { + cp = pp + } else { + cp = pkg.Best(packages) + } } ls = append(ls, cp) } @@ -193,7 +199,17 @@ func (s *Solver) Uninstall(c pkg.Package) ([]pkg.Package, error) { var res []pkg.Package candidate, err := s.InstalledDatabase.FindPackage(c) if err != nil { - candidate = c //Relax search, otherwise we cannot compute solutions for packages not in definitions + w := s.InstalledDatabase.World() + + // return nil, errors.Wrap(err, "Couldn't find required package in db definition") + packages, err := c.Expand(&w) + // Info("Expanded", packages, err) + if err != nil || len(packages) == 0 { + candidate = c + } else { + candidate = pkg.Best(packages) + } + //Relax search, otherwise we cannot compute solutions for packages not in definitions // return nil, errors.Wrap(err, "Package not found between installed") } // Build a fake "Installed" - Candidate and its requires tree diff --git a/pkg/solver/solver_test.go b/pkg/solver/solver_test.go index f3a79ded..0f5a3644 100644 --- a/pkg/solver/solver_test.go +++ b/pkg/solver/solver_test.go @@ -272,6 +272,34 @@ var _ = Describe("Solver", func() { Expect(len(solution)).To(Equal(3)) Expect(err).ToNot(HaveOccurred()) }) + + It("Solves deps with more expansion", func() { + + C := pkg.NewPackage("c", "1.5", []*pkg.DefaultPackage{&pkg.DefaultPackage{Name: "a", Version: ">=1.0", Category: "test"}}, []*pkg.DefaultPackage{}) + C.SetCategory("test") + B := pkg.NewPackage("b", "1.0", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{}) + B.SetCategory("test") + A := pkg.NewPackage("a", "1.1", []*pkg.DefaultPackage{&pkg.DefaultPackage{Name: "b", Version: "1.0", Category: "test"}}, []*pkg.DefaultPackage{}) + A.SetCategory("test") + + for _, p := range []pkg.Package{A, B, C} { + _, err := dbDefinitions.CreatePackage(p) + Expect(err).ToNot(HaveOccurred()) + } + + for _, p := range []pkg.Package{} { + _, err := dbInstalled.CreatePackage(p) + Expect(err).ToNot(HaveOccurred()) + } + s = NewSolver(dbInstalled, dbDefinitions, db) + + solution, err := s.Install([]pkg.Package{&pkg.DefaultPackage{Name: "c", Version: ">1.0", Category: "test"}}) + Expect(solution).To(ContainElement(PackageAssert{Package: A, Value: true})) + Expect(solution).To(ContainElement(PackageAssert{Package: B, Value: true})) + Expect(solution).To(ContainElement(PackageAssert{Package: C, Value: true})) + Expect(len(solution)).To(Equal(3)) + Expect(err).ToNot(HaveOccurred()) + }) It("Solves deps with more expansion", func() { E := pkg.NewPackage("E", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{}) @@ -324,7 +352,32 @@ var _ = Describe("Solver", func() { // Expect(solution).To(ContainElement(PackageAssert{Package: C, Value: true})) Expect(len(solution)).To(Equal(1)) }) + It("Uninstalls simple package expanded correctly", func() { + C := pkg.NewPackage("C", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{}) + D := pkg.NewPackage("D", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{}) + B := pkg.NewPackage("B", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{}) + A := pkg.NewPackage("A", "1.2", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{}) + + for _, p := range []pkg.Package{A, B, C, D} { + _, err := dbDefinitions.CreatePackage(p) + Expect(err).ToNot(HaveOccurred()) + } + + for _, p := range []pkg.Package{A, B, C, D} { + _, err := dbInstalled.CreatePackage(p) + Expect(err).ToNot(HaveOccurred()) + } + s = NewSolver(dbInstalled, dbDefinitions, db) + + solution, err := s.Uninstall(&pkg.DefaultPackage{Name: "A", Version: ">1.0"}) + Expect(err).ToNot(HaveOccurred()) + + Expect(solution).To(ContainElement(A.IsFlagged(false))) + + // Expect(solution).To(ContainElement(PackageAssert{Package: C, Value: true})) + Expect(len(solution)).To(Equal(1)) + }) It("Find conflicts", func() { C := pkg.NewPackage("C", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{})