diff --git a/query.go b/query.go index d5f7c901..2d767bb0 100644 --- a/query.go +++ b/query.go @@ -338,21 +338,18 @@ func aurInfo(names []string) ([]rpc.Pkg, error) { outOfDate := make([]string, 0, len(names)) makeRequest := func(n, max int) { + defer wg.Done() tempInfo, requestErr := rpc.Info(names[n:max]) if err != nil { - wg.Done() return } if requestErr != nil { - //return info, err err = requestErr - wg.Done() return } mux.Lock() info = append(info, tempInfo...) mux.Unlock() - wg.Done() } for n := 0; n < len(names); n += config.RequestSplitN { diff --git a/upgrade.go b/upgrade.go index 2b1f08fd..cf5188f7 100644 --- a/upgrade.go +++ b/upgrade.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "sort" + "sync" "unicode" alpm "github.com/jguer/go-alpm" @@ -128,29 +129,50 @@ loop: } func upDevel(remote []alpm.Package, packageC chan upgrade, done chan bool) { - for vcsName, e := range savedInfo { + toUpdate := make([]alpm.Package, 0, 0) + toRemove := make([]string, 0, 0) + + var mux1 sync.Mutex + var mux2 sync.Mutex + var wg sync.WaitGroup + + checkUpdate := func(vcsName string, e shaInfos) { + defer wg.Done() + if e.needsUpdate() { - found := false - var pkg alpm.Package - for _, r := range remote { - if r.Name() == vcsName { - found = true - pkg = r + for _, pkg := range remote { + if pkg.Name() == vcsName { + mux1.Lock() + toUpdate = append(toUpdate, pkg) + mux1.Unlock() + return } } - if found { - if pkg.ShouldIgnore() { - left, right := getVersionDiff(pkg.Version(), "latest-commit") - fmt.Print(magenta("Warning: ")) - fmt.Printf("%s ignoring package upgrade (%s => %s)\n", cyan(pkg.Name()), left, right) - } else { - packageC <- upgrade{pkg.Name(), "devel", pkg.Version(), "latest-commit"} - } - } else { - removeVCSPackage([]string{vcsName}) - } + + mux2.Lock() + toRemove = append(toRemove, vcsName) + mux2.Unlock() } } + + for vcsName, e := range savedInfo { + wg.Add(1) + go checkUpdate(vcsName, e) + } + + wg.Wait() + + for _, pkg := range toUpdate { + if pkg.ShouldIgnore() { + left, right := getVersionDiff(pkg.Version(), "latest-commit") + fmt.Print(magenta("Warning: ")) + fmt.Printf("%s ignoring package upgrade (%s => %s)\n", cyan(pkg.Name()), left, right) + } else { + packageC <- upgrade{pkg.Name(), "devel", pkg.Version(), "latest-commit"} + } + } + + removeVCSPackage(toRemove) done <- true } diff --git a/vcs.go b/vcs.go index b54963b2..e673de03 100644 --- a/vcs.go +++ b/vcs.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" "strings" + "sync" "time" ) @@ -142,14 +143,25 @@ func getCommit(url string, branch string, protocols []string) string { } func (infos shaInfos) needsUpdate() bool { - for url, info := range infos { + var wg sync.WaitGroup + hasUpdate := false + + checkHash := func(url string, info shaInfo) { + defer wg.Done() hash := getCommit(url, info.Brach, info.Protocols) if hash != "" && hash != info.SHA { - return true + hasUpdate = true } } - return false + for url, info := range infos { + wg.Add(1) + go checkHash(url, info) + } + + wg.Wait() + + return hasUpdate } func inStore(pkgName string) shaInfos {