diff --git a/cmd.go b/cmd.go index d32df7b..e0de38b 100644 --- a/cmd.go +++ b/cmd.go @@ -168,7 +168,7 @@ func handleCmd(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle, dbExecutor case "U", "upgrade": return show(passToPacman(cmdArgs)) case "G", "getpkgbuild": - return handleGetpkgbuild(cmdArgs, alpmHandle) + return handleGetpkgbuild(cmdArgs, dbExecutor) case "P", "show": return handlePrint(cmdArgs, alpmHandle, dbExecutor) case "Y", "--yay": @@ -260,8 +260,8 @@ func handleYay(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { return nil } -func handleGetpkgbuild(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle) error { - return getPkgbuilds(cmdArgs.Targets, alpmHandle, cmdArgs.ExistsArg("f", "force")) +func handleGetpkgbuild(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { + return getPkgbuilds(cmdArgs.Targets, dbExecutor, cmdArgs.ExistsArg("f", "force")) } func handleYogurt(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { @@ -278,7 +278,7 @@ func handleSync(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle, dbExecutor } else { config.SearchMode = detailed } - return syncSearch(targets) + return syncSearch(targets, dbExecutor) } if cmdArgs.ExistsArg("p", "print", "print-format") { return show(passToPacman(cmdArgs)) @@ -293,13 +293,13 @@ func handleSync(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle, dbExecutor return show(passToPacman(cmdArgs)) } if cmdArgs.ExistsArg("i", "info") { - return syncInfo(cmdArgs, targets, alpmHandle) + return syncInfo(cmdArgs, targets, dbExecutor) } if cmdArgs.ExistsArg("u", "sysupgrade") { - return install(cmdArgs, config.Runtime.DBExecutor, false) + return install(cmdArgs, dbExecutor, false) } if len(cmdArgs.Targets) > 0 { - return install(cmdArgs, config.Runtime.DBExecutor, false) + return install(cmdArgs, dbExecutor, false) } if cmdArgs.ExistsArg("y", "refresh") { return show(passToPacman(cmdArgs)) diff --git a/download.go b/download.go index 49e696b..95b6581 100644 --- a/download.go +++ b/download.go @@ -8,10 +8,10 @@ import ( "strings" "sync" - alpm "github.com/Jguer/go-alpm" "github.com/leonelquinteros/gotext" "github.com/pkg/errors" + "github.com/Jguer/yay/v10/pkg/db" "github.com/Jguer/yay/v10/pkg/dep" "github.com/Jguer/yay/v10/pkg/multierror" "github.com/Jguer/yay/v10/pkg/query" @@ -140,7 +140,7 @@ func gitMerge(path, name string) error { return nil } -func getPkgbuilds(pkgs []string, alpmHandle *alpm.Handle, force bool) error { +func getPkgbuilds(pkgs []string, dbExecutor *db.AlpmExecutor, force bool) error { missing := false wd, err := os.Getwd() if err != nil { @@ -148,10 +148,7 @@ func getPkgbuilds(pkgs []string, alpmHandle *alpm.Handle, force bool) error { } pkgs = query.RemoveInvalidTargets(pkgs, config.Runtime.Mode) - aur, repo, err := packageSlices(pkgs, alpmHandle) - if err != nil { - return err - } + aur, repo := packageSlices(pkgs, dbExecutor) for n := range aur { _, pkg := text.SplitDBFromName(aur[n]) @@ -164,7 +161,7 @@ func getPkgbuilds(pkgs []string, alpmHandle *alpm.Handle, force bool) error { } if len(repo) > 0 { - missing, err = getPkgbuildsfromABS(repo, wd, alpmHandle, force) + missing, err = getPkgbuildsfromABS(repo, wd, dbExecutor, force) if err != nil { return err } @@ -212,7 +209,7 @@ func getPkgbuilds(pkgs []string, alpmHandle *alpm.Handle, force bool) error { } // GetPkgbuild downloads pkgbuild from the ABS. -func getPkgbuildsfromABS(pkgs []string, path string, alpmHandle *alpm.Handle, force bool) (bool, error) { +func getPkgbuildsfromABS(pkgs []string, path string, dbExecutor *db.AlpmExecutor, force bool) (bool, error) { var wg sync.WaitGroup var mux sync.Mutex var errs multierror.MultiError @@ -220,28 +217,16 @@ func getPkgbuildsfromABS(pkgs []string, path string, alpmHandle *alpm.Handle, fo missing := make([]string, 0) downloaded := 0 - dbList, err := alpmHandle.SyncDBs() - if err != nil { - return false, err - } - for _, pkgN := range pkgs { - var pkg *alpm.Package + var pkg db.RepoPackage var err error var url string pkgDB, name := text.SplitDBFromName(pkgN) if pkgDB != "" { - if db, errSync := alpmHandle.SyncDBByName(pkgDB); errSync == nil { - pkg = db.Pkg(name) - } + pkg = dbExecutor.PackageFromDB(name, pkgDB) } else { - _ = dbList.ForEach(func(db alpm.DB) error { - if pkg = db.Pkg(name); pkg != nil { - return fmt.Errorf("") - } - return nil - }) + pkg = dbExecutor.SyncSatisfier(name) } if pkg == nil { diff --git a/pkg/db/alpm.go b/pkg/db/alpm.go index 58709bc..4db69b7 100644 --- a/pkg/db/alpm.go +++ b/pkg/db/alpm.go @@ -240,7 +240,11 @@ func (ae *AlpmExecutor) SyncPackages(pkgNames ...string) []RepoPackage { } func (ae *AlpmExecutor) LocalPackage(pkgName string) RepoPackage { - return ae.localDB.Pkg(pkgName) + pkg := ae.localDB.Pkg(pkgName) + if pkg == nil { + return nil + } + return pkg } func (ae *AlpmExecutor) PackageFromDB(pkgName, dbName string) RepoPackage { diff --git a/query.go b/query.go index cca732d..082a072 100644 --- a/query.go +++ b/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) (err error) { +func syncSearch(pkgS []string, dbExecutor *db.AlpmExecutor) (err error) { pkgS = query.RemoveInvalidTargets(pkgS, config.Runtime.Mode) var aurErr error var aq aurQuery @@ -157,23 +157,23 @@ func syncSearch(pkgS []string) (err error) { aq, aurErr = narrowSearch(pkgS, true) } if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny { - pq = queryRepo(pkgS, config.Runtime.DBExecutor) + pq = queryRepo(pkgS, dbExecutor) } switch config.SortMode { case settings.TopDown: if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny { - pq.printSearch(config.Runtime.DBExecutor) + pq.printSearch(dbExecutor) } if config.Runtime.Mode == settings.ModeAUR || config.Runtime.Mode == settings.ModeAny { - aq.printSearch(1, config.Runtime.DBExecutor) + aq.printSearch(1, dbExecutor) } case settings.BottomUp: if config.Runtime.Mode == settings.ModeAUR || config.Runtime.Mode == settings.ModeAny { - aq.printSearch(1, config.Runtime.DBExecutor) + aq.printSearch(1, dbExecutor) } if config.Runtime.Mode == settings.ModeRepo || config.Runtime.Mode == settings.ModeAny { - pq.printSearch(config.Runtime.DBExecutor) + pq.printSearch(dbExecutor) } default: return errors.New(gotext.Get("invalid sort mode. Fix with yay -Y --bottomup --save")) @@ -188,14 +188,12 @@ func syncSearch(pkgS []string) (err error) { } // SyncInfo serves as a pacman -Si for repo packages and AUR packages. -func syncInfo(cmdArgs *settings.Arguments, pkgS []string, alpmHandle *alpm.Handle) error { +func syncInfo(cmdArgs *settings.Arguments, pkgS []string, dbExecutor *db.AlpmExecutor) error { var info []*rpc.Pkg + var err error missing := false pkgS = query.RemoveInvalidTargets(pkgS, config.Runtime.Mode) - aurS, repoS, err := packageSlices(pkgS, alpmHandle) - if err != nil { - return err - } + aurS, repoS := packageSlices(pkgS, dbExecutor) if len(aurS) != 0 { noDB := make([]string, 0, len(aurS)) @@ -252,12 +250,7 @@ func queryRepo(pkgInputN []string, dbExecutor *db.AlpmExecutor) repoQuery { } // PackageSlices separates an input slice into aur and repo slices -func packageSlices(toCheck []string, alpmHandle *alpm.Handle) (aur, repo []string, err error) { - dbList, err := alpmHandle.SyncDBs() - if err != nil { - return nil, nil, err - } - +func packageSlices(toCheck []string, dbExecutor *db.AlpmExecutor) (aur, repo []string) { for _, _pkg := range toCheck { dbName, name := text.SplitDBFromName(_pkg) found := false @@ -270,16 +263,10 @@ func packageSlices(toCheck []string, alpmHandle *alpm.Handle) (aur, repo []strin continue } - _ = dbList.ForEach(func(db alpm.DB) error { - if db.Pkg(name) != nil { - found = true - return fmt.Errorf("") - } - return nil - }) + found = dbExecutor.SyncSatisfierExists(name) if !found { - found = !dbList.FindGroupPkgs(name).Empty() + found = len(dbExecutor.PackagesFromGroup(name)) != 0 } if found { @@ -289,7 +276,7 @@ func packageSlices(toCheck []string, alpmHandle *alpm.Handle) (aur, repo []strin } } - return aur, repo, nil + return aur, repo } // HangingPackages returns a list of packages installed as deps