Bläddra i källkod

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.
xvqxy 4 år sedan
förälder
incheckning
9fc6d9c128
8 ändrade filer med 60 tillägg och 9 borttagningar
  1. 30 2
      cmd.go
  2. 1 1
      install.go
  3. 3 0
      pkg/db/ialpm/alpm.go
  4. 1 0
      pkg/settings/parser.go
  5. 1 0
      pkg/upgrade/sources.go
  6. 6 0
      pkg/upgrade/upgrade.go
  7. 5 4
      print.go
  8. 13 2
      upgrade.go

+ 30 - 2
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")

+ 1 - 1
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
 		}

+ 3 - 0
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
 	})

+ 1 - 0
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":

+ 1 - 0
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(),
 					})
 			}
 		}

+ 6 - 0
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 {

+ 5 - 4
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

+ 13 - 2
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(