13 StateUnchecked taskState = "Unchecked"
14 StateChecking = "Checking"
15 StateFixing = "Fixing"
16 StateFailed = "Failed"
22 type taskStateMap struct {
28 var TaskState = taskStateMap{
29 s: make(map[task]taskState),
30 cond: sync.NewCond(&sync.Mutex{}),
33 func (m *taskStateMap) Set(t task, s taskState) {
35 defer m.cond.L.Unlock()
36 if old, ok := m.s[t]; ok && old == s {
44 func (m *taskStateMap) Version() version {
46 defer m.cond.L.Unlock()
50 func (m *taskStateMap) Get(t task) taskState {
52 defer m.cond.L.Unlock()
53 if s, ok := m.s[t]; ok {
67 func (m *taskStateMap) Wait(v version, t time.Duration, ctx context.Context) bool {
68 ready := make(chan struct{})
72 defer m.cond.L.Unlock()
73 for v == m.version && !done {
89 func report(tasks []task) ([]repEnt, version) {
90 v := TaskState.Version()
95 for _, t := range tasks {
96 crep, _ := report(t.Children())
97 rep = append(rep, repEnt{
98 ShortName: t.ShortName(),
99 Description: t.String(),
100 State: TaskState.Get(t),
107 func runTasks(cfg *Config, tasks []task) {
108 for _, t := range tasks {
111 for _, t := range tasks {
112 if TaskState.Get(t) == taskState("") {
113 TaskState.Set(t, StateChecking)
117 log.Printf("%s: OK", t)
118 TaskState.Set(t, StateOK)
121 log.Printf("%s: %s", t, err)
123 log.Printf("%s: can't fix")
124 TaskState.Set(t, StateFailed)
127 TaskState.Set(t, StateFixing)
128 if err = t.Fix(); err != nil {
129 log.Printf("%s: can't fix: %s", t, err)
130 TaskState.Set(t, StateFailed)
133 if err = t.Check(); err != nil {
134 log.Printf("%s: fixed, but still broken?!: %s", t, err)
135 TaskState.Set(t, StateFailed)
138 log.Printf("%s: OK", t)
139 TaskState.Set(t, StateOK)
143 type task interface {