Parcourir la Source

Don't fail immediately if errors occur

Errors are sent to a channel, and one goroutine prints them and sets an
error flag.  If an error was seen, we exit with status 1 after all repos
have been fetched.
Lucas Stadler 10 ans auparavant
Parent
commit
141ebf72bd
1 fichiers modifiés avec 15 ajouts et 2 suppressions
  1. 15 2
      go/stars/stars.go

+ 15 - 2
go/stars/stars.go

@ -36,6 +36,7 @@ func main() {
36 36
	sem := make(chan bool, config.concurrency)
37 37
	var wg sync.WaitGroup
38 38
39
	errors := make(chan error, config.concurrency)
39 40
	wg.Add(len(stars))
40 41
	for _, info := range stars {
41 42
		info := info
@ -45,8 +46,7 @@ func main() {
45 46
			fmt.Printf("% 48s - %s\n", info.RepoName, info.Description)
46 47
			err := updateRepo(info)
47 48
			if err != nil {
48
				fmt.Println(err)
49
				os.Exit(1)
49
				errors <- fmt.Errorf("Fetching %s: %s", info.RepoName, err)
50 50
			}
51 51
52 52
			wg.Done()
@ -54,7 +54,20 @@ func main() {
54 54
		}()
55 55
	}
56 56
57
	hadErrors := false
58
	go func() {
59
		for err := range errors {
60
			hadErrors = true
61
			fmt.Fprintln(os.Stderr, "Error:", err)
62
		}
63
	}()
64
57 65
	wg.Wait()
66
	close(errors)
67
68
	if hadErrors {
69
		os.Exit(1)
70
	}
58 71
}
59 72
60 73
func updateRepo(info repoInfo) error {