Просмотр исходного кода

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
Родитель
Сommit
141ebf72bd
1 измененных файлов с 15 добавлено и 2 удалено
  1. 15 2
      go/stars/stars.go

+ 15 - 2
go/stars/stars.go

36
	sem := make(chan bool, config.concurrency)
36
	sem := make(chan bool, config.concurrency)
37
	var wg sync.WaitGroup
37
	var wg sync.WaitGroup
38
38
39
	errors := make(chan error, config.concurrency)
39
	wg.Add(len(stars))
40
	wg.Add(len(stars))
40
	for _, info := range stars {
41
	for _, info := range stars {
41
		info := info
42
		info := info
45
			fmt.Printf("% 48s - %s\n", info.RepoName, info.Description)
46
			fmt.Printf("% 48s - %s\n", info.RepoName, info.Description)
46
			err := updateRepo(info)
47
			err := updateRepo(info)
47
			if err != nil {
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
			wg.Done()
52
			wg.Done()
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
	wg.Wait()
65
	wg.Wait()
66
	close(errors)
67
68
	if hadErrors {
69
		os.Exit(1)
70
	}
58
}
71
}
59
72
60
func updateRepo(info repoInfo) error {
73
func updateRepo(info repoInfo) error {