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.
This commit is contained in:
xvqxy 2021-02-05 22:47:03 +01:00 committed by J Guerreiro
parent fd9e2638f9
commit 9fc6d9c128
8 changed files with 60 additions and 9 deletions

32
cmd.go
View file

@ -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")

View file

@ -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
}

View file

@ -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
})

View file

@ -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":

View file

@ -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(),
})
}
}

View file

@ -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 {

View file

@ -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

View file

@ -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(