Parallelize pkgbuild download

This commit is contained in:
morganamilo 2018-08-02 16:49:30 +01:00
parent 8c2adaddb3
commit ff5ed12181
No known key found for this signature in database
GPG key ID: 6FE9E7996B0B082E

View file

@ -7,6 +7,7 @@ import (
"path/filepath"
"strconv"
"strings"
"sync"
gosrc "github.com/Morganamilo/go-srcinfo"
alpm "github.com/jguer/go-alpm"
@ -770,7 +771,7 @@ func pkgBuildsToSkip(pkgs []*rpc.Pkg, targets stringSet) stringSet {
pkgbuild, err := gosrc.ParseFile(dir)
if err == nil {
if alpm.VerCmp(pkgbuild.Version(), pkg.Version) > 0 {
if alpm.VerCmp(pkgbuild.Version(), pkg.Version) >= 0 {
toSkip.set(pkg.PackageBase)
}
}
@ -795,35 +796,57 @@ func mergePkgBuilds(pkgs []*rpc.Pkg) error {
func downloadPkgBuilds(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg, toSkip stringSet) (stringSet, error) {
cloned := make(stringSet)
downloaded := 0
var wg sync.WaitGroup
var mux sync.Mutex
var errs MultiError
download := func(k int, pkg *rpc.Pkg) {
defer wg.Done()
for k, pkg := range pkgs {
if toSkip.get(pkg.PackageBase) {
mux.Lock()
downloaded++
str := bold(cyan("::") + " PKGBUILD up to date, Skipping (%d/%d): %s\n")
fmt.Printf(str, k+1, len(pkgs), cyan(formatPkgbase(pkg, bases)))
continue
fmt.Printf(str, downloaded, len(pkgs), cyan(formatPkgbase(pkg, bases)))
mux.Unlock()
return
}
str := bold(cyan("::") + " Downloading PKGBUILD (%d/%d): %s\n")
fmt.Printf(str, k+1, len(pkgs), cyan(formatPkgbase(pkg, bases)))
if shouldUseGit(filepath.Join(config.BuildDir, pkg.PackageBase)) {
clone, err := gitDownload(baseURL+"/"+pkg.PackageBase+".git", config.BuildDir, pkg.PackageBase)
if err != nil {
return nil, err
errs.Add(err)
return
}
if clone {
mux.Lock()
cloned.set(pkg.PackageBase)
mux.Unlock()
}
} else {
err := downloadAndUnpack(baseURL+pkg.URLPath, config.BuildDir)
if err != nil {
return nil, err
errs.Add(err)
return
}
}
mux.Lock()
downloaded++
str := bold(cyan("::") + " Downloaded PKGBUILD (%d/%d): %s\n")
fmt.Printf(str, downloaded, len(pkgs), cyan(formatPkgbase(pkg, bases)))
mux.Unlock()
}
return cloned, nil
for k, pkg := range pkgs {
wg.Add(1)
go download(k, pkg)
}
wg.Wait()
return cloned, errs.Return()
}
func downloadPkgBuildsSources(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg, incompatible stringSet) (err error) {