From 9fc6d9c128fe9f9d6f0ac995c4e1ff0e954703c0 Mon Sep 17 00:00:00 2001 From: xvqxy <76832739+xvqxy@users.noreply.github.com> Date: Fri, 5 Feb 2021 22:47:03 +0100 Subject: [PATCH] fix(query): Respect --deps and --explicit. This fixes #1283. yay --query --upgrades [--explicit|--deps] will not return same packages pacman does extended with AUR packages. yay --show --numberupgrades [--explicit|--deps] will also work. --- cmd.go | 32 ++++++++++++++++++++++++++++++-- install.go | 2 +- pkg/db/ialpm/alpm.go | 3 +++ pkg/settings/parser.go | 1 + pkg/upgrade/sources.go | 1 + pkg/upgrade/upgrade.go | 6 ++++++ print.go | 9 +++++---- upgrade.go | 15 +++++++++++++-- 8 files changed, 60 insertions(+), 9 deletions(-) diff --git a/cmd.go b/cmd.go index 588cffbc..acbb2559 100644 --- a/cmd.go +++ b/cmd.go @@ -16,6 +16,7 @@ import ( "github.com/Jguer/yay/v10/pkg/query" "github.com/Jguer/yay/v10/pkg/settings" "github.com/Jguer/yay/v10/pkg/text" + "github.com/Jguer/yay/v10/pkg/upgrade" "github.com/Jguer/yay/v10/pkg/vcs" ) @@ -179,9 +180,32 @@ func handleCmd(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { return fmt.Errorf(gotext.Get("unhandled operation")) } +func getFilter(cmdArgs *settings.Arguments) (upgrade.Filter, error) { + deps, explicit := cmdArgs.ExistsArg("d", "deps"), cmdArgs.ExistsArg("e", "explicit") + switch { + case deps && explicit: + return nil, fmt.Errorf(gotext.Get("invalid option: '--deps' and '--explicit' may not be used together")) + case deps: + return func(pkg upgrade.Upgrade) bool { + return pkg.Reason == alpm.PkgReasonDepend + }, nil + case explicit: + return func(pkg upgrade.Upgrade) bool { + return pkg.Reason == alpm.PkgReasonExplicit + }, nil + } + return func(pkg upgrade.Upgrade) bool { + return true + }, nil +} + func handleQuery(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { if cmdArgs.ExistsArg("u", "upgrades") { - return printUpdateList(cmdArgs, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade")) + filter, err := getFilter(cmdArgs) + if err != nil { + return err + } + return printUpdateList(cmdArgs, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"), filter) } return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs)) } @@ -208,7 +232,11 @@ func handlePrint(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { fmt.Printf("%v", config) return nil case cmdArgs.ExistsArg("n", "numberupgrades"): - return printNumberOfUpdates(dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade")) + filter, err := getFilter(cmdArgs) + if err != nil { + return err + } + return printNumberOfUpdates(dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"), filter) case cmdArgs.ExistsArg("w", "news"): double := cmdArgs.ExistsDouble("w", "news") quiet := cmdArgs.ExistsArg("q", "quiet") diff --git a/install.go b/install.go index 5bbdd7a2..7eac7a56 100644 --- a/install.go +++ b/install.go @@ -119,7 +119,7 @@ func install(cmdArgs *settings.Arguments, dbExecutor db.Executor, ignoreProvider // if we are doing -u also request all packages needing update if cmdArgs.ExistsArg("u", "sysupgrade") { - aurUp, repoUp, err = upList(warnings, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade")) + aurUp, repoUp, err = upList(warnings, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"), func(upgrade.Upgrade) bool { return true }) if err != nil { return err } diff --git a/pkg/db/ialpm/alpm.go b/pkg/db/ialpm/alpm.go index 44f6430e..6f9d2d9e 100644 --- a/pkg/db/ialpm/alpm.go +++ b/pkg/db/ialpm/alpm.go @@ -421,9 +421,11 @@ func (ae *AlpmExecutor) RepoUpgrades(enableDowngrade bool) (upgrade.UpSlice, err } _ = ae.handle.TransGetAdd().ForEach(func(pkg alpm.IPackage) error { localVer := "-" + reason := alpm.PkgReasonExplicit if localPkg := localDB.Pkg(pkg.Name()); localPkg != nil { localVer = localPkg.Version() + reason = localPkg.Reason() } slice = append(slice, upgrade.Upgrade{ @@ -431,6 +433,7 @@ func (ae *AlpmExecutor) RepoUpgrades(enableDowngrade bool) (upgrade.UpSlice, err Repository: pkg.DB().Name(), LocalVersion: localVer, RemoteVersion: pkg.Version(), + Reason: reason, }) return nil }) diff --git a/pkg/settings/parser.go b/pkg/settings/parser.go index 5f526b64..d73fdf3e 100644 --- a/pkg/settings/parser.go +++ b/pkg/settings/parser.go @@ -326,6 +326,7 @@ func isArg(arg string) bool { case "dbonly": case "absdir": case "noprogressbar": + case "numberupgrades": case "noscriptlet": case "p", "print": case "print-format": diff --git a/pkg/upgrade/sources.go b/pkg/upgrade/sources.go index d8bd6a2c..bb95289b 100644 --- a/pkg/upgrade/sources.go +++ b/pkg/upgrade/sources.go @@ -99,6 +99,7 @@ func UpAUR(remote []alpm.IPackage, aurdata map[string]*rpc.Pkg, timeUpdate bool) Repository: "aur", LocalVersion: pkg.Version(), RemoteVersion: aurPkg.Version, + Reason: pkg.Reason(), }) } } diff --git a/pkg/upgrade/upgrade.go b/pkg/upgrade/upgrade.go index a7bb5ae1..b4a6862f 100644 --- a/pkg/upgrade/upgrade.go +++ b/pkg/upgrade/upgrade.go @@ -6,14 +6,20 @@ import ( "github.com/Jguer/yay/v10/pkg/intrange" "github.com/Jguer/yay/v10/pkg/text" + + alpm "github.com/Jguer/go-alpm/v2" ) +// Filter decides if specific package should be included in theincluded in the results. +type Filter func(Upgrade) bool + // Upgrade type describes a system upgrade. type Upgrade struct { Name string Repository string LocalVersion string RemoteVersion string + Reason alpm.PkgReason } func (u *Upgrade) StylizedNameWithRepository() string { diff --git a/print.go b/print.go index c972e39d..9cc22db9 100644 --- a/print.go +++ b/print.go @@ -16,6 +16,7 @@ import ( "github.com/Jguer/yay/v10/pkg/settings" "github.com/Jguer/yay/v10/pkg/stringset" "github.com/Jguer/yay/v10/pkg/text" + "github.com/Jguer/yay/v10/pkg/upgrade" ) // PrintSearch handles printing search results in a given format @@ -183,11 +184,11 @@ func localStatistics(dbExecutor db.Executor) error { } // TODO: Make it less hacky -func printNumberOfUpdates(dbExecutor db.Executor, enableDowngrade bool) error { +func printNumberOfUpdates(dbExecutor db.Executor, enableDowngrade bool, filter upgrade.Filter) error { warnings := query.NewWarnings() old := os.Stdout // keep backup of the real stdout os.Stdout = nil - aurUp, repoUp, err := upList(warnings, dbExecutor, enableDowngrade) + aurUp, repoUp, err := upList(warnings, dbExecutor, enableDowngrade, filter) os.Stdout = old // restoring the real stdout if err != nil { return err @@ -198,7 +199,7 @@ func printNumberOfUpdates(dbExecutor db.Executor, enableDowngrade bool) error { } // TODO: Make it less hacky -func printUpdateList(cmdArgs *settings.Arguments, dbExecutor db.Executor, enableDowngrade bool) error { +func printUpdateList(cmdArgs *settings.Arguments, dbExecutor db.Executor, enableDowngrade bool, filter upgrade.Filter) error { targets := stringset.FromSlice(cmdArgs.Targets) warnings := query.NewWarnings() old := os.Stdout // keep backup of the real stdout @@ -209,7 +210,7 @@ func printUpdateList(cmdArgs *settings.Arguments, dbExecutor db.Executor, enable return err } - aurUp, repoUp, err := upList(warnings, dbExecutor, enableDowngrade) + aurUp, repoUp, err := upList(warnings, dbExecutor, enableDowngrade, filter) os.Stdout = old // restoring the real stdout if err != nil { return err diff --git a/upgrade.go b/upgrade.go index 90e1ceca..39b52564 100644 --- a/upgrade.go +++ b/upgrade.go @@ -20,8 +20,19 @@ import ( "github.com/Jguer/yay/v10/pkg/upgrade" ) +func filterUpdateList(list upgrade.UpSlice, filter upgrade.Filter) upgrade.UpSlice { + tmp := list[:0] + for _, pkg := range list { + if filter(pkg) { + tmp = append(tmp, pkg) + } + } + return tmp +} + // upList returns lists of packages to upgrade from each source. -func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade bool) (aurUp, repoUp upgrade.UpSlice, err error) { +func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade bool, + filter upgrade.Filter) (aurUp, repoUp upgrade.UpSlice, err error) { remote, remoteNames := query.GetRemotePackages(dbExecutor) var wg sync.WaitGroup @@ -92,7 +103,7 @@ func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade aurUp = develUp } - return aurUp, repoUp, errs.Return() + return filterUpdateList(aurUp, filter), filterUpdateList(repoUp, filter), errs.Return() } func printLocalNewerThanAUR(