diff --git a/cmd.go b/cmd.go index dfb7aeb0..3f334d1a 100644 --- a/cmd.go +++ b/cmd.go @@ -217,8 +217,8 @@ func handlePrint(cmdArgs *settings.Arguments, dbExecutor db.Executor) (err error err = completion.Show(dbExecutor, config.AURURL, config.Runtime.CompletionPath, config.CompletionInterval, false) case cmdArgs.ExistsArg("s", "stats"): err = localStatistics(dbExecutor) - case cmdArgs.existsArg("p", "pkgbuild"): - err = printPkgbuilds(cmdArgs.targets) + case cmdArgs.ExistsArg("p", "pkgbuild"): + err = printPkgbuilds(dbExecutor, cmdArgs.Targets) default: err = nil } diff --git a/print.go b/print.go index f1f9d1ea..2ac27b6c 100644 --- a/print.go +++ b/print.go @@ -9,6 +9,7 @@ import ( rpc "github.com/mikkeloscar/aur" "github.com/Jguer/yay/v10/pkg/db" + "github.com/Jguer/yay/v10/pkg/multierror" "github.com/Jguer/yay/v10/pkg/query" "github.com/Jguer/yay/v10/pkg/settings" "github.com/Jguer/yay/v10/pkg/stringset" @@ -266,3 +267,46 @@ outer: return nil } + +func printPkgbuilds(dbExecutor db.Executor, pkgS []string) error { + var pkgbuilds []string + var localPkgbuilds []string + missing := false + pkgS = query.RemoveInvalidTargets(pkgS, config.Runtime.Mode) + aurS, repoS := packageSlices(pkgS, dbExecutor) + var err error + var errs multierror.MultiError + + if len(aurS) != 0 { + noDB := make([]string, 0, len(aurS)) + for _, pkg := range aurS { + _, name := text.SplitDBFromName(pkg) + noDB = append(noDB, name) + } + localPkgbuilds, err = aurPkgbuilds(noDB) + pkgbuilds = append(pkgbuilds, localPkgbuilds...) + errs.Add(err) + } + + if len(repoS) != 0 { + localPkgbuilds, err = repoPkgbuilds(dbExecutor, repoS) + pkgbuilds = append(pkgbuilds, localPkgbuilds...) + errs.Add(err) + } + + if len(aurS)+len(repoS) != len(pkgbuilds) { + missing = true + } + + if len(pkgbuilds) != 0 { + for _, pkgbuild := range pkgbuilds { + fmt.Print(pkgbuild) + } + } + + if missing { + err = fmt.Errorf("Missing packages") + } + + return err +} diff --git a/query.go b/query.go index 9ba687ff..a93f3d2a 100644 --- a/query.go +++ b/query.go @@ -9,6 +9,7 @@ import ( "os" "sort" "strings" + "sync" alpm "github.com/Jguer/go-alpm/v2" "github.com/leonelquinteros/gotext" @@ -445,34 +446,22 @@ func aurPkgbuilds(names []string) ([]string, error) { return pkgbuilds, nil } -func repoPkgbuilds(names []string) ([]string, error) { +func repoPkgbuilds(dbExecutor db.Executor, names []string) ([]string, error) { pkgbuilds := make([]string, 0, len(names)) var mux sync.Mutex var wg sync.WaitGroup var errs multierror.MultiError - dbList, dbErr := alpmHandle.SyncDBs() - if dbErr != nil { - return nil, dbErr - } - dbSlice := dbList.Slice() - makeRequest := func(full string) { + var pkg alpm.IPackage defer wg.Done() - db, name := splitDBFromName(full) + db, name := text.SplitDBFromName(full) - if db == "" { - var pkg *alpm.Package - for _, alpmDB := range dbSlice { - if pkg = alpmDB.Pkg(name); pkg != nil { - db = alpmDB.Name() - name = pkg.Base() - if name == "" { - name = pkg.Name() - } - } - } + if db != "" { + pkg = dbExecutor.SatisfierFromDB(name, db) + } else { + pkg = dbExecutor.SyncSatisfier(name) } values := url.Values{} @@ -482,7 +471,7 @@ func repoPkgbuilds(names []string) ([]string, error) { // TODO: Check existence with ls-remote // https://git.archlinux.org/svntogit/packages.git - switch db { + switch pkg.DB().Name() { case "core", "extra", "testing": url = "https://git.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?" case "community", "multilib", "community-testing", "multilib-testing":