From ab902e9cc69617f2164783b262b78f8f862e7405 Mon Sep 17 00:00:00 2001 From: jguer Date: Mon, 2 Aug 2021 21:56:19 +0200 Subject: [PATCH] chore(vcs): port VCS to download package --- .golangci.yml | 3 --- pkg/download/abs.go | 2 +- pkg/download/aur.go | 51 +++++++++++++++++++++++++++++++++++++++++ pkg/download/unified.go | 2 +- vcs.go | 21 +++++++++++++++-- 5 files changed, 72 insertions(+), 7 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index a827d97b..8f26ea57 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -24,8 +24,6 @@ linters-settings: min-complexity: 15 goimports: local-prefixes: github.com/Jguer/yay/v10 - golint: - min-confidence: 0 gomnd: settings: mnd: @@ -84,7 +82,6 @@ linters: #- dogsled # disabled for now #- godox - #- interfacer issues: # Excluding configuration per-path, per-linter, per-text and per-source diff --git a/pkg/download/abs.go b/pkg/download/abs.go index 9de66dca..7015617b 100644 --- a/pkg/download/abs.go +++ b/pkg/download/abs.go @@ -82,7 +82,7 @@ func ABSPKGBUILD(httpClient *http.Client, dbName, pkgName string) ([]byte, error return pkgBuild, nil } -// ABSPKGBUILDRepo retrieves the PKGBUILD repository to a dest directory +// ABSPKGBUILDRepo retrieves the PKGBUILD repository to a dest directory. func ABSPKGBUILDRepo(cmdRunner exe.Runner, cmdBuilder exe.GitCmdBuilder, dbName, pkgName, dest string, force bool) error { pkgURL, err := getPackageRepoURL(dbName) if err != nil { diff --git a/pkg/download/aur.go b/pkg/download/aur.go index 2575aa53..b0a71930 100644 --- a/pkg/download/aur.go +++ b/pkg/download/aur.go @@ -5,8 +5,13 @@ import ( "io/ioutil" "net/http" "net/url" + "sync" + "github.com/leonelquinteros/gotext" + + "github.com/Jguer/yay/v10/pkg/multierror" "github.com/Jguer/yay/v10/pkg/settings/exe" + "github.com/Jguer/yay/v10/pkg/text" ) var AURPackageURL = "https://aur.archlinux.org/cgit/aur.git" @@ -41,3 +46,49 @@ func AURPKGBUILDRepo(cmdRunner exe.Runner, cmdBuilder exe.GitCmdBuilder, aurURL, return downloadGitRepo(cmdRunner, cmdBuilder, pkgURL, pkgName, dest, force) } + +func AURPKGBUILDRepos( + cmdRunner exe.Runner, + cmdBuilder exe.GitCmdBuilder, + targets []string, aurURL, dest string, force bool) (map[string]bool, error) { + cloned := make(map[string]bool, len(targets)) + + var ( + mux sync.Mutex + errs multierror.MultiError + wg sync.WaitGroup + ) + + sem := make(chan uint8, MaxConcurrentFetch) + + for _, target := range targets { + sem <- 1 + + wg.Add(1) + + go func(target string) { + err := AURPKGBUILDRepo(cmdRunner, cmdBuilder, aurURL, target, dest, force) + + success := err == nil + if success { + mux.Lock() + cloned[target] = success + mux.Unlock() + } else { + errs.Add(err) + } + + text.OperationInfoln( + gotext.Get("(%d/%d) Downloaded PKGBUILD: %s", + len(cloned), len(targets), text.Cyan(target))) + + <-sem + + wg.Done() + }(target) + } + + wg.Wait() + + return cloned, errs.Return() +} diff --git a/pkg/download/unified.go b/pkg/download/unified.go index 36aaf3d7..87ccd887 100644 --- a/pkg/download/unified.go +++ b/pkg/download/unified.go @@ -199,7 +199,6 @@ func getPackageUsableName(dbExecutor DBSearcher, target string, mode settings.Ta // if the user precised a db but the package is not in the db // then it is missing // Mode does not allow AUR packages - return dbName, name, aur, true } } else { @@ -216,5 +215,6 @@ func getPackageUsableName(dbExecutor DBSearcher, target string, mode settings.Ta if aur && mode == settings.ModeRepo { return dbName, name, aur, true } + return dbName, name, aur, false } diff --git a/vcs.go b/vcs.go index 00c997e5..50d5f800 100644 --- a/vcs.go +++ b/vcs.go @@ -1,12 +1,14 @@ package main import ( + "strings" "sync" "github.com/leonelquinteros/gotext" "github.com/Jguer/yay/v10/pkg/db" "github.com/Jguer/yay/v10/pkg/dep" + "github.com/Jguer/yay/v10/pkg/download" "github.com/Jguer/yay/v10/pkg/query" "github.com/Jguer/yay/v10/pkg/settings" "github.com/Jguer/yay/v10/pkg/stringset" @@ -30,8 +32,23 @@ func createDevelDB(config *settings.Configuration, dbExecutor db.Executor) error bases := dep.GetBases(info) toSkip := pkgbuildsToSkip(bases, stringset.FromSlice(remoteNames)) - _, err = downloadPkgbuilds(bases, toSkip, config.BuildDir) - if err != nil { + + targets := make([]string, 0, len(bases)) + for _, base := range bases { + if !toSkip.Get(base.Pkgbase()) { + targets = append(targets, base.Pkgbase()) + } + } + + toSkipSlice := toSkip.ToSlice() + if len(toSkipSlice) != 0 { + text.OperationInfoln( + gotext.Get("PKGBUILD up to date, Skipping (%d/%d): %s", + len(toSkipSlice), len(bases), text.Cyan(strings.Join(toSkipSlice, ", ")))) + } + + if _, errA := download.AURPKGBUILDRepos(config.Runtime.CmdRunner, + config.Runtime.CmdBuilder, targets, config.AURURL, config.BuildDir, false); errA != nil { return err }