소스 검색

Merge pull request #225 from Morganamilo/develspeedup

Use goroutinuies for devel updates
Morgana 7 년 전
부모
커밋
b7eae565fd
3개의 변경된 파일68개의 추가작업 그리고 25개의 파일을 삭제
  1. 1 4
      query.go
  2. 40 18
      upgrade.go
  3. 27 3
      vcs.go

+ 1 - 4
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 {

+ 40 - 18
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
 }
 

+ 27 - 3
vcs.go

@@ -142,14 +142,38 @@ func getCommit(url string, branch string, protocols []string) string {
 }
 
 func (infos shaInfos) needsUpdate() bool {
-	for url, info := range infos {
+	//used to signal we have gone through all sources and found nothing
+	finished := make(chan struct{})
+	alive := 0
+	
+	//if we find an update we use this to exit early and return true
+	hasUpdate := make(chan struct{})
+
+	checkHash := func(url string, info shaInfo) {
 		hash := getCommit(url, info.Brach, info.Protocols)
 		if hash != "" && hash != info.SHA {
-			return true
+			hasUpdate <- struct{}{}
+		} else {
+			finished <- struct{}{}
 		}
 	}
 
-	return false
+	for url, info := range infos {
+		alive++
+		go checkHash(url, info)
+	}
+
+	for {
+		select {
+		case <- hasUpdate:
+			return true
+		case <- finished:
+			alive--
+			if alive == 0 {
+				return false
+			}
+		}
+	}
 }
 
 func inStore(pkgName string) shaInfos {