فهرست منبع

fix(config): package alpmHandle into runtimeSettings

jguer 4 سال پیش
والد
کامیت
36730a41e3
14فایلهای تغییر یافته به همراه123 افزوده شده و 112 حذف شده
  1. 2 2
      callbacks.go
  2. 7 5
      clean.go
  3. 36 36
      cmd.go
  4. 2 2
      config.go
  5. 5 5
      depPool.go
  6. 4 4
      download.go
  7. 12 10
      install.go
  8. 21 20
      main.go
  9. 1 1
      main_test.go
  10. 2 0
      pkg/settings/runtime.go
  11. 12 10
      print.go
  12. 12 12
      query.go
  13. 4 4
      upgrade.go
  14. 3 1
      vcs.go

+ 2 - 2
callbacks.go

@@ -28,7 +28,7 @@ func questionCallback(question alpm.QuestionAny) {
 
 	size := 0
 
-	_ = qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error {
+	_ = qp.Providers(config.Runtime.AlpmHandle).ForEach(func(pkg alpm.Package) error {
 		size++
 		return nil
 	})
@@ -38,7 +38,7 @@ func questionCallback(question alpm.QuestionAny) {
 	size = 1
 	var db string
 
-	_ = qp.Providers(alpmHandle).ForEach(func(pkg alpm.Package) error {
+	_ = qp.Providers(config.Runtime.AlpmHandle).ForEach(func(pkg alpm.Package) error {
 		thisDB := pkg.DB().Name()
 
 		if db != thisDB {

+ 7 - 5
clean.go

@@ -8,6 +8,8 @@ import (
 
 	"github.com/leonelquinteros/gotext"
 
+	"github.com/Jguer/go-alpm"
+
 	"github.com/Jguer/yay/v10/pkg/query"
 	"github.com/Jguer/yay/v10/pkg/settings"
 	"github.com/Jguer/yay/v10/pkg/stringset"
@@ -36,8 +38,8 @@ func removeVCSPackage(pkgs []string) {
 }
 
 // CleanDependencies removes all dangling dependencies in system
-func cleanDependencies(removeOptional bool) error {
-	hanging, err := hangingPackages(removeOptional)
+func cleanDependencies(removeOptional bool, alpmHandle *alpm.Handle) error {
+	hanging, err := hangingPackages(removeOptional, alpmHandle)
 	if err != nil {
 		return err
 	}
@@ -62,7 +64,7 @@ func cleanRemove(pkgNames []string) error {
 	return show(passToPacman(arguments))
 }
 
-func syncClean(parser *settings.Arguments) error {
+func syncClean(parser *settings.Arguments, alpmHandle *alpm.Handle) error {
 	keepInstalled := false
 	keepCurrent := false
 
@@ -96,7 +98,7 @@ func syncClean(parser *settings.Arguments) error {
 	fmt.Println(gotext.Get("\nBuild directory:"), config.BuildDir)
 
 	if continueTask(question, true) {
-		if err := cleanAUR(keepInstalled, keepCurrent, removeAll); err != nil {
+		if err := cleanAUR(keepInstalled, keepCurrent, removeAll, alpmHandle); err != nil {
 			return err
 		}
 	}
@@ -112,7 +114,7 @@ func syncClean(parser *settings.Arguments) error {
 	return nil
 }
 
-func cleanAUR(keepInstalled, keepCurrent, removeAll bool) error {
+func cleanAUR(keepInstalled, keepCurrent, removeAll bool, alpmHandle *alpm.Handle) error {
 	fmt.Println(gotext.Get("removing AUR packages from cache..."))
 
 	installedBases := make(stringset.StringSet)

+ 36 - 36
cmd.go

@@ -139,7 +139,7 @@ getpkgbuild specific options:
     -f --force            Force download for existing ABS packages`)
 }
 
-func handleCmd() error {
+func handleCmd(alpmHandle *alpm.Handle) error {
 	if cmdArgs.ExistsArg("h", "help") {
 		return handleHelp()
 	}
@@ -157,29 +157,29 @@ func handleCmd() error {
 	case "F", "files":
 		return show(passToPacman(cmdArgs))
 	case "Q", "query":
-		return handleQuery()
+		return handleQuery(alpmHandle)
 	case "R", "remove":
 		return handleRemove()
 	case "S", "sync":
-		return handleSync()
+		return handleSync(alpmHandle)
 	case "T", "deptest":
 		return show(passToPacman(cmdArgs))
 	case "U", "upgrade":
 		return show(passToPacman(cmdArgs))
 	case "G", "getpkgbuild":
-		return handleGetpkgbuild()
+		return handleGetpkgbuild(alpmHandle)
 	case "P", "show":
-		return handlePrint()
+		return handlePrint(alpmHandle)
 	case "Y", "--yay":
-		return handleYay()
+		return handleYay(alpmHandle)
 	}
 
 	return fmt.Errorf(gotext.Get("unhandled operation"))
 }
 
-func handleQuery() error {
+func handleQuery(alpmHandle *alpm.Handle) error {
 	if cmdArgs.ExistsArg("u", "upgrades") {
-		return printUpdateList(cmdArgs)
+		return printUpdateList(cmdArgs, alpmHandle)
 	}
 	return show(passToPacman(cmdArgs))
 }
@@ -196,7 +196,7 @@ func handleVersion() {
 	fmt.Printf("yay v%s - libalpm v%s\n", yayVersion, alpm.Version())
 }
 
-func handlePrint() (err error) {
+func handlePrint(alpmHandle *alpm.Handle) (err error) {
 	switch {
 	case cmdArgs.ExistsArg("d", "defaultconfig"):
 		tmpConfig := settings.MakeConfig()
@@ -205,9 +205,9 @@ func handlePrint() (err error) {
 	case cmdArgs.ExistsArg("g", "currentconfig"):
 		fmt.Printf("%v", config)
 	case cmdArgs.ExistsArg("n", "numberupgrades"):
-		err = printNumberOfUpdates()
+		err = printNumberOfUpdates(alpmHandle)
 	case cmdArgs.ExistsArg("u", "upgrades"):
-		err = printUpdateList(cmdArgs)
+		err = printUpdateList(cmdArgs, alpmHandle)
 	case cmdArgs.ExistsArg("w", "news"):
 		double := cmdArgs.ExistsDouble("w", "news")
 		quiet := cmdArgs.ExistsArg("q", "quiet")
@@ -217,39 +217,39 @@ func handlePrint() (err error) {
 	case cmdArgs.ExistsArg("c", "complete"):
 		err = completion.Show(alpmHandle, config.AURURL, config.Runtime.CompletionPath, config.CompletionInterval, false)
 	case cmdArgs.ExistsArg("s", "stats"):
-		err = localStatistics()
+		err = localStatistics(alpmHandle)
 	default:
 		err = nil
 	}
 	return err
 }
 
-func handleYay() error {
+func handleYay(alpmHandle *alpm.Handle) error {
 	if cmdArgs.ExistsArg("gendb") {
-		return createDevelDB(config.Runtime.VCSPath)
+		return createDevelDB(config.Runtime.VCSPath, alpmHandle)
 	}
 	if cmdArgs.ExistsDouble("c") {
-		return cleanDependencies(true)
+		return cleanDependencies(true, alpmHandle)
 	}
 	if cmdArgs.ExistsArg("c", "clean") {
-		return cleanDependencies(false)
+		return cleanDependencies(false, alpmHandle)
 	}
 	if len(cmdArgs.Targets) > 0 {
-		return handleYogurt()
+		return handleYogurt(alpmHandle)
 	}
 	return nil
 }
 
-func handleGetpkgbuild() error {
-	return getPkgbuilds(cmdArgs.Targets)
+func handleGetpkgbuild(alpmHandle *alpm.Handle) error {
+	return getPkgbuilds(cmdArgs.Targets, alpmHandle)
 }
 
-func handleYogurt() error {
+func handleYogurt(alpmHandle *alpm.Handle) error {
 	config.SearchMode = numberMenu
-	return displayNumberMenu(cmdArgs.Targets)
+	return displayNumberMenu(cmdArgs.Targets, alpmHandle)
 }
 
-func handleSync() error {
+func handleSync(alpmHandle *alpm.Handle) error {
 	targets := cmdArgs.Targets
 
 	if cmdArgs.ExistsArg("s", "search") {
@@ -258,28 +258,28 @@ func handleSync() error {
 		} else {
 			config.SearchMode = detailed
 		}
-		return syncSearch(targets)
+		return syncSearch(targets, alpmHandle)
 	}
 	if cmdArgs.ExistsArg("p", "print", "print-format") {
 		return show(passToPacman(cmdArgs))
 	}
 	if cmdArgs.ExistsArg("c", "clean") {
-		return syncClean(cmdArgs)
+		return syncClean(cmdArgs, alpmHandle)
 	}
 	if cmdArgs.ExistsArg("l", "list") {
-		return syncList(cmdArgs)
+		return syncList(cmdArgs, alpmHandle)
 	}
 	if cmdArgs.ExistsArg("g", "groups") {
 		return show(passToPacman(cmdArgs))
 	}
 	if cmdArgs.ExistsArg("i", "info") {
-		return syncInfo(targets)
+		return syncInfo(targets, alpmHandle)
 	}
 	if cmdArgs.ExistsArg("u", "sysupgrade") {
-		return install(cmdArgs)
+		return install(cmdArgs, alpmHandle)
 	}
 	if len(cmdArgs.Targets) > 0 {
-		return install(cmdArgs)
+		return install(cmdArgs, alpmHandle)
 	}
 	if cmdArgs.ExistsArg("y", "refresh") {
 		return show(passToPacman(cmdArgs))
@@ -297,7 +297,7 @@ func handleRemove() error {
 }
 
 // NumberMenu presents a CLI for selecting packages to install.
-func displayNumberMenu(pkgS []string) error {
+func displayNumberMenu(pkgS []string, alpmHandle *alpm.Handle) error {
 	var (
 		aurErr, repoErr error
 		aq              aurQuery
@@ -312,7 +312,7 @@ func displayNumberMenu(pkgS []string) error {
 		lenaq = len(aq)
 	}
 	if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny {
-		pq, repoErr = queryRepo(pkgS)
+		pq, repoErr = queryRepo(pkgS, alpmHandle)
 		lenpq = len(pq)
 		if repoErr != nil {
 			return repoErr
@@ -326,17 +326,17 @@ func displayNumberMenu(pkgS []string) error {
 	switch config.SortMode {
 	case settings.TopDown:
 		if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny {
-			pq.printSearch()
+			pq.printSearch(alpmHandle)
 		}
 		if config.Runtime.Mode == settings.ModeAUR || config.Runtime.Mode == settings.ModeAny {
-			aq.printSearch(lenpq + 1)
+			aq.printSearch(lenpq+1, alpmHandle)
 		}
 	case settings.BottomUp:
 		if config.Runtime.Mode == settings.ModeAUR || config.Runtime.Mode == settings.ModeAny {
-			aq.printSearch(lenpq + 1)
+			aq.printSearch(lenpq+1, alpmHandle)
 		}
 		if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny {
-			pq.printSearch()
+			pq.printSearch(alpmHandle)
 		}
 	default:
 		return fmt.Errorf(gotext.Get("invalid sort mode. Fix with yay -Y --bottomup --save"))
@@ -407,10 +407,10 @@ func displayNumberMenu(pkgS []string) error {
 		sudoLoopBackground()
 	}
 
-	return install(arguments)
+	return install(arguments, alpmHandle)
 }
 
-func syncList(parser *settings.Arguments) error {
+func syncList(parser *settings.Arguments, alpmHandle *alpm.Handle) error {
 	aur := false
 
 	for i := len(parser.Targets) - 1; i >= 0; i-- {

+ 2 - 2
config.go

@@ -33,7 +33,7 @@ var savedInfo vcsInfo
 var config *settings.Configuration
 
 // AlpmHandle is the alpm handle used by yay.
-var alpmHandle *alpm.Handle
+// var alpmHandle *alpm.Handle
 
 var hideMenus = false
 
@@ -171,7 +171,7 @@ func toUsage(usages []string) alpm.Usage {
 	return ret
 }
 
-func configureAlpm(pacmanConf *pacmanconf.Config) error {
+func configureAlpm(pacmanConf *pacmanconf.Config, alpmHandle *alpm.Handle) error {
 	// TODO: set SigLevel
 	// sigLevel := alpm.SigPackage | alpm.SigPackageOptional | alpm.SigDatabase | alpm.SigDatabaseOptional
 	// localFileSigLevel := alpm.SigUseDefault

+ 5 - 5
depPool.go

@@ -55,7 +55,7 @@ type depPool struct {
 	Warnings *aurWarnings
 }
 
-func makeDepPool() (*depPool, error) {
+func makeDepPool(alpmHandle *alpm.Handle) (*depPool, error) {
 	localDB, err := alpmHandle.LocalDB()
 	if err != nil {
 		return nil, err
@@ -81,7 +81,7 @@ func makeDepPool() (*depPool, error) {
 }
 
 // Includes db/ prefixes and group installs
-func (dp *depPool) ResolveTargets(pkgs []string) error {
+func (dp *depPool) ResolveTargets(pkgs []string, alpmHandle *alpm.Handle) error {
 	// RPC requests are slow
 	// Combine as many AUR package requests as possible into a single RPC
 	// call
@@ -358,14 +358,14 @@ func (dp *depPool) ResolveRepoDependency(pkg *alpm.Package) {
 	})
 }
 
-func getDepPool(pkgs []string, warnings *aurWarnings) (*depPool, error) {
-	dp, err := makeDepPool()
+func getDepPool(pkgs []string, warnings *aurWarnings, alpmHandle *alpm.Handle) (*depPool, error) {
+	dp, err := makeDepPool(alpmHandle)
 	if err != nil {
 		return nil, err
 	}
 
 	dp.Warnings = warnings
-	err = dp.ResolveTargets(pkgs)
+	err = dp.ResolveTargets(pkgs, alpmHandle)
 
 	return dp, err
 }

+ 4 - 4
download.go

@@ -138,7 +138,7 @@ func gitMerge(path, name string) error {
 	return nil
 }
 
-func getPkgbuilds(pkgs []string) error {
+func getPkgbuilds(pkgs []string, alpmHandle *alpm.Handle) error {
 	missing := false
 	wd, err := os.Getwd()
 	if err != nil {
@@ -146,7 +146,7 @@ func getPkgbuilds(pkgs []string) error {
 	}
 
 	pkgs = removeInvalidTargets(pkgs)
-	aur, repo, err := packageSlices(pkgs)
+	aur, repo, err := packageSlices(pkgs, alpmHandle)
 
 	if err != nil {
 		return err
@@ -163,7 +163,7 @@ func getPkgbuilds(pkgs []string) error {
 	}
 
 	if len(repo) > 0 {
-		missing, err = getPkgbuildsfromABS(repo, wd)
+		missing, err = getPkgbuildsfromABS(repo, wd, alpmHandle)
 		if err != nil {
 			return err
 		}
@@ -211,7 +211,7 @@ func getPkgbuilds(pkgs []string) error {
 }
 
 // GetPkgbuild downloads pkgbuild from the ABS.
-func getPkgbuildsfromABS(pkgs []string, path string) (bool, error) {
+func getPkgbuildsfromABS(pkgs []string, path string, alpmHandle *alpm.Handle) (bool, error) {
 	var wg sync.WaitGroup
 	var mux sync.Mutex
 	var errs multierror.MultiError

+ 12 - 10
install.go

@@ -56,7 +56,7 @@ func asexp(parser *settings.Arguments, pkgs []string) error {
 }
 
 // Install handles package installs
-func install(parser *settings.Arguments) (err error) {
+func install(parser *settings.Arguments, alpmHandle *alpm.Handle) (err error) {
 	var incompatible stringset.StringSet
 	var do *depOrder
 
@@ -76,7 +76,7 @@ func install(parser *settings.Arguments) (err error) {
 				}
 			}
 		} else if parser.ExistsArg("y", "refresh") || parser.ExistsArg("u", "sysupgrade") || len(parser.Targets) > 0 {
-			err = earlyPacmanCall(parser)
+			err = earlyPacmanCall(parser, alpmHandle)
 			if err != nil {
 				return err
 			}
@@ -85,10 +85,11 @@ func install(parser *settings.Arguments) (err error) {
 
 	// we may have done -Sy, our handle now has an old
 	// database.
-	err = initAlpmHandle(config.Runtime.PacmanConf)
+	alpmHandle, err = initAlpmHandle(config.Runtime.PacmanConf, alpmHandle)
 	if err != nil {
 		return err
 	}
+	config.Runtime.AlpmHandle = alpmHandle
 
 	_, _, localNames, remoteNames, err := query.FilterPackages(alpmHandle)
 	if err != nil {
@@ -113,7 +114,7 @@ func install(parser *settings.Arguments) (err error) {
 
 	// if we are doing -u also request all packages needing update
 	if parser.ExistsArg("u", "sysupgrade") {
-		aurUp, repoUp, err = upList(warnings)
+		aurUp, repoUp, err = upList(warnings, alpmHandle)
 		if err != nil {
 			return err
 		}
@@ -150,7 +151,7 @@ func install(parser *settings.Arguments) (err error) {
 
 	targets := stringset.FromSlice(parser.Targets)
 
-	dp, err := getDepPool(requestTargets, warnings)
+	dp, err := getDepPool(requestTargets, warnings, alpmHandle)
 	if err != nil {
 		return err
 	}
@@ -312,7 +313,7 @@ func install(parser *settings.Arguments) (err error) {
 		config.NoConfirm = oldValue
 	}
 
-	incompatible, err = getIncompatible(do.Aur, srcinfos)
+	incompatible, err = getIncompatible(do.Aur, srcinfos, alpmHandle)
 	if err != nil {
 		return err
 	}
@@ -364,7 +365,7 @@ func install(parser *settings.Arguments) (err error) {
 		return err
 	}
 
-	err = buildInstallPkgbuilds(dp, do, srcinfos, parser, incompatible, conflicts)
+	err = buildInstallPkgbuilds(dp, do, srcinfos, parser, incompatible, conflicts, alpmHandle)
 	if err != nil {
 		return err
 	}
@@ -411,7 +412,7 @@ func inRepos(syncDB alpm.DBList, pkg string) bool {
 	return !syncDB.FindGroupPkgs(target.Name).Empty()
 }
 
-func earlyPacmanCall(parser *settings.Arguments) error {
+func earlyPacmanCall(parser *settings.Arguments, alpmHandle *alpm.Handle) error {
 	arguments := parser.Copy()
 	arguments.Op = "S"
 	targets := parser.Targets
@@ -457,7 +458,7 @@ func earlyRefresh(parser *settings.Arguments) error {
 	return show(passToPacman(arguments))
 }
 
-func getIncompatible(bases []Base, srcinfos map[string]*gosrc.Srcinfo) (stringset.StringSet, error) {
+func getIncompatible(bases []Base, srcinfos map[string]*gosrc.Srcinfo, alpmHandle *alpm.Handle) (stringset.StringSet, error) {
 	incompatible := make(stringset.StringSet)
 	basesMap := make(map[string]Base)
 	alpmArch, err := alpmHandle.Arch()
@@ -934,7 +935,8 @@ func buildInstallPkgbuilds(
 	srcinfos map[string]*gosrc.Srcinfo,
 	parser *settings.Arguments,
 	incompatible stringset.StringSet,
-	conflicts stringset.MapStringSet) error {
+	conflicts stringset.MapStringSet,
+	alpmHandle *alpm.Handle) error {
 	arguments := parser.Copy()
 	arguments.ClearTargets()
 	arguments.Op = "U"

+ 21 - 20
main.go

@@ -74,7 +74,7 @@ func initBuildDir() error {
 	return nil
 }
 
-func initAlpm(pacmanConfigPath string) (*pacmanconf.Config, error) {
+func initAlpm(pacmanConfigPath string) (*alpm.Handle, *pacmanconf.Config, error) {
 	root := "/"
 	if value, _, exists := cmdArgs.GetArg("root", "r"); exists {
 		root = value
@@ -82,7 +82,7 @@ func initAlpm(pacmanConfigPath string) (*pacmanconf.Config, error) {
 
 	pacmanConf, stderr, err := pacmanconf.PacmanConf("--config", pacmanConfigPath, "--root", root)
 	if err != nil {
-		return nil, fmt.Errorf("%s", stderr)
+		return nil, nil, fmt.Errorf("%s", stderr)
 	}
 
 	if value, _, exists := cmdArgs.GetArg("dbpath", "b"); exists {
@@ -113,8 +113,9 @@ func initAlpm(pacmanConfigPath string) (*pacmanconf.Config, error) {
 		pacmanConf.GPGDir = value
 	}
 
-	if err := initAlpmHandle(pacmanConf); err != nil {
-		return nil, err
+	alpmHandle, err := initAlpmHandle(pacmanConf, nil)
+	if err != nil {
+		return nil, nil, err
 	}
 
 	switch value, _, _ := cmdArgs.GetArg("color"); value {
@@ -128,28 +129,28 @@ func initAlpm(pacmanConfigPath string) (*pacmanconf.Config, error) {
 		text.UseColor = pacmanConf.Color && isTty()
 	}
 
-	return pacmanConf, nil
+	return alpmHandle, pacmanConf, nil
 }
 
-func initAlpmHandle(pacmanConf *pacmanconf.Config) error {
-	if alpmHandle != nil {
-		if errRelease := alpmHandle.Release(); errRelease != nil {
-			return errRelease
+func initAlpmHandle(pacmanConf *pacmanconf.Config, oldAlpmHandle *alpm.Handle) (*alpm.Handle, error) {
+	if oldAlpmHandle != nil {
+		if errRelease := oldAlpmHandle.Release(); errRelease != nil {
+			return nil, errRelease
 		}
 	}
 
-	var err error
-	if alpmHandle, err = alpm.Initialize(pacmanConf.RootDir, pacmanConf.DBPath); err != nil {
-		return errors.New(gotext.Get("unable to CreateHandle: %s", err))
+	alpmHandle, err := alpm.Initialize(pacmanConf.RootDir, pacmanConf.DBPath)
+	if err != nil {
+		return nil, errors.New(gotext.Get("unable to CreateHandle: %s", err))
 	}
 
-	if err := configureAlpm(pacmanConf); err != nil {
-		return err
+	if err := configureAlpm(pacmanConf, alpmHandle); err != nil {
+		return nil, err
 	}
 
 	alpmHandle.SetQuestionCallback(questionCallback)
 	alpmHandle.SetLogCallback(logCallback)
-	return nil
+	return alpmHandle, nil
 }
 
 func exitOnError(err error) {
@@ -157,12 +158,12 @@ func exitOnError(err error) {
 		if str := err.Error(); str != "" {
 			fmt.Fprintln(os.Stderr, str)
 		}
-		cleanup()
+		cleanup(config.Runtime.AlpmHandle)
 		os.Exit(1)
 	}
 }
 
-func cleanup() int {
+func cleanup(alpmHandle *alpm.Handle) int {
 	if alpmHandle != nil {
 		if err := alpmHandle.Release(); err != nil {
 			fmt.Fprintln(os.Stderr, err)
@@ -194,8 +195,8 @@ func main() {
 	config.ExpandEnv()
 	exitOnError(initBuildDir())
 	exitOnError(initVCS(runtime.VCSPath))
-	config.Runtime.PacmanConf, err = initAlpm(config.PacmanConf)
+	config.Runtime.AlpmHandle, config.Runtime.PacmanConf, err = initAlpm(config.PacmanConf)
 	exitOnError(err)
-	exitOnError(handleCmd())
-	os.Exit(cleanup())
+	exitOnError(handleCmd(config.Runtime.AlpmHandle))
+	os.Exit(cleanup(config.Runtime.AlpmHandle))
 }

+ 1 - 1
main_test.go

@@ -16,7 +16,7 @@ func expect(t *testing.T, field string, a interface{}, b interface{}, err error)
 }
 
 func TestInitAlpm(t *testing.T) {
-	pacmanConf, err := initAlpm("testdata/pacman.conf")
+	alpmHandle, pacmanConf, err := initAlpm("testdata/pacman.conf")
 	assert.Nil(t, err)
 	assert.NotNil(t, pacmanConf)
 

+ 2 - 0
pkg/settings/runtime.go

@@ -4,6 +4,7 @@ import (
 	"os"
 	"path/filepath"
 
+	"github.com/Jguer/go-alpm"
 	"github.com/Morganamilo/go-pacmanconf"
 	"github.com/leonelquinteros/gotext"
 	"github.com/pkg/errors"
@@ -32,6 +33,7 @@ type Runtime struct {
 	ConfigPath     string
 	VCSPath        string
 	PacmanConf     *pacmanconf.Config
+	AlpmHandle     *alpm.Handle
 }
 
 func MakeRuntime() (*Runtime, error) {

+ 12 - 10
print.go

@@ -10,6 +10,8 @@ import (
 	"github.com/leonelquinteros/gotext"
 	rpc "github.com/mikkeloscar/aur"
 
+	"github.com/Jguer/go-alpm"
+
 	"github.com/Jguer/yay/v10/pkg/intrange"
 	"github.com/Jguer/yay/v10/pkg/query"
 	"github.com/Jguer/yay/v10/pkg/settings"
@@ -47,7 +49,7 @@ func (warnings *aurWarnings) print() {
 }
 
 // PrintSearch handles printing search results in a given format
-func (q aurQuery) printSearch(start int) {
+func (q aurQuery) printSearch(start int, alpmHandle *alpm.Handle) {
 	localDB, _ := alpmHandle.LocalDB()
 
 	for i := range q {
@@ -92,7 +94,7 @@ func (q aurQuery) printSearch(start int) {
 }
 
 // PrintSearch receives a RepoSearch type and outputs pretty text.
-func (s repoQuery) printSearch() {
+func (s repoQuery) printSearch(alpmHandle *alpm.Handle) {
 	for i, res := range s {
 		var toprint string
 		if config.SearchMode == numberMenu {
@@ -304,7 +306,7 @@ func PrintInfo(a *rpc.Pkg) {
 }
 
 // BiggestPackages prints the name of the ten biggest packages in the system.
-func biggestPackages() {
+func biggestPackages(alpmHandle *alpm.Handle) {
 	localDB, err := alpmHandle.LocalDB()
 	if err != nil {
 		return
@@ -324,8 +326,8 @@ func biggestPackages() {
 }
 
 // localStatistics prints installed packages statistics.
-func localStatistics() error {
-	info, err := statistics()
+func localStatistics(alpmHandle *alpm.Handle) error {
+	info, err := statistics(alpmHandle)
 	if err != nil {
 		return err
 	}
@@ -343,7 +345,7 @@ func localStatistics() error {
 	text.Infoln(gotext.Get("Total Size occupied by packages: %s", cyan(text.Human(info.TotalSize))))
 	fmt.Println(bold(cyan("===========================================")))
 	text.Infoln(gotext.Get("Ten biggest packages:"))
-	biggestPackages()
+	biggestPackages(alpmHandle)
 	fmt.Println(bold(cyan("===========================================")))
 
 	aurInfoPrint(remoteNames)
@@ -352,11 +354,11 @@ func localStatistics() error {
 }
 
 //TODO: Make it less hacky
-func printNumberOfUpdates() error {
+func printNumberOfUpdates(alpmHandle *alpm.Handle) error {
 	warnings := makeWarnings()
 	old := os.Stdout // keep backup of the real stdout
 	os.Stdout = nil
-	aurUp, repoUp, err := upList(warnings)
+	aurUp, repoUp, err := upList(warnings, alpmHandle)
 	os.Stdout = old // restoring the real stdout
 	if err != nil {
 		return err
@@ -367,7 +369,7 @@ func printNumberOfUpdates() error {
 }
 
 //TODO: Make it less hacky
-func printUpdateList(parser *settings.Arguments) error {
+func printUpdateList(parser *settings.Arguments, alpmHandle *alpm.Handle) error {
 	targets := stringset.FromSlice(parser.Targets)
 	warnings := makeWarnings()
 	old := os.Stdout // keep backup of the real stdout
@@ -377,7 +379,7 @@ func printUpdateList(parser *settings.Arguments) error {
 		return err
 	}
 
-	aurUp, repoUp, err := upList(warnings)
+	aurUp, repoUp, err := upList(warnings, alpmHandle)
 	os.Stdout = old // restoring the real stdout
 	if err != nil {
 		return err

+ 12 - 12
query.go

@@ -153,7 +153,7 @@ func narrowSearch(pkgS []string, sortS bool) (aurQuery, error) {
 }
 
 // SyncSearch presents a query to the local repos and to the AUR.
-func syncSearch(pkgS []string) (err error) {
+func syncSearch(pkgS []string, alpmHandle *alpm.Handle) (err error) {
 	pkgS = removeInvalidTargets(pkgS)
 	var aurErr error
 	var repoErr error
@@ -164,7 +164,7 @@ func syncSearch(pkgS []string) (err error) {
 		aq, aurErr = narrowSearch(pkgS, true)
 	}
 	if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny {
-		pq, repoErr = queryRepo(pkgS)
+		pq, repoErr = queryRepo(pkgS, alpmHandle)
 		if repoErr != nil {
 			return err
 		}
@@ -173,17 +173,17 @@ func syncSearch(pkgS []string) (err error) {
 	switch config.SortMode {
 	case settings.TopDown:
 		if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny {
-			pq.printSearch()
+			pq.printSearch(alpmHandle)
 		}
 		if config.Runtime.Mode == settings.ModeAUR || config.Runtime.Mode == settings.ModeAny {
-			aq.printSearch(1)
+			aq.printSearch(1, alpmHandle)
 		}
 	case settings.BottomUp:
 		if config.Runtime.Mode == settings.ModeAUR || config.Runtime.Mode == settings.ModeAny {
-			aq.printSearch(1)
+			aq.printSearch(1, alpmHandle)
 		}
 		if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny {
-			pq.printSearch()
+			pq.printSearch(alpmHandle)
 		}
 	default:
 		return errors.New(gotext.Get("invalid sort mode. Fix with yay -Y --bottomup --save"))
@@ -198,11 +198,11 @@ func syncSearch(pkgS []string) (err error) {
 }
 
 // SyncInfo serves as a pacman -Si for repo packages and AUR packages.
-func syncInfo(pkgS []string) error {
+func syncInfo(pkgS []string, alpmHandle *alpm.Handle) error {
 	var info []*rpc.Pkg
 	missing := false
 	pkgS = removeInvalidTargets(pkgS)
-	aurS, repoS, err := packageSlices(pkgS)
+	aurS, repoS, err := packageSlices(pkgS, alpmHandle)
 	if err != nil {
 		return err
 	}
@@ -252,7 +252,7 @@ func syncInfo(pkgS []string) error {
 }
 
 // Search handles repo searches. Creates a RepoSearch struct.
-func queryRepo(pkgInputN []string) (s repoQuery, err error) {
+func queryRepo(pkgInputN []string, alpmHandle *alpm.Handle) (s repoQuery, err error) {
 	dbList, err := alpmHandle.SyncDBs()
 	if err != nil {
 		return
@@ -279,7 +279,7 @@ func queryRepo(pkgInputN []string) (s repoQuery, err error) {
 }
 
 // PackageSlices separates an input slice into aur and repo slices
-func packageSlices(toCheck []string) (aur, repo []string, err error) {
+func packageSlices(toCheck []string, alpmHandle *alpm.Handle) (aur, repo []string, err error) {
 	dbList, err := alpmHandle.SyncDBs()
 	if err != nil {
 		return nil, nil, err
@@ -322,7 +322,7 @@ func packageSlices(toCheck []string) (aur, repo []string, err error) {
 // HangingPackages returns a list of packages installed as deps
 // and unneeded by the system
 // removeOptional decides whether optional dependencies are counted or not
-func hangingPackages(removeOptional bool) (hanging []string, err error) {
+func hangingPackages(removeOptional bool, alpmHandle *alpm.Handle) (hanging []string, err error) {
 	localDB, err := alpmHandle.LocalDB()
 	if err != nil {
 		return
@@ -410,7 +410,7 @@ func hangingPackages(removeOptional bool) (hanging []string, err error) {
 }
 
 // Statistics returns statistics about packages installed in system
-func statistics() (*struct {
+func statistics(alpmHandle *alpm.Handle) (*struct {
 	Totaln    int
 	Expln     int
 	TotalSize int64

+ 4 - 4
upgrade.go

@@ -41,7 +41,7 @@ func (u upSlice) Less(i, j int) bool {
 		return LessRunes(iRunes, jRunes)
 	}
 
-	syncDB, err := alpmHandle.SyncDBs()
+	syncDB, err := config.Runtime.AlpmHandle.SyncDBs()
 	if err != nil {
 		iRunes := []rune(u[i].Repository)
 		jRunes := []rune(u[j].Repository)
@@ -118,7 +118,7 @@ func getVersionDiff(oldVersion, newVersion string) (left, right string) {
 }
 
 // upList returns lists of packages to upgrade from each source.
-func upList(warnings *aurWarnings) (aurUp, repoUp upSlice, err error) {
+func upList(warnings *aurWarnings, alpmHandle *alpm.Handle) (aurUp, repoUp upSlice, err error) {
 	_, remote, _, remoteNames, err := query.FilterPackages(alpmHandle)
 	if err != nil {
 		return nil, nil, err
@@ -140,7 +140,7 @@ func upList(warnings *aurWarnings) (aurUp, repoUp upSlice, err error) {
 		text.OperationInfoln(gotext.Get("Searching databases for updates..."))
 		wg.Add(1)
 		go func() {
-			repoUp, err = upRepo()
+			repoUp, err = upRepo(alpmHandle)
 			errs.Add(err)
 			wg.Done()
 		}()
@@ -298,7 +298,7 @@ func printLocalNewerThanAUR(
 
 // upRepo gathers local packages and checks if they have new versions.
 // Output: Upgrade type package list.
-func upRepo() (upSlice, error) {
+func upRepo(alpmHandle *alpm.Handle) (upSlice, error) {
 	slice := upSlice{}
 
 	localDB, err := alpmHandle.LocalDB()

+ 3 - 1
vcs.go

@@ -12,6 +12,8 @@ import (
 	gosrc "github.com/Morganamilo/go-srcinfo"
 	"github.com/leonelquinteros/gotext"
 
+	"github.com/Jguer/go-alpm"
+
 	"github.com/Jguer/yay/v10/pkg/query"
 	"github.com/Jguer/yay/v10/pkg/stringset"
 	"github.com/Jguer/yay/v10/pkg/text"
@@ -27,7 +29,7 @@ type shaInfo struct {
 }
 
 // createDevelDB forces yay to create a DB of the existing development packages
-func createDevelDB(vcsFilePath string) error {
+func createDevelDB(vcsFilePath string, alpmHandle *alpm.Handle) error {
 	var mux sync.Mutex
 	var wg sync.WaitGroup