File view with blame information shown in the left gutter beside each line.

barerepo / server / internal/workflow/load.go
93 lines · 2.3kb · master
log files threads runs releases config jump to file t
133728e barerepo 1mo
1
package workflow
133728e barerepo 1mo
2
133728e barerepo 1mo
3
import (
133728e barerepo 1mo
4
"context"
133728e barerepo 1mo
5
"sort"
133728e barerepo 1mo
6
"strings"
133728e barerepo 1mo
7
133728e barerepo 1mo
8
"github.com/barerepo/server/internal/gitx"
133728e barerepo 1mo
9
)
133728e barerepo 1mo
10
133728e barerepo 1mo
11
// Load reads every workflow at a commit, in two processes whatever the file count. Chapter 25.
133728e barerepo 1mo
12
func Load(ctx context.Context, dir, commit string, c Context) ([]Job, error) {
133728e barerepo 1mo
13
if commit == "" {
133728e barerepo 1mo
14
return nil, nil
133728e barerepo 1mo
15
}
133728e barerepo 1mo
16
spec := commit + ":" + Dir
133728e barerepo 1mo
17
tree, err := gitx.Batch(ctx, dir, []string{spec})
133728e barerepo 1mo
18
if err != nil {
133728e barerepo 1mo
19
return nil, err
133728e barerepo 1mo
20
}
133728e barerepo 1mo
21
// No directory is the ordinary case, and it is not an error.
133728e barerepo 1mo
22
dirObj := tree[spec]
133728e barerepo 1mo
23
if dirObj == nil || dirObj.Type != "tree" {
133728e barerepo 1mo
24
return nil, nil
133728e barerepo 1mo
25
}
133728e barerepo 1mo
26
entries := gitx.TreeEntries(dirObj.Body)
133728e barerepo 1mo
27
names := make([]string, 0, len(entries))
133728e barerepo 1mo
28
for name := range entries {
133728e barerepo 1mo
29
if isWorkflowFile(name) {
133728e barerepo 1mo
30
names = append(names, name)
133728e barerepo 1mo
31
}
133728e barerepo 1mo
32
}
133728e barerepo 1mo
33
// Sorted, so two reads of one commit queue the same jobs in the same order.
133728e barerepo 1mo
34
sort.Strings(names)
133728e barerepo 1mo
35
if len(names) == 0 {
133728e barerepo 1mo
36
return nil, nil
133728e barerepo 1mo
37
}
133728e barerepo 1mo
38
specs := make([]string, 0, len(names))
133728e barerepo 1mo
39
for _, name := range names {
133728e barerepo 1mo
40
specs = append(specs, entries[name])
133728e barerepo 1mo
41
}
133728e barerepo 1mo
42
blobs, err := gitx.Batch(ctx, dir, specs)
133728e barerepo 1mo
43
if err != nil {
133728e barerepo 1mo
44
return nil, err
133728e barerepo 1mo
45
}
133728e barerepo 1mo
46
133728e barerepo 1mo
47
var out []Job
133728e barerepo 1mo
48
for _, name := range names {
133728e barerepo 1mo
49
blob := blobs[entries[name]]
133728e barerepo 1mo
50
if blob == nil || blob.Type != "blob" {
133728e barerepo 1mo
51
continue
133728e barerepo 1mo
52
}
133728e barerepo 1mo
53
path := Dir + "/" + name
133728e barerepo 1mo
54
jobs, err := Parse(path, blob.Body, c)
133728e barerepo 1mo
55
if err != nil {
133728e barerepo 1mo
56
// One unreadable file does not hide the others, and the reader is told which.
133728e barerepo 1mo
57
out = append(out, Job{Workflow: name, Path: path, ID: name,
133728e barerepo 1mo
58
Skipped: []Skip{{Step: path, Reason: err.Error()}}})
133728e barerepo 1mo
59
continue
133728e barerepo 1mo
60
}
133728e barerepo 1mo
61
out = append(out, jobs...)
133728e barerepo 1mo
62
}
133728e barerepo 1mo
63
return out, nil
133728e barerepo 1mo
64
}
133728e barerepo 1mo
65
133728e barerepo 1mo
66
// isWorkflowFile takes what GitHub takes, which is yml and yaml at the top of that one directory.
133728e barerepo 1mo
67
func isWorkflowFile(name string) bool {
133728e barerepo 1mo
68
return strings.HasSuffix(name, ".yml") || strings.HasSuffix(name, ".yaml")
133728e barerepo 1mo
69
}
133728e barerepo 1mo
70
133728e barerepo 1mo
71
// Files lists the workflow files at a commit, in one process, for a page that only needs to say so.
133728e barerepo 1mo
72
func Files(ctx context.Context, dir, commit string) []string {
133728e barerepo 1mo
73
if commit == "" {
133728e barerepo 1mo
74
return nil
133728e barerepo 1mo
75
}
133728e barerepo 1mo
76
spec := commit + ":" + Dir
133728e barerepo 1mo
77
tree, err := gitx.Batch(ctx, dir, []string{spec})
133728e barerepo 1mo
78
if err != nil {
133728e barerepo 1mo
79
return nil
133728e barerepo 1mo
80
}
133728e barerepo 1mo
81
obj := tree[spec]
133728e barerepo 1mo
82
if obj == nil || obj.Type != "tree" {
133728e barerepo 1mo
83
return nil
133728e barerepo 1mo
84
}
133728e barerepo 1mo
85
var out []string
133728e barerepo 1mo
86
for name := range gitx.TreeEntries(obj.Body) {
133728e barerepo 1mo
87
if isWorkflowFile(name) {
133728e barerepo 1mo
88
out = append(out, Dir+"/"+name)
133728e barerepo 1mo
89
}
133728e barerepo 1mo
90
}
133728e barerepo 1mo
91
sort.Strings(out)
133728e barerepo 1mo
92
return out
133728e barerepo 1mo
93
}
history · rawbarerepo 0.1.0