1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
// tbd, a #tag-based dependency tool for low ceremony task tracking
// tbd, a #tag-based dependency tool for task tracking
package main
import (
"bufio"
"bytes"
"fmt"
"io"
|
︙ | | |
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
-
+
|
extract = regexp.MustCompile("(#)([^\\s]+?)(?:[,\\.\\s]|$)")
}
func main() {
var (
exitCode int
handlers []handler = []handler{counting(), tracing()}
handlers = handlerChain{counting(), tracing()}
)
// Parse command line elements and register handlers
if len(os.Args) == 1 {
handlers = append(handlers, cutoff())
} else {
handlers = append(handlers, matching(os.Args[1:]))
|
︙ | | |
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
-
+
-
+
|
exitCode = 1
}
os.Exit(exitCode)
}
// Processes input through the provided handlers
func process(input io.Reader, handlers []handler) int {
func process(input io.Reader, handlers handlerChain) int {
reader := bufio.NewReader(input)
for {
line, err := reader.ReadString('\n')
line = strings.TrimSpace(line)
if len(line) > 0 {
handle(handlers, &task{tags: parse(line), value: line})
handlers.do(&task{tags: parse(line), value: line, depends: make(tasks, 0, 8)})
}
// Process errors after handling as ReadString can return both data and error f
if err != nil {
if err == io.EOF {
return 0
}
|
︙ | | |
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
+
+
+
-
-
-
+
+
+
|
// Stop further processing of the task
stop bool
}
// An alias interface for all task handler functions
type handler func(*task) action
// A slice of handlers
type handlerChain []handler
// Execute handlers against a task
func handle(handlers []handler, t *task) {
for _, h := range handlers {
act := h(t)
func (handlers handlerChain) do(t *task) {
for _, current := range handlers {
act := current(t)
if act.stop {
return
}
}
}
// Returns a counting handler closure that sets the tasks' nth field
|
︙ | | |
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
|
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
-
+
+
|
return action{}
}
}
return action{stop: true}
}
}
// Returns a handler that stores every seen task and an ancillary function to retrieve those
// Returns a handler that stores every seen task and its dependencies
// along with an ancillary function to retrieve those in a sorted order
func collecting() (handler, func() tasks) {
var seen = make(map[*task]bool)
return func(t *task) action {
depth := tasks{t}
for i := 0; i < len(depth); i++ {
if !seen[depth[i]] {
seen[depth[i]] = true
|
︙ | | |