From bfde9afc7f110dfb5b46c19791c11a85af4d3162 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Wed, 20 May 2020 23:24:32 +0200 Subject: [PATCH] Add Nodeps and Full options to upgrade --- cmd/uninstall.go | 2 +- cmd/upgrade.go | 6 ++++++ pkg/installer/installer.go | 2 +- pkg/solver/solver.go | 18 +++++++++++------- pkg/solver/solver_test.go | 2 +- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/cmd/uninstall.go b/cmd/uninstall.go index 2c47e076..4234dff8 100644 --- a/cmd/uninstall.go +++ b/cmd/uninstall.go @@ -57,7 +57,7 @@ var uninstallCmd = &cobra.Command{ rate := LuetCfg.Viper.GetFloat64("solver.rate") attempts := LuetCfg.Viper.GetInt("solver.max_attempts") force := LuetCfg.Viper.GetBool("force") - nodeps := LuetCfg.Viper.GetBool("nodeps") + nodeps, _ := cmd.Flags().GetBool("nodeps") full, _ := cmd.Flags().GetBool("full") checkconflicts, _ := cmd.Flags().GetBool("conflictscheck") diff --git a/cmd/upgrade.go b/cmd/upgrade.go index 8bea6cf5..922df5c0 100644 --- a/cmd/upgrade.go +++ b/cmd/upgrade.go @@ -58,6 +58,8 @@ var upgradeCmd = &cobra.Command{ rate := LuetCfg.Viper.GetFloat64("solver.rate") attempts := LuetCfg.Viper.GetInt("solver.max_attempts") force := LuetCfg.Viper.GetBool("force") + nodeps, _ := cmd.Flags().GetBool("nodeps") + full, _ := cmd.Flags().GetBool("full") LuetCfg.GetSolverOptions().Type = stype LuetCfg.GetSolverOptions().LearnRate = float32(rate) @@ -70,6 +72,8 @@ var upgradeCmd = &cobra.Command{ Concurrency: LuetCfg.GetGeneral().Concurrency, SolverOptions: *LuetCfg.GetSolverOptions(), Force: force, + FullUninstall: full, + NoDeps: nodeps, }) inst.Repositories(repos) _, err := inst.SyncRepositories(false) @@ -103,6 +107,8 @@ func init() { upgradeCmd.Flags().Float32("solver-discount", 1.0, "Solver discount rate") upgradeCmd.Flags().Int("solver-attempts", 9000, "Solver maximum attempts") upgradeCmd.Flags().Bool("force", false, "Force upgrade by ignoring errors") + upgradeCmd.Flags().Bool("nodeps", false, "Don't consider package dependencies (harmful! overrides checkconflicts and full!)") + upgradeCmd.Flags().Bool("full", true, "Attempts to remove as much packages as possible which aren't required (slow)") RootCmd.AddCommand(upgradeCmd) } diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go index d29f30bd..4a40d18c 100644 --- a/pkg/installer/installer.go +++ b/pkg/installer/installer.go @@ -74,7 +74,7 @@ func (l *LuetInstaller) Upgrade(s *System) error { syncedRepos.SyncDatabase(allRepos) // compute a "big" world solv := solver.NewResolver(s.Database, allRepos, pkg.NewInMemoryDatabase(false), l.Options.SolverOptions.Resolver()) - uninstall, solution, err := solv.Upgrade(false) + uninstall, solution, err := solv.Upgrade(!l.Options.FullUninstall, l.Options.NoDeps) if err != nil { return errors.Wrap(err, "Failed solving solution for upgrade") } diff --git a/pkg/solver/solver.go b/pkg/solver/solver.go index 09a48b57..73dd86d4 100644 --- a/pkg/solver/solver.go +++ b/pkg/solver/solver.go @@ -36,7 +36,7 @@ type PackageSolver interface { Conflicts(pack pkg.Package, lsp pkg.Packages) (bool, error) World() pkg.Packages - Upgrade(checkconflicts bool) (pkg.Packages, PackagesAssertions, error) + Upgrade(checkconflicts, full bool) (pkg.Packages, PackagesAssertions, error) SetResolver(PackageResolver) @@ -251,7 +251,7 @@ func (s *Solver) ConflictsWithInstalled(p pkg.Package) (bool, error) { return s.ConflictsWith(p, s.Installed()) } -func (s *Solver) Upgrade(checkconflicts bool) (pkg.Packages, PackagesAssertions, error) { +func (s *Solver) Upgrade(checkconflicts, full bool) (pkg.Packages, PackagesAssertions, error) { // First get candidates that needs to be upgraded.. @@ -280,6 +280,12 @@ func (s *Solver) Upgrade(checkconflicts bool) (pkg.Packages, PackagesAssertions, s2 := NewSolver(installedcopy, s.DefinitionDatabase, pkg.NewInMemoryDatabase(false)) s2.SetResolver(s.Resolver) + if !full { + ass := PackagesAssertions{} + for _, i := range toInstall { + ass = append(ass, PackageAssert{Package: i.(*pkg.DefaultPackage), Value: true}) + } + } // Then try to uninstall the versions in the system, and store that tree for _, p := range toUninstall { @@ -288,11 +294,9 @@ func (s *Solver) Upgrade(checkconflicts bool) (pkg.Packages, PackagesAssertions, return nil, nil, errors.Wrap(err, "Could not compute upgrade - couldn't uninstall selected candidate "+p.GetFingerPrint()) } for _, z := range r { - if conflicts, err := s2.Conflicts(z, toInstall); !conflicts { - err = installedcopy.RemovePackage(z) - if err != nil { - return nil, nil, errors.Wrap(err, "Could not compute upgrade - couldn't remove copy of package targetted for removal") - } + err = installedcopy.RemovePackage(z) + if err != nil { + return nil, nil, errors.Wrap(err, "Could not compute upgrade - couldn't remove copy of package targetted for removal") } } } diff --git a/pkg/solver/solver_test.go b/pkg/solver/solver_test.go index 9f25c095..80b01fd1 100644 --- a/pkg/solver/solver_test.go +++ b/pkg/solver/solver_test.go @@ -1045,7 +1045,7 @@ var _ = Describe("Solver", func() { _, err := dbInstalled.CreatePackage(p) Expect(err).ToNot(HaveOccurred()) } - uninstall, solution, err := s.Upgrade(true) + uninstall, solution, err := s.Upgrade(true, true) Expect(err).ToNot(HaveOccurred()) Expect(len(uninstall)).To(Equal(1))