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

barerepo / runner / cmd/barerepo-runner/remember.go
78 lines · 1.8kb · 96966ee7d73df970dc5b1b4cbbca677f2973e17c
log files threads runs releases config jump to file t
96966ee barerepo 1mo
1
package main
96966ee barerepo 1mo
2
96966ee barerepo 1mo
3
import (
96966ee barerepo 1mo
4
"bufio"
96966ee barerepo 1mo
5
"crypto/sha256"
96966ee barerepo 1mo
6
"encoding/hex"
96966ee barerepo 1mo
7
"os"
96966ee barerepo 1mo
8
"path/filepath"
96966ee barerepo 1mo
9
"strings"
96966ee barerepo 1mo
10
)
96966ee barerepo 1mo
11
96966ee barerepo 1mo
12
// serversFile is where a runner remembers what it attached to, so appendix E's line needs no flag.
96966ee barerepo 1mo
13
func serversFile() (string, error) {
96966ee barerepo 1mo
14
dir, err := os.UserConfigDir()
96966ee barerepo 1mo
15
if err != nil {
96966ee barerepo 1mo
16
return "", err
96966ee barerepo 1mo
17
}
96966ee barerepo 1mo
18
return filepath.Join(dir, "forge", "servers"), nil
96966ee barerepo 1mo
19
}
96966ee barerepo 1mo
20
96966ee barerepo 1mo
21
// tokenKey is a hash, because the file names which server a token belongs to and never the token.
96966ee barerepo 1mo
22
func tokenKey(tok string) string {
96966ee barerepo 1mo
23
sum := sha256.Sum256([]byte(tok))
96966ee barerepo 1mo
24
return hex.EncodeToString(sum[:8])
96966ee barerepo 1mo
25
}
96966ee barerepo 1mo
26
96966ee barerepo 1mo
27
// rememberServer records where a token attached, after it worked, so a bad url is never kept.
96966ee barerepo 1mo
28
func rememberServer(tok, server string) {
96966ee barerepo 1mo
29
path, err := serversFile()
96966ee barerepo 1mo
30
if err != nil {
96966ee barerepo 1mo
31
return
96966ee barerepo 1mo
32
}
96966ee barerepo 1mo
33
key := tokenKey(tok)
96966ee barerepo 1mo
34
lines := readServers(path)
96966ee barerepo 1mo
35
out := make([]string, 0, len(lines)+1)
96966ee barerepo 1mo
36
for _, line := range lines {
96966ee barerepo 1mo
37
if k, _, ok := strings.Cut(line, " "); !ok || k != key {
96966ee barerepo 1mo
38
out = append(out, line)
96966ee barerepo 1mo
39
}
96966ee barerepo 1mo
40
}
96966ee barerepo 1mo
41
out = append(out, key+" "+server)
96966ee barerepo 1mo
42
if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil {
96966ee barerepo 1mo
43
return
96966ee barerepo 1mo
44
}
96966ee barerepo 1mo
45
// A failure here costs the next run a flag, which is not worth failing a build over.
96966ee barerepo 1mo
46
os.WriteFile(path, []byte(strings.Join(out, "\n")+"\n"), 0o600)
96966ee barerepo 1mo
47
}
96966ee barerepo 1mo
48
96966ee barerepo 1mo
49
// recallServer answers where this token attached last time, or nothing.
96966ee barerepo 1mo
50
func recallServer(tok string) string {
96966ee barerepo 1mo
51
path, err := serversFile()
96966ee barerepo 1mo
52
if err != nil {
96966ee barerepo 1mo
53
return ""
96966ee barerepo 1mo
54
}
96966ee barerepo 1mo
55
key := tokenKey(tok)
96966ee barerepo 1mo
56
for _, line := range readServers(path) {
96966ee barerepo 1mo
57
if k, server, ok := strings.Cut(line, " "); ok && k == key {
96966ee barerepo 1mo
58
return server
96966ee barerepo 1mo
59
}
96966ee barerepo 1mo
60
}
96966ee barerepo 1mo
61
return ""
96966ee barerepo 1mo
62
}
96966ee barerepo 1mo
63
96966ee barerepo 1mo
64
func readServers(path string) []string {
96966ee barerepo 1mo
65
f, err := os.Open(path)
96966ee barerepo 1mo
66
if err != nil {
96966ee barerepo 1mo
67
return nil
96966ee barerepo 1mo
68
}
96966ee barerepo 1mo
69
defer f.Close()
96966ee barerepo 1mo
70
var out []string
96966ee barerepo 1mo
71
sc := bufio.NewScanner(f)
96966ee barerepo 1mo
72
for sc.Scan() {
96966ee barerepo 1mo
73
if line := strings.TrimSpace(sc.Text()); line != "" {
96966ee barerepo 1mo
74
out = append(out, line)
96966ee barerepo 1mo
75
}
96966ee barerepo 1mo
76
}
96966ee barerepo 1mo
77
return out
96966ee barerepo 1mo
78
}
history · rawbarerepo 0.1.0