-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrunner.go
121 lines (100 loc) · 2.01 KB
/
runner.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main
import (
"os"
"sync"
)
type RunOptions struct {
fn Command
targets []string
args []string
parallel bool
once bool
}
func Run(r *RunOptions) error {
if r.once {
return RunOnce(r.fn)
}
if r.parallel {
return RunParallel(r.fn, r.targets, r.args...)
} else {
return RunSingleton(r.fn, r.targets, r.args...)
}
}
func RunOnce(fn Command) error {
c := CommandOptions{
target: "",
args: []string{},
Stdout: os.Stdout,
Stderr: os.Stderr,
}
return fn(c)
}
func RunSingleton(fn Command, repos []string, args ...string) error {
owc := NewOutputWriterCollection()
for _, repo := range repos {
// We should copy the args
// so we don't modify the original
argsCpy := make([]string, len(args))
copy(argsCpy, args)
writer := CreateOutputWriter(repo)
owc.Add(writer)
c := CommandOptions{
target: repo,
args: argsCpy,
Stdout: writer,
Stderr: os.Stderr,
}
fn(c)
/* TODO: Renable error capturing
if err != nil {
switch err := err.(type) {
case *exec.ExitError:
exitCode := err.ExitCode()
writer.exitCode = exitCode
case *exec.Error:
// TODO: Handle execErrors
}
}
*/
}
owc.Flush()
return nil
}
func RunParallel(fn Command, repos []string, args ...string) error {
wg := &sync.WaitGroup{}
owc := NewOutputWriterCollection()
for _, repo := range repos {
// Variables change inside the for range so we need to copy them
repocpy := repo
argsCpy := make([]string, len(args))
copy(argsCpy, args)
wg.Add(1)
go func() {
writer := CreateOutputWriter(repocpy)
owc.Add(writer)
c := CommandOptions{
target: repocpy,
args: argsCpy,
Stdout: writer,
Stderr: os.Stderr,
}
fn(c)
// TODO: Renable error capturing
/*
if err != nil {
switch err := err.(type) {
case *exec.ExitError:
exitCode := err.ExitCode()
writer.exitCode = exitCode
case *exec.Error:
// TODO: Handle execErrors
}
}
*/
wg.Done()
}()
}
wg.Wait()
owc.Flush()
return nil
}