in gosumcheck/main.go [96:146]
func checkGoSum(client *sumdb.Client, name string, data []byte) {
lines := strings.Split(string(data), "\n")
if lines[len(lines)-1] != "" {
log.Printf("error: final line missing newline")
return
}
lines = lines[:len(lines)-1]
errs := make([]string, len(lines))
var wg sync.WaitGroup
for i, line := range lines {
wg.Add(1)
go func(i int, line string) {
defer wg.Done()
f := strings.Fields(line)
if len(f) != 3 {
errs[i] = "invalid number of fields"
return
}
dbLines, err := client.Lookup(f[0], f[1])
if err != nil {
if err == sumdb.ErrGONOSUMDB {
errs[i] = fmt.Sprintf("%s@%s: %v", f[0], f[1], err)
} else {
// Otherwise Lookup properly adds the prefix itself.
errs[i] = err.Error()
}
return
}
hashAlgPrefix := f[0] + " " + f[1] + " " + f[2][:strings.Index(f[2], ":")+1]
for _, dbLine := range dbLines {
if dbLine == line {
return
}
if strings.HasPrefix(dbLine, hashAlgPrefix) {
errs[i] = fmt.Sprintf("%s@%s hash mismatch: have %s, want %s", f[0], f[1], line, dbLine)
return
}
}
errs[i] = fmt.Sprintf("%s@%s hash algorithm mismatch: have %s, want one of:\n\t%s", f[0], f[1], line, strings.Join(dbLines, "\n\t"))
}(i, line)
}
wg.Wait()
for i, err := range errs {
if err != "" {
fmt.Printf("%s:%d: %s\n", name, i+1, err)
}
}
}