From e615f8e07e575da2cc5545f2bc07da7cb73cc1d7 Mon Sep 17 00:00:00 2001 From: Jo Date: Fri, 31 Mar 2023 23:15:57 +0100 Subject: [PATCH] fix(new_engine): exclude menu removing new deps (#2040) fix exclude menu removing new deps --- pkg/db/mock/repo.go | 24 ++++++++++ pkg/upgrade/service.go | 6 +++ pkg/upgrade/service_test.go | 90 ++++++++++++++++++++++++++++++++++--- 3 files changed, 113 insertions(+), 7 deletions(-) diff --git a/pkg/db/mock/repo.go b/pkg/db/mock/repo.go index 27eff5f1..e9d4049e 100644 --- a/pkg/db/mock/repo.go +++ b/pkg/db/mock/repo.go @@ -6,6 +6,26 @@ import ( alpm "github.com/Jguer/go-alpm/v2" ) +type DependList struct { + Depends []Depend +} + +func (d DependList) Slice() []alpm.Depend { + return d.Depends +} + +func (d DependList) ForEach(f func(*alpm.Depend) error) error { + for i := range d.Depends { + dep := &d.Depends[i] + err := f(dep) + if err != nil { + return err + } + } + + return nil +} + type Package struct { PBase string PBuildDate time.Time @@ -17,6 +37,7 @@ type Package struct { PSize int64 PVersion string PReason alpm.PkgReason + PDepends alpm.IDependList } func (p *Package) Base() string { @@ -88,6 +109,9 @@ func (p *Package) Conflicts() alpm.IDependList { // Depends returns the package's dependency list. func (p *Package) Depends() alpm.IDependList { + if p.PDepends != nil { + return p.PDepends + } return alpm.DependList{} } diff --git a/pkg/upgrade/service.go b/pkg/upgrade/service.go index 8fa3b543..594fbe54 100644 --- a/pkg/upgrade/service.go +++ b/pkg/upgrade/service.go @@ -268,9 +268,15 @@ func (u *UpgradeService) UserExcludeUpgrades(graph *topo.Graph[string, *dep.Inst excluded := make([]string, 0) for i := range allUp.Up { up := &allUp.Up[i] + // choices do not apply to non-installed packages + if up.LocalVersion == "" { + continue + } + if isInclude && otherExclude.Get(up.Repository) { u.log.Debugln("pruning", up.Name) excluded = append(excluded, graph.Prune(up.Name)...) + continue } if isInclude && exclude.Get(allUpLen-i) { diff --git a/pkg/upgrade/service_test.go b/pkg/upgrade/service_test.go index ec9c348e..6666d061 100644 --- a/pkg/upgrade/service_test.go +++ b/pkg/upgrade/service_test.go @@ -50,6 +50,16 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { Devel: true, } + newDepInfo := &dep.InstallInfo{ + Source: dep.Sync, + Reason: dep.Dep, + SyncDBName: ptrString("core"), + Version: "3.0.1-2", + LocalVersion: "", + Upgrade: false, + Devel: false, + } + exampleDepInfoAUR := &dep.InstallInfo{ Source: dep.AUR, Reason: dep.Dep, @@ -70,6 +80,7 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { Devel: false, } + coreDB := mock.NewDB("core") dbExe := &mock.DBExecutor{ InstalledRemotePackageNamesFn: func() []string { return []string{"yay", "example-git"} @@ -92,20 +103,42 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { return mapRemote }, + LocalSatisfierExistsFn: func(string) bool { return false }, + SyncSatisfierFn: func(s string) mock.IPackage { + return &mock.Package{ + PName: "new-dep", + PVersion: "3.0.1-2", + PDB: coreDB, + } + }, SyncUpgradesFn: func(bool) (map[string]db.SyncUpgrade, error) { mapUpgrades := make(map[string]db.SyncUpgrade) - coreDB := mock.NewDB("core") mapUpgrades["linux"] = db.SyncUpgrade{ Package: &mock.Package{ PName: "linux", PVersion: "5.0.0-1", PReason: alpm.PkgReasonDepend, PDB: coreDB, + PDepends: mock.DependList{Depends: []alpm.Depend{ + {Name: "new-dep", Version: "3.0.1"}, + }}, }, LocalVersion: "4.5.0-1", Reason: alpm.PkgReasonExplicit, } + + mapUpgrades["new-dep"] = db.SyncUpgrade{ + Package: &mock.Package{ + PName: "new-dep", + PVersion: "3.0.1-2", + PReason: alpm.PkgReasonDepend, + PDB: coreDB, + }, + LocalVersion: "", + Reason: alpm.PkgReasonDepend, + } + return mapUpgrades, nil }, ReposFn: func() []string { return []string{"core"} }, @@ -118,7 +151,10 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) { return []aur.Pkg{ {Name: "yay", Version: "10.2.4", PackageBase: "yay"}, - {Name: "example-git", Version: "2.2.1.r69.g8a10460-1", PackageBase: "example"}, + { + Name: "example-git", Version: "2.2.1.r69.g8a10460-1", + PackageBase: "example", Depends: []string{"new-dep"}, + }, }, nil }, } @@ -156,6 +192,7 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { "yay": yayDepInfo, "linux": linuxDepInfo, "example-git": exampleDepInfoAUR, + "new-dep": newDepInfo, }, mustNotExist: map[string]bool{}, wantErr: false, @@ -182,6 +219,44 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { wantErr: false, wantExclude: []string{}, }, + { + name: "exclude example-git", + fields: fields{ + input: strings.NewReader("2\n"), + output: io.Discard, + noConfirm: false, + }, + args: args{ + graph: nil, + enableDowngrade: false, + }, + mustExist: map[string]*dep.InstallInfo{ + "yay": yayDepInfo, + "linux": linuxDepInfo, + }, + mustNotExist: map[string]bool{"example-git": true, "new-dep": true}, + wantErr: false, + wantExclude: []string{"example-git", "new-dep"}, + }, + { + name: "exclude new-dep should have no effect", + fields: fields{ + input: strings.NewReader("1 3 4\n"), + output: io.Discard, + noConfirm: false, + }, + args: args{ + graph: nil, + enableDowngrade: false, + }, + mustExist: map[string]*dep.InstallInfo{ + "example-git": exampleDepInfoAUR, + "new-dep": newDepInfo, + }, + mustNotExist: map[string]bool{"linux": true, "yay": true}, + wantErr: false, + wantExclude: []string{"linux", "yay"}, + }, { name: "exclude yay", fields: fields{ @@ -204,7 +279,7 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { { name: "exclude linux", fields: fields{ - input: strings.NewReader("3\n"), + input: strings.NewReader("4\n"), output: io.Discard, noConfirm: false, }, @@ -215,6 +290,7 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { mustExist: map[string]*dep.InstallInfo{ "yay": yayDepInfo, "example-git": exampleDepInfoAUR, + "new-dep": newDepInfo, }, mustNotExist: map[string]bool{"linux": true}, wantErr: false, @@ -223,7 +299,7 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { { name: "only linux", fields: fields{ - input: strings.NewReader("^3\n"), + input: strings.NewReader("^4\n"), output: io.Discard, noConfirm: false, }, @@ -236,12 +312,12 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { }, mustNotExist: map[string]bool{"yay": true, "example-git": true}, wantErr: false, - wantExclude: []string{"yay", "example-git"}, + wantExclude: []string{"yay", "example-git", "new-dep"}, }, { name: "exclude all", fields: fields{ - input: strings.NewReader("1-3\n"), + input: strings.NewReader("1-4\n"), output: io.Discard, noConfirm: false, }, @@ -252,7 +328,7 @@ func TestUpgradeService_GraphUpgrades(t *testing.T) { mustExist: map[string]*dep.InstallInfo{}, mustNotExist: map[string]bool{"yay": true, "example-git": true, "linux": true}, wantErr: false, - wantExclude: []string{"yay", "example-git", "linux"}, + wantExclude: []string{"yay", "example-git", "linux", "new-dep"}, }, } for _, tt := range tests {