From 984366d3a50e638a5a6dfbdf2fb68658631d6ac3 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Thu, 5 Nov 2020 20:52:02 +0100 Subject: [PATCH] Consider provides during upgrades --- pkg/package/database_boltdb.go | 5 +++++ pkg/package/database_mem.go | 5 +++++ pkg/solver/solver.go | 12 +++++++++--- pkg/solver/solver_test.go | 36 +++++++++++++++++++++++++++++++++- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/pkg/package/database_boltdb.go b/pkg/package/database_boltdb.go index 7997b94b..9c52fc71 100644 --- a/pkg/package/database_boltdb.go +++ b/pkg/package/database_boltdb.go @@ -374,6 +374,11 @@ func (db *BoltDatabase) FindPackages(p Package) (Packages, error) { // FindPackageVersions return the list of the packages beloging to cat/name func (db *BoltDatabase) FindPackageVersions(p Package) (Packages, error) { + // Provides: Treat as the replaced package here + if provided, err := db.getProvide(p); err == nil { + p = provided + } + var versionsInWorld []Package for _, w := range db.World() { if w.GetName() != p.GetName() || w.GetCategory() != p.GetCategory() { diff --git a/pkg/package/database_mem.go b/pkg/package/database_mem.go index 7264c297..c36d8fdf 100644 --- a/pkg/package/database_mem.go +++ b/pkg/package/database_mem.go @@ -225,6 +225,11 @@ func (db *InMemoryDatabase) FindPackage(p Package) (Package, error) { // FindPackages return the list of the packages beloging to cat/name func (db *InMemoryDatabase) FindPackageVersions(p Package) (Packages, error) { + // Provides: Treat as the replaced package here + if provided, err := db.getProvide(p); err == nil { + p = provided + } + versions, ok := db.CacheNoVersion[p.GetPackageName()] if !ok { return nil, errors.New("No versions found for package") diff --git a/pkg/solver/solver.go b/pkg/solver/solver.go index de286a6e..5038bf0a 100644 --- a/pkg/solver/solver.go +++ b/pkg/solver/solver.go @@ -495,14 +495,20 @@ func (s *Solver) Upgrade(checkconflicts, full bool) (pkg.Packages, PackagesAsser availableCache[p.GetName()+p.GetCategory()] = append(availableCache[p.GetName()+p.GetCategory()], p) } + // we do this in memory so we take into account of provides + universe := pkg.NewInMemoryDatabase(false) + for _, p := range s.DefinitionDatabase.World() { + universe.CreatePackage(p) + } + installedcopy := pkg.NewInMemoryDatabase(false) for _, p := range s.InstalledDatabase.World() { installedcopy.CreatePackage(p) - packages, ok := availableCache[p.GetName()+p.GetCategory()] - if ok && len(packages) != 0 { + packages, err := universe.FindPackageVersions(p) + if err == nil && len(packages) != 0 { best := packages.Best(nil) - if best.GetVersion() != p.GetVersion() { + if !best.Matches(p) { toUninstall = append(toUninstall, p) toInstall = append(toInstall, best) } diff --git a/pkg/solver/solver_test.go b/pkg/solver/solver_test.go index c249f528..3eeee792 100644 --- a/pkg/solver/solver_test.go +++ b/pkg/solver/solver_test.go @@ -1209,7 +1209,6 @@ var _ = Describe("Solver", func() { }) }) Context("Upgrades", 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{}) @@ -1219,6 +1218,17 @@ var _ = Describe("Solver", func() { A1 := pkg.NewPackage("a", "1.2", []*pkg.DefaultPackage{&pkg.DefaultPackage{Name: "b", Version: "1.0", Category: "test"}}, []*pkg.DefaultPackage{}) A1.SetCategory("test") + BeforeEach(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") + A1 = pkg.NewPackage("a", "1.2", []*pkg.DefaultPackage{&pkg.DefaultPackage{Name: "b", Version: "1.0", Category: "test"}}, []*pkg.DefaultPackage{}) + A1.SetCategory("test") + }) + It("upgrades correctly", func() { for _, p := range []pkg.Package{A1, B, C} { _, err := dbDefinitions.CreatePackage(p) @@ -1240,7 +1250,31 @@ var _ = Describe("Solver", func() { Expect(solution).To(ContainElement(PackageAssert{Package: B, Value: true})) Expect(solution).To(ContainElement(PackageAssert{Package: C, Value: false})) Expect(len(solution)).To(Equal(3)) + }) + It("upgrades correctly with provides", func() { + B.SetProvides([]*pkg.DefaultPackage{&pkg.DefaultPackage{Name: "a", Version: ">=0", Category: "test"}, &pkg.DefaultPackage{Name: "c", Version: ">=0", Category: "test"}}) + + for _, p := range []pkg.Package{A1, B} { + _, err := dbDefinitions.CreatePackage(p) + Expect(err).ToNot(HaveOccurred()) + } + + for _, p := range []pkg.Package{A, C} { + _, err := dbInstalled.CreatePackage(p) + Expect(err).ToNot(HaveOccurred()) + } + uninstall, solution, err := s.Upgrade(true, true) + Expect(err).ToNot(HaveOccurred()) + + Expect(len(uninstall)).To(Equal(2)) + Expect(uninstall[1].GetName()).To(Equal("c")) + Expect(uninstall[1].GetVersion()).To(Equal("1.5")) + Expect(uninstall[0].GetName()).To(Equal("a")) + Expect(uninstall[0].GetVersion()).To(Equal("1.1")) + + Expect(solution).To(ContainElement(PackageAssert{Package: B, Value: true})) + Expect(len(solution)).To(Equal(1)) }) It("UpgradeUniverse upgrades correctly", func() {