in dev/codeowners/codeowners.go [99:137]
func readGithubOwners(codeownersPath string) (*githubOwners, error) {
f, err := os.Open(codeownersPath)
if err != nil {
return nil, fmt.Errorf("failed to open %q: %w", codeownersPath, err)
}
defer f.Close()
codeowners := githubOwners{
owners: make(map[string][]string),
path: codeownersPath,
}
scanner := bufio.NewScanner(f)
lineNumber := 0
for scanner.Scan() {
lineNumber++
line := strings.TrimSpace(scanner.Text())
if len(line) == 0 || strings.HasPrefix(line, "#") {
continue
}
fields := strings.Fields(line)
if len(fields) == 1 {
err := codeowners.checkSingleField(fields[0])
if err != nil {
return nil, fmt.Errorf("invalid line %d in %q: %w", lineNumber, codeownersPath, err)
}
continue
}
path, owners := fields[0], fields[1:]
// It is ok to overwrite because latter lines have precedence in these files.
codeowners.owners[path] = owners
}
if err := scanner.Err(); err != nil {
return nil, fmt.Errorf("scanner error: %w", err)
}
return &codeowners, nil
}