Переглянути джерело

feat(interface): interface dbexecutor

jguer 4 роки тому
батько
коміт
7a3794ae75
18 змінених файлів з 201 додано та 184 видалено
  1. 0 94
      callbacks.go
  2. 3 3
      clean.go
  3. 9 9
      cmd.go
  4. 2 2
      download.go
  5. 5 5
      install.go
  6. 3 2
      main.go
  7. 3 3
      pkg/completion/completion.go
  8. 25 0
      pkg/db/executor.go
  9. 121 36
      pkg/db/alpm.go
  10. 2 3
      pkg/db/alpm_test.go
  11. 2 2
      pkg/dep/dep.go
  12. 3 3
      pkg/dep/depPool.go
  13. 2 2
      pkg/query/filter.go
  14. 1 3
      pkg/settings/runtime.go
  15. 6 6
      print.go
  16. 6 6
      query.go
  17. 7 4
      upgrade.go
  18. 1 1
      vcs.go

+ 0 - 94
callbacks.go

@@ -1,94 +0,0 @@
-package main
-
-import (
-	"bufio"
-	"fmt"
-	"os"
-	"strconv"
-
-	alpm "github.com/Jguer/go-alpm"
-	"github.com/leonelquinteros/gotext"
-
-	"github.com/Jguer/yay/v10/pkg/settings"
-	"github.com/Jguer/yay/v10/pkg/text"
-)
-
-func questionCallback(question alpm.QuestionAny) {
-	if qi, err := question.QuestionInstallIgnorepkg(); err == nil {
-		qi.SetInstall(true)
-	}
-
-	qp, err := question.QuestionSelectProvider()
-	if err != nil {
-		return
-	}
-
-	if settings.HideMenus {
-		return
-	}
-
-	size := 0
-
-	_ = qp.Providers(config.Runtime.AlpmHandle).ForEach(func(pkg alpm.Package) error {
-		size++
-		return nil
-	})
-
-	str := text.Bold(gotext.Get("There are %d providers available for %s:\n", size, qp.Dep()))
-
-	size = 1
-	var db string
-
-	_ = qp.Providers(config.Runtime.AlpmHandle).ForEach(func(pkg alpm.Package) error {
-		thisDB := pkg.DB().Name()
-
-		if db != thisDB {
-			db = thisDB
-			str += text.SprintOperationInfo(gotext.Get("Repository"), db, "\n    ")
-		}
-		str += fmt.Sprintf("%d) %s ", size, pkg.Name())
-		size++
-		return nil
-	})
-
-	text.OperationInfoln(str)
-
-	for {
-		fmt.Print(gotext.Get("\nEnter a number (default=1): "))
-
-		if config.NoConfirm {
-			fmt.Println()
-			break
-		}
-
-		reader := bufio.NewReader(os.Stdin)
-		numberBuf, overflow, err := reader.ReadLine()
-		if err != nil {
-			text.Errorln(err)
-			break
-		}
-
-		if overflow {
-			text.Errorln(gotext.Get(" Input too long"))
-			continue
-		}
-
-		if string(numberBuf) == "" {
-			break
-		}
-
-		num, err := strconv.Atoi(string(numberBuf))
-		if err != nil {
-			text.Errorln(gotext.Get("invalid number: %s", string(numberBuf)))
-			continue
-		}
-
-		if num < 1 || num > size {
-			text.Errorln(gotext.Get("invalid value: %d is not between %d and %d", num, 1, size))
-			continue
-		}
-
-		qp.SetUseIndex(num - 1)
-		break
-	}
-}

+ 3 - 3
clean.go

@@ -38,7 +38,7 @@ func removeVCSPackage(pkgs []string) {
 }
 
 // CleanDependencies removes all dangling dependencies in system
-func cleanDependencies(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor, removeOptional bool) error {
+func cleanDependencies(cmdArgs *settings.Arguments, dbExecutor db.Executor, removeOptional bool) error {
 	hanging := hangingPackages(removeOptional, dbExecutor)
 	if len(hanging) != 0 {
 		return cleanRemove(cmdArgs, hanging)
@@ -60,7 +60,7 @@ func cleanRemove(cmdArgs *settings.Arguments, pkgNames []string) error {
 	return show(passToPacman(arguments))
 }
 
-func syncClean(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func syncClean(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	keepInstalled := false
 	keepCurrent := false
 
@@ -110,7 +110,7 @@ func syncClean(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
 	return nil
 }
 
-func cleanAUR(keepInstalled, keepCurrent, removeAll bool, dbExecutor *db.AlpmExecutor) error {
+func cleanAUR(keepInstalled, keepCurrent, removeAll bool, dbExecutor db.Executor) error {
 	fmt.Println(gotext.Get("removing AUR packages from cache..."))
 
 	installedBases := make(stringset.StringSet)

+ 9 - 9
cmd.go

@@ -139,7 +139,7 @@ getpkgbuild specific options:
     -f --force            Force download for existing ABS packages`)
 }
 
-func handleCmd(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func handleCmd(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	if cmdArgs.ExistsArg("h", "help") {
 		return handleHelp(cmdArgs)
 	}
@@ -177,7 +177,7 @@ func handleCmd(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
 	return fmt.Errorf(gotext.Get("unhandled operation"))
 }
 
-func handleQuery(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func handleQuery(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	if cmdArgs.ExistsArg("u", "upgrades") {
 		return printUpdateList(cmdArgs, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"))
 	}
@@ -196,7 +196,7 @@ func handleVersion() {
 	fmt.Printf("yay v%s - libalpm v%s\n", yayVersion, alpm.Version())
 }
 
-func handlePrint(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) (err error) {
+func handlePrint(cmdArgs *settings.Arguments, dbExecutor db.Executor) (err error) {
 	switch {
 	case cmdArgs.ExistsArg("d", "defaultconfig"):
 		tmpConfig := settings.MakeConfig()
@@ -222,7 +222,7 @@ func handlePrint(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) (err
 	return err
 }
 
-func handleYay(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func handleYay(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	if cmdArgs.ExistsArg("gendb") {
 		return createDevelDB(config.Runtime.VCSPath, dbExecutor)
 	}
@@ -238,16 +238,16 @@ func handleYay(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
 	return nil
 }
 
-func handleGetpkgbuild(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func handleGetpkgbuild(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	return getPkgbuilds(cmdArgs.Targets, dbExecutor, cmdArgs.ExistsArg("f", "force"))
 }
 
-func handleYogurt(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func handleYogurt(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	config.SearchMode = numberMenu
 	return displayNumberMenu(cmdArgs.Targets, dbExecutor, cmdArgs)
 }
 
-func handleSync(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func handleSync(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	targets := cmdArgs.Targets
 
 	if cmdArgs.ExistsArg("s", "search") {
@@ -295,7 +295,7 @@ func handleRemove(cmdArgs *settings.Arguments) error {
 }
 
 // NumberMenu presents a CLI for selecting packages to install.
-func displayNumberMenu(pkgS []string, dbExecutor *db.AlpmExecutor, cmdArgs *settings.Arguments) error {
+func displayNumberMenu(pkgS []string, dbExecutor db.Executor, cmdArgs *settings.Arguments) error {
 	var (
 		aurErr, repoErr error
 		aq              aurQuery
@@ -408,7 +408,7 @@ func displayNumberMenu(pkgS []string, dbExecutor *db.AlpmExecutor, cmdArgs *sett
 	return install(arguments, dbExecutor, true)
 }
 
-func syncList(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func syncList(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	aur := false
 
 	for i := len(cmdArgs.Targets) - 1; i >= 0; i-- {

+ 2 - 2
download.go

@@ -140,7 +140,7 @@ func gitMerge(path, name string) error {
 	return nil
 }
 
-func getPkgbuilds(pkgs []string, dbExecutor *db.AlpmExecutor, force bool) error {
+func getPkgbuilds(pkgs []string, dbExecutor db.Executor, force bool) error {
 	missing := false
 	wd, err := os.Getwd()
 	if err != nil {
@@ -209,7 +209,7 @@ func getPkgbuilds(pkgs []string, dbExecutor *db.AlpmExecutor, force bool) error
 }
 
 // GetPkgbuild downloads pkgbuild from the ABS.
-func getPkgbuildsfromABS(pkgs []string, path string, dbExecutor *db.AlpmExecutor, force bool) (bool, error) {
+func getPkgbuildsfromABS(pkgs []string, path string, dbExecutor db.Executor, force bool) (bool, error) {
 	var wg sync.WaitGroup
 	var mux sync.Mutex
 	var errs multierror.MultiError

+ 5 - 5
install.go

@@ -62,7 +62,7 @@ func asexp(cmdArgs *settings.Arguments, pkgs []string) error {
 }
 
 // Install handles package installs
-func install(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor, ignoreProviders bool) (err error) {
+func install(cmdArgs *settings.Arguments, dbExecutor db.Executor, ignoreProviders bool) (err error) {
 	var incompatible stringset.StringSet
 	var do *dep.Order
 
@@ -402,7 +402,7 @@ func removeMake(do *dep.Order) error {
 	return err
 }
 
-func inRepos(dbExecutor *db.AlpmExecutor, pkg string) bool {
+func inRepos(dbExecutor db.Executor, pkg string) bool {
 	target := dep.ToTarget(pkg)
 
 	if target.DB == "aur" {
@@ -419,7 +419,7 @@ func inRepos(dbExecutor *db.AlpmExecutor, pkg string) bool {
 	return exists || len(dbExecutor.PackagesFromGroup(target.Name)) > 0
 }
 
-func earlyPacmanCall(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
+func earlyPacmanCall(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
 	arguments := cmdArgs.Copy()
 	arguments.Op = "S"
 	targets := cmdArgs.Targets
@@ -459,7 +459,7 @@ func earlyRefresh(cmdArgs *settings.Arguments) error {
 	return show(passToPacman(arguments))
 }
 
-func getIncompatible(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo, dbExecutor *db.AlpmExecutor) (stringset.StringSet, error) {
+func getIncompatible(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo, dbExecutor db.Executor) (stringset.StringSet, error) {
 	incompatible := make(stringset.StringSet)
 	basesMap := make(map[string]dep.Base)
 	alpmArch, err := dbExecutor.AlpmArch()
@@ -933,7 +933,7 @@ func downloadPkgbuildsSources(bases []dep.Base, incompatible stringset.StringSet
 
 func buildInstallPkgbuilds(
 	cmdArgs *settings.Arguments,
-	dbExecutor *db.AlpmExecutor,
+	dbExecutor db.Executor,
 	dp *dep.Pool,
 	do *dep.Order,
 	srcinfos map[string]*gosrc.Srcinfo,

+ 3 - 2
main.go

@@ -10,6 +10,7 @@ import (
 	"github.com/leonelquinteros/gotext"
 
 	"github.com/Jguer/yay/v10/pkg/db"
+	"github.com/Jguer/yay/v10/pkg/db/ialpm"
 	"github.com/Jguer/yay/v10/pkg/settings"
 	"github.com/Jguer/yay/v10/pkg/text"
 )
@@ -197,7 +198,7 @@ func main() {
 
 	text.UseColor = useColor
 
-	dbExecutor, err := db.NewExecutor(runtime.PacmanConf, questionCallback)
+	dbExecutor, err := ialpm.NewExecutor(runtime.PacmanConf)
 	if err != nil {
 		if str := err.Error(); str != "" {
 			fmt.Fprintln(os.Stderr, str)
@@ -207,7 +208,7 @@ func main() {
 	}
 
 	defer dbExecutor.Cleanup()
-	err = handleCmd(cmdArgs, dbExecutor)
+	err = handleCmd(cmdArgs, db.Executor(dbExecutor))
 	if err != nil {
 		if str := err.Error(); str != "" {
 			fmt.Fprintln(os.Stderr, str)

+ 3 - 3
pkg/completion/completion.go

@@ -16,7 +16,7 @@ import (
 )
 
 // Show provides completion info for shells
-func Show(dbExecutor *db.AlpmExecutor, aurURL, completionPath string, interval int, force bool) error {
+func Show(dbExecutor db.Executor, aurURL, completionPath string, interval int, force bool) error {
 	err := Update(dbExecutor, aurURL, completionPath, interval, force)
 	if err != nil {
 		return err
@@ -33,7 +33,7 @@ func Show(dbExecutor *db.AlpmExecutor, aurURL, completionPath string, interval i
 }
 
 // Update updates completion cache to be used by Complete
-func Update(dbExecutor *db.AlpmExecutor, aurURL, completionPath string, interval int, force bool) error {
+func Update(dbExecutor db.Executor, aurURL, completionPath string, interval int, force bool) error {
 	info, err := os.Stat(completionPath)
 
 	if os.IsNotExist(err) || (interval != -1 && time.Since(info.ModTime()).Hours() >= float64(interval*24)) || force {
@@ -93,7 +93,7 @@ func createAURList(aurURL string, out io.Writer) error {
 }
 
 // CreatePackageList appends Repo packages to completion cache
-func createRepoList(dbExecutor *db.AlpmExecutor, out io.Writer) error {
+func createRepoList(dbExecutor db.Executor, out io.Writer) error {
 	for _, pkg := range dbExecutor.SyncPackages() {
 		_, err := io.WriteString(out, pkg.Name()+"\t"+pkg.DB().Name()+"\n")
 		if err != nil {

+ 25 - 0
pkg/db/executor.go

@@ -4,6 +4,8 @@ import (
 	"time"
 
 	alpm "github.com/Jguer/go-alpm"
+
+	"github.com/Jguer/yay/v10/pkg/upgrade"
 )
 
 type RepoPackage interface {
@@ -18,3 +20,26 @@ type RepoPackage interface {
 	Version() string
 	Reason() alpm.PkgReason
 }
+
+type Executor interface {
+	AlpmArch() (string, error)
+	BiggestPackages() []RepoPackage
+	Cleanup()
+	IsCorrectVersionInstalled(string, string) bool
+	LastBuildTime() time.Time
+	LocalPackage(string) RepoPackage
+	LocalPackages() []RepoPackage
+	LocalSatisfierExists(string) bool
+	PackageConflicts(RepoPackage) []alpm.Depend
+	PackageDepends(RepoPackage) []alpm.Depend
+	PackageFromDB(string, string) RepoPackage
+	PackageGroups(RepoPackage) []string
+	PackageOptionalDepends(RepoPackage) []alpm.Depend
+	PackageProvides(RepoPackage) []alpm.Depend
+	PackagesFromGroup(string) []RepoPackage
+	RefreshHandle() error
+	RepoUpgrades(bool) (upgrade.UpSlice, error)
+	SyncPackages(...string) []RepoPackage
+	SyncSatisfier(string) RepoPackage
+	SyncSatisfierExists(string) bool
+}

+ 121 - 36
pkg/db/alpm.go

@@ -1,30 +1,32 @@
-package db
+package ialpm
 
 import (
+	"bufio"
 	"errors"
 	"fmt"
 	"os"
+	"strconv"
 	"time"
 
 	alpm "github.com/Jguer/go-alpm"
 	pacmanconf "github.com/Morganamilo/go-pacmanconf"
 	"github.com/leonelquinteros/gotext"
 
+	"github.com/Jguer/yay/v10/pkg/db"
+	"github.com/Jguer/yay/v10/pkg/settings"
 	"github.com/Jguer/yay/v10/pkg/text"
 	"github.com/Jguer/yay/v10/pkg/upgrade"
 )
 
 type AlpmExecutor struct {
-	handle           *alpm.Handle
-	localDB          *alpm.DB
-	syncDB           alpm.DBList
-	conf             *pacmanconf.Config
-	questionCallback func(question alpm.QuestionAny)
+	handle  *alpm.Handle
+	localDB *alpm.DB
+	syncDB  alpm.DBList
+	conf    *pacmanconf.Config
 }
 
-func NewExecutor(pacamnConf *pacmanconf.Config,
-	questionCallback func(question alpm.QuestionAny)) (*AlpmExecutor, error) {
-	ae := &AlpmExecutor{conf: pacamnConf, questionCallback: questionCallback}
+func NewExecutor(pacamnConf *pacmanconf.Config) (*AlpmExecutor, error) {
+	ae := &AlpmExecutor{conf: pacamnConf}
 
 	err := ae.RefreshHandle()
 	if err != nil {
@@ -76,13 +78,13 @@ func configureAlpm(pacmanConf *pacmanconf.Config, alpmHandle *alpm.Handle) error
 
 	for _, repo := range pacmanConf.Repos {
 		// TODO: set SigLevel
-		db, err := alpmHandle.RegisterSyncDB(repo.Name, 0)
+		alpmDB, err := alpmHandle.RegisterSyncDB(repo.Name, 0)
 		if err != nil {
 			return err
 		}
 
-		db.SetServers(repo.Servers)
-		db.SetUsage(toUsage(repo.Usage))
+		alpmDB.SetServers(repo.Servers)
+		alpmDB.SetUsage(toUsage(repo.Usage))
 	}
 
 	if err := alpmHandle.SetCacheDirs(pacmanConf.CacheDir); err != nil {
@@ -152,6 +154,89 @@ func logCallback(level alpm.LogLevel, str string) {
 	}
 }
 
+func (ae *AlpmExecutor) questionCallback() func(question alpm.QuestionAny) {
+	return func(question alpm.QuestionAny) {
+		if qi, err := question.QuestionInstallIgnorepkg(); err == nil {
+			qi.SetInstall(true)
+		}
+
+		qp, err := question.QuestionSelectProvider()
+		if err != nil {
+			return
+		}
+
+		if settings.HideMenus {
+			return
+		}
+
+		size := 0
+
+		_ = qp.Providers(ae.handle).ForEach(func(pkg alpm.Package) error {
+			size++
+			return nil
+		})
+
+		str := text.Bold(gotext.Get("There are %d providers available for %s:\n", size, qp.Dep()))
+
+		size = 1
+		var dbName string
+
+		_ = qp.Providers(ae.handle).ForEach(func(pkg alpm.Package) error {
+			thisDB := pkg.DB().Name()
+
+			if dbName != thisDB {
+				dbName = thisDB
+				str += text.SprintOperationInfo(gotext.Get("Repository"), dbName, "\n    ")
+			}
+			str += fmt.Sprintf("%d) %s ", size, pkg.Name())
+			size++
+			return nil
+		})
+
+		text.OperationInfoln(str)
+
+		for {
+			fmt.Print(gotext.Get("\nEnter a number (default=1): "))
+
+			// TODO: reenable noconfirm
+			// if config.NoConfirm {
+			// 	fmt.Println()
+			// 	break
+			// }
+
+			reader := bufio.NewReader(os.Stdin)
+			numberBuf, overflow, err := reader.ReadLine()
+			if err != nil {
+				text.Errorln(err)
+				break
+			}
+
+			if overflow {
+				text.Errorln(gotext.Get(" Input too long"))
+				continue
+			}
+
+			if string(numberBuf) == "" {
+				break
+			}
+
+			num, err := strconv.Atoi(string(numberBuf))
+			if err != nil {
+				text.Errorln(gotext.Get("invalid number: %s", string(numberBuf)))
+				continue
+			}
+
+			if num < 1 || num > size {
+				text.Errorln(gotext.Get("invalid value: %d is not between %d and %d", num, 1, size))
+				continue
+			}
+
+			qp.SetUseIndex(num - 1)
+			break
+		}
+	}
+}
+
 func (ae *AlpmExecutor) RefreshHandle() error {
 	if ae.handle != nil {
 		if errRelease := ae.handle.Release(); errRelease != nil {
@@ -168,7 +253,7 @@ func (ae *AlpmExecutor) RefreshHandle() error {
 		return errConf
 	}
 
-	alpmHandle.SetQuestionCallback(ae.questionCallback)
+	alpmHandle.SetQuestionCallback(ae.questionCallback())
 	alpmHandle.SetLogCallback(logCallback)
 	ae.handle = alpmHandle
 	ae.syncDB, err = alpmHandle.SyncDBs()
@@ -203,7 +288,7 @@ func (ae *AlpmExecutor) IsCorrectVersionInstalled(pkgName, versionRequired strin
 	return alpmPackage.Version() == versionRequired
 }
 
-func (ae *AlpmExecutor) SyncSatisfier(pkgName string) RepoPackage {
+func (ae *AlpmExecutor) SyncSatisfier(pkgName string) db.RepoPackage {
 	foundPkg, err := ae.syncDB.FindSatisfier(pkgName)
 	if err != nil {
 		return nil
@@ -211,8 +296,8 @@ func (ae *AlpmExecutor) SyncSatisfier(pkgName string) RepoPackage {
 	return foundPkg
 }
 
-func (ae *AlpmExecutor) PackagesFromGroup(groupName string) []RepoPackage {
-	groupPackages := []RepoPackage{}
+func (ae *AlpmExecutor) PackagesFromGroup(groupName string) []db.RepoPackage {
+	groupPackages := []db.RepoPackage{}
 	_ = ae.syncDB.FindGroupPkgs(groupName).ForEach(func(pkg alpm.Package) error {
 		groupPackages = append(groupPackages, &pkg)
 		return nil
@@ -220,27 +305,27 @@ func (ae *AlpmExecutor) PackagesFromGroup(groupName string) []RepoPackage {
 	return groupPackages
 }
 
-func (ae *AlpmExecutor) LocalPackages() []RepoPackage {
-	localPackages := []RepoPackage{}
+func (ae *AlpmExecutor) LocalPackages() []db.RepoPackage {
+	localPackages := []db.RepoPackage{}
 	_ = ae.localDB.PkgCache().ForEach(func(pkg alpm.Package) error {
-		localPackages = append(localPackages, RepoPackage(&pkg))
+		localPackages = append(localPackages, db.RepoPackage(&pkg))
 		return nil
 	})
 	return localPackages
 }
 
 // SyncPackages searches SyncDB for packages or returns all packages if no search param is given
-func (ae *AlpmExecutor) SyncPackages(pkgNames ...string) []RepoPackage {
-	repoPackages := []RepoPackage{}
-	_ = ae.syncDB.ForEach(func(db alpm.DB) error {
+func (ae *AlpmExecutor) SyncPackages(pkgNames ...string) []db.RepoPackage {
+	repoPackages := []db.RepoPackage{}
+	_ = ae.syncDB.ForEach(func(alpmDB alpm.DB) error {
 		if len(pkgNames) == 0 {
-			_ = db.PkgCache().ForEach(func(pkg alpm.Package) error {
-				repoPackages = append(repoPackages, RepoPackage(&pkg))
+			_ = alpmDB.PkgCache().ForEach(func(pkg alpm.Package) error {
+				repoPackages = append(repoPackages, db.RepoPackage(&pkg))
 				return nil
 			})
 		} else {
-			_ = db.Search(pkgNames).ForEach(func(pkg alpm.Package) error {
-				repoPackages = append(repoPackages, RepoPackage(&pkg))
+			_ = alpmDB.Search(pkgNames).ForEach(func(pkg alpm.Package) error {
+				repoPackages = append(repoPackages, db.RepoPackage(&pkg))
 				return nil
 			})
 		}
@@ -249,7 +334,7 @@ func (ae *AlpmExecutor) SyncPackages(pkgNames ...string) []RepoPackage {
 	return repoPackages
 }
 
-func (ae *AlpmExecutor) LocalPackage(pkgName string) RepoPackage {
+func (ae *AlpmExecutor) LocalPackage(pkgName string) db.RepoPackage {
 	pkg := ae.localDB.Pkg(pkgName)
 	if pkg == nil {
 		return nil
@@ -257,7 +342,7 @@ func (ae *AlpmExecutor) LocalPackage(pkgName string) RepoPackage {
 	return pkg
 }
 
-func (ae *AlpmExecutor) PackageFromDB(pkgName, dbName string) RepoPackage {
+func (ae *AlpmExecutor) PackageFromDB(pkgName, dbName string) db.RepoPackage {
 	singleDB, err := ae.handle.SyncDBByName(dbName)
 	if err != nil {
 		return nil
@@ -269,27 +354,27 @@ func (ae *AlpmExecutor) PackageFromDB(pkgName, dbName string) RepoPackage {
 	return foundPkg
 }
 
-func (ae *AlpmExecutor) PackageDepends(pkg RepoPackage) []alpm.Depend {
+func (ae *AlpmExecutor) PackageDepends(pkg db.RepoPackage) []alpm.Depend {
 	alpmPackage := pkg.(*alpm.Package)
 	return alpmPackage.Depends().Slice()
 }
 
-func (ae *AlpmExecutor) PackageOptionalDepends(pkg RepoPackage) []alpm.Depend {
+func (ae *AlpmExecutor) PackageOptionalDepends(pkg db.RepoPackage) []alpm.Depend {
 	alpmPackage := pkg.(*alpm.Package)
 	return alpmPackage.OptionalDepends().Slice()
 }
 
-func (ae *AlpmExecutor) PackageProvides(pkg RepoPackage) []alpm.Depend {
+func (ae *AlpmExecutor) PackageProvides(pkg db.RepoPackage) []alpm.Depend {
 	alpmPackage := pkg.(*alpm.Package)
 	return alpmPackage.Provides().Slice()
 }
 
-func (ae *AlpmExecutor) PackageConflicts(pkg RepoPackage) []alpm.Depend {
+func (ae *AlpmExecutor) PackageConflicts(pkg db.RepoPackage) []alpm.Depend {
 	alpmPackage := pkg.(*alpm.Package)
 	return alpmPackage.Conflicts().Slice()
 }
 
-func (ae *AlpmExecutor) PackageGroups(pkg RepoPackage) []string {
+func (ae *AlpmExecutor) PackageGroups(pkg db.RepoPackage) []string {
 	alpmPackage := pkg.(*alpm.Package)
 	return alpmPackage.Groups().Slice()
 }
@@ -340,10 +425,10 @@ func (ae *AlpmExecutor) AlpmArch() (string, error) {
 	return ae.handle.Arch()
 }
 
-func (ae *AlpmExecutor) BiggestPackages() []RepoPackage {
-	localPackages := []RepoPackage{}
+func (ae *AlpmExecutor) BiggestPackages() []db.RepoPackage {
+	localPackages := []db.RepoPackage{}
 	_ = ae.localDB.PkgCache().SortBySize().ForEach(func(pkg alpm.Package) error {
-		localPackages = append(localPackages, RepoPackage(&pkg))
+		localPackages = append(localPackages, db.RepoPackage(&pkg))
 		return nil
 	})
 	return localPackages

+ 2 - 3
pkg/db/alpm_test.go

@@ -1,9 +1,8 @@
-package db
+package ialpm
 
 import (
 	"testing"
 
-	alpm "github.com/Jguer/go-alpm"
 	"github.com/Morganamilo/go-pacmanconf"
 	"github.com/stretchr/testify/assert"
 )
@@ -37,7 +36,7 @@ func TestAlpmExecutor(t *testing.T) {
 			{Name: "repo1", Servers: []string{"repo1"}, SigLevel: []string(nil), Usage: []string{"All"}},
 			{Name: "repo2", Servers: []string{"repo2"}, SigLevel: []string(nil), Usage: []string{"All"}}}}
 
-	aExec, err := NewExecutor(pacmanConf, func(question alpm.QuestionAny) {})
+	aExec, err := NewExecutor(pacmanConf)
 	assert.NoError(t, err)
 
 	assert.NotNil(t, aExec.conf)

+ 2 - 2
pkg/dep/dep.go

@@ -121,12 +121,12 @@ func satisfiesAur(dep string, pkg *rpc.Pkg) bool {
 	return false
 }
 
-func satisfiesRepo(dep string, pkg db.RepoPackage, ae *db.AlpmExecutor) bool {
+func satisfiesRepo(dep string, pkg db.RepoPackage, dbExecutor db.Executor) bool {
 	if pkgSatisfies(pkg.Name(), pkg.Version(), dep) {
 		return true
 	}
 
-	for _, provided := range ae.PackageProvides(pkg) {
+	for _, provided := range dbExecutor.PackageProvides(pkg) {
 		if provideSatisfies(provided.String(), dep) {
 			return true
 		}

+ 3 - 3
pkg/dep/depPool.go

@@ -57,11 +57,11 @@ type Pool struct {
 	Aur          map[string]*rpc.Pkg
 	AurCache     map[string]*rpc.Pkg
 	Groups       []string
-	AlpmExecutor *db.AlpmExecutor
+	AlpmExecutor db.Executor
 	Warnings     *query.AURWarnings
 }
 
-func makePool(dbExecutor *db.AlpmExecutor) *Pool {
+func makePool(dbExecutor db.Executor) *Pool {
 	dp := &Pool{
 		make([]Target, 0),
 		make(stringset.StringSet),
@@ -347,7 +347,7 @@ func (dp *Pool) ResolveRepoDependency(pkg db.RepoPackage) {
 
 func GetPool(pkgs []string,
 	warnings *query.AURWarnings,
-	dbExecutor *db.AlpmExecutor,
+	dbExecutor db.Executor,
 	mode settings.TargetMode,
 	ignoreProviders, noConfirm, provides bool,
 	rebuild string, splitN int) (*Pool, error) {

+ 2 - 2
pkg/query/filter.go

@@ -9,7 +9,7 @@ import (
 )
 
 // GetPackageNamesBySource returns package names with and without correspondence in SyncDBS respectively
-func GetPackageNamesBySource(dbExecutor *db.AlpmExecutor) (local, remote []string, err error) {
+func GetPackageNamesBySource(dbExecutor db.Executor) (local, remote []string, err error) {
 outer:
 	for _, localpkg := range dbExecutor.LocalPackages() {
 		for _, syncpkg := range dbExecutor.SyncPackages() {
@@ -24,7 +24,7 @@ outer:
 }
 
 // GetRemotePackages returns packages with no correspondence in SyncDBS.
-func GetRemotePackages(dbExecutor *db.AlpmExecutor) (
+func GetRemotePackages(dbExecutor db.Executor) (
 	remote []db.RepoPackage,
 	remoteNames []string) {
 outer:

+ 1 - 3
pkg/settings/runtime.go

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

+ 6 - 6
print.go

@@ -17,7 +17,7 @@ import (
 )
 
 // PrintSearch handles printing search results in a given format
-func (q aurQuery) printSearch(start int, dbExecutor *db.AlpmExecutor) {
+func (q aurQuery) printSearch(start int, dbExecutor db.Executor) {
 	for i := range q {
 		var toprint string
 		if config.SearchMode == numberMenu {
@@ -60,7 +60,7 @@ func (q aurQuery) printSearch(start int, dbExecutor *db.AlpmExecutor) {
 }
 
 // PrintSearch receives a RepoSearch type and outputs pretty text.
-func (s repoQuery) printSearch(dbExecutor *db.AlpmExecutor) {
+func (s repoQuery) printSearch(dbExecutor db.Executor) {
 	for i, res := range s {
 		var toprint string
 		if config.SearchMode == numberMenu {
@@ -142,7 +142,7 @@ func PrintInfo(a *rpc.Pkg, extendedInfo bool) {
 }
 
 // BiggestPackages prints the name of the ten biggest packages in the system.
-func biggestPackages(dbExecutor *db.AlpmExecutor) {
+func biggestPackages(dbExecutor db.Executor) {
 	pkgS := dbExecutor.BiggestPackages()
 
 	if len(pkgS) < 10 {
@@ -156,7 +156,7 @@ func biggestPackages(dbExecutor *db.AlpmExecutor) {
 }
 
 // localStatistics prints installed packages statistics.
-func localStatistics(dbExecutor *db.AlpmExecutor) error {
+func localStatistics(dbExecutor db.Executor) error {
 	info := statistics(dbExecutor)
 
 	_, remoteNames, err := query.GetPackageNamesBySource(config.Runtime.DBExecutor)
@@ -181,7 +181,7 @@ func localStatistics(dbExecutor *db.AlpmExecutor) error {
 }
 
 // TODO: Make it less hacky
-func printNumberOfUpdates(dbExecutor *db.AlpmExecutor, enableDowngrade bool) error {
+func printNumberOfUpdates(dbExecutor db.Executor, enableDowngrade bool) error {
 	warnings := query.NewWarnings()
 	old := os.Stdout // keep backup of the real stdout
 	os.Stdout = nil
@@ -196,7 +196,7 @@ func printNumberOfUpdates(dbExecutor *db.AlpmExecutor, enableDowngrade bool) err
 }
 
 // TODO: Make it less hacky
-func printUpdateList(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor, enableDowngrade bool) error {
+func printUpdateList(cmdArgs *settings.Arguments, dbExecutor db.Executor, enableDowngrade bool) error {
 	targets := stringset.FromSlice(cmdArgs.Targets)
 	warnings := query.NewWarnings()
 	old := os.Stdout // keep backup of the real stdout

+ 6 - 6
query.go

@@ -147,7 +147,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, dbExecutor *db.AlpmExecutor) (err error) {
+func syncSearch(pkgS []string, dbExecutor db.Executor) (err error) {
 	pkgS = query.RemoveInvalidTargets(pkgS, config.Runtime.Mode)
 	var aurErr error
 	var aq aurQuery
@@ -188,7 +188,7 @@ func syncSearch(pkgS []string, dbExecutor *db.AlpmExecutor) (err error) {
 }
 
 // SyncInfo serves as a pacman -Si for repo packages and AUR packages.
-func syncInfo(cmdArgs *settings.Arguments, pkgS []string, dbExecutor *db.AlpmExecutor) error {
+func syncInfo(cmdArgs *settings.Arguments, pkgS []string, dbExecutor db.Executor) error {
 	var info []*rpc.Pkg
 	var err error
 	missing := false
@@ -240,7 +240,7 @@ func syncInfo(cmdArgs *settings.Arguments, pkgS []string, dbExecutor *db.AlpmExe
 }
 
 // Search handles repo searches. Creates a RepoSearch struct.
-func queryRepo(pkgInputN []string, dbExecutor *db.AlpmExecutor) repoQuery {
+func queryRepo(pkgInputN []string, dbExecutor db.Executor) repoQuery {
 	s := repoQuery(dbExecutor.SyncPackages(pkgInputN...))
 
 	if config.SortMode == settings.BottomUp {
@@ -250,7 +250,7 @@ func queryRepo(pkgInputN []string, dbExecutor *db.AlpmExecutor) repoQuery {
 }
 
 // PackageSlices separates an input slice into aur and repo slices
-func packageSlices(toCheck []string, dbExecutor *db.AlpmExecutor) (aur, repo []string) {
+func packageSlices(toCheck []string, dbExecutor db.Executor) (aur, repo []string) {
 	for _, _pkg := range toCheck {
 		dbName, name := text.SplitDBFromName(_pkg)
 		found := false
@@ -282,7 +282,7 @@ func packageSlices(toCheck []string, dbExecutor *db.AlpmExecutor) (aur, repo []s
 // 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, dbExecutor *db.AlpmExecutor) (hanging []string) {
+func hangingPackages(removeOptional bool, dbExecutor db.Executor) (hanging []string) {
 	// safePackages represents every package in the system in one of 3 states
 	// State = 0 - Remove package from the system
 	// State = 1 - Keep package in the system; need to iterate over dependencies
@@ -356,7 +356,7 @@ func hangingPackages(removeOptional bool, dbExecutor *db.AlpmExecutor) (hanging
 }
 
 // Statistics returns statistics about packages installed in system
-func statistics(dbExecutor *db.AlpmExecutor) *struct {
+func statistics(dbExecutor db.Executor) *struct {
 	Totaln    int
 	Expln     int
 	TotalSize int64

+ 7 - 4
upgrade.go

@@ -23,7 +23,7 @@ import (
 )
 
 // upList returns lists of packages to upgrade from each source.
-func upList(warnings *query.AURWarnings, dbExecutor *db.AlpmExecutor, enableDowngrade bool) (aurUp, repoUp upgrade.UpSlice, err error) {
+func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade bool) (aurUp, repoUp upgrade.UpSlice, err error) {
 	remote, remoteNames := query.GetRemotePackages(dbExecutor)
 
 	var wg sync.WaitGroup
@@ -139,10 +139,12 @@ func upDevel(remote []db.RepoPackage, aurdata map[string]*rpc.Pkg) upgrade.UpSli
 			printIgnoringPackage(pkg, "latest-commit")
 		} else {
 			toUpgrade = append(toUpgrade,
-				upgrade.Upgrade{Name: pkg.Name(),
+				upgrade.Upgrade{
+					Name:          pkg.Name(),
 					Repository:    "devel",
 					LocalVersion:  pkg.Version(),
-					RemoteVersion: "latest-commit"})
+					RemoteVersion: "latest-commit",
+				})
 		}
 	}
 
@@ -180,7 +182,8 @@ func upAUR(remote []db.RepoPackage, aurdata map[string]*rpc.Pkg) upgrade.UpSlice
 						Name:          aurPkg.Name,
 						Repository:    "aur",
 						LocalVersion:  pkg.Version(),
-						RemoteVersion: aurPkg.Version})
+						RemoteVersion: aurPkg.Version,
+					})
 			}
 		}
 	}

+ 1 - 1
vcs.go

@@ -31,7 +31,7 @@ type (
 )
 
 // createDevelDB forces yay to create a DB of the existing development packages
-func createDevelDB(vcsFilePath string, dbExecutor *db.AlpmExecutor) error {
+func createDevelDB(vcsFilePath string, dbExecutor db.Executor) error {
 	var mux sync.Mutex
 	var wg sync.WaitGroup