aboutsummaryrefslogtreecommitdiff
path: root/owners_generate.go
diff options
context:
space:
mode:
Diffstat (limited to 'owners_generate.go')
-rw-r--r--owners_generate.go92
1 files changed, 43 insertions, 49 deletions
diff --git a/owners_generate.go b/owners_generate.go
index 10160febd..cc6208295 100644
--- a/owners_generate.go
+++ b/owners_generate.go
@@ -5,58 +5,29 @@
package main
import (
+ "bufio"
"fmt"
"io/ioutil"
"log"
"os"
- "path"
- "path/filepath"
"sort"
-
- "gopkg.in/yaml.v2"
+ "strings"
)
func main() {
- o := map[string]struct{}{}
-
// top-level OWNERS file
- o, err := owners("OWNERS", o)
+ o, err := owners("CODEOWNERS")
if err != nil {
log.Fatal(err)
}
- // each of the plugins, in case someone is not in the top-level one
- err = filepath.Walk("plugin",
- func(p string, i os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- if i.IsDir() {
- return nil
- }
- if path.Base(p) != "OWNERS" {
- return nil
- }
- o, err = owners(p, o)
- return err
- })
- if err != nil {
- log.Fatal(err)
- }
-
- // sort it and format it
- list := []string{}
- for k := range o {
- list = append(list, k)
- }
- sort.Strings(list)
golist := `package chaos
// Owners are all GitHub handlers of all maintainers.
var Owners = []string{`
c := ", "
- for i, a := range list {
- if i == len(list)-1 {
+ for i, a := range o {
+ if i == len(o)-1 {
c = "}"
}
golist += fmt.Sprintf("%q%s", a, c)
@@ -70,27 +41,50 @@ var Owners = []string{`
return
}
-// owners parses a owner file without knowing a whole lot about its structure.
-func owners(path string, owners map[string]struct{}) (map[string]struct{}, error) {
- file, err := ioutil.ReadFile(path)
- if err != nil {
- return nil, err
- }
- c := yaml.MapSlice{}
- err = yaml.Unmarshal(file, &c)
+func owners(path string) ([]string, error) {
+ // simple line, by line based format
+ //
+ // # In this example, @doctocat owns any files in the build/logs
+ // # directory at the root of the repository and any of its
+ // # subdirectories.
+ // /build/logs/ @doctocat
+ f, err := os.Open(path)
if err != nil {
return nil, err
}
- for _, mi := range c {
- key, ok := mi.Key.(string)
- if !ok {
+ scanner := bufio.NewScanner(f)
+ users := map[string]struct{}{}
+ for scanner.Scan() {
+ text := scanner.Text()
+ if len(text) == 0 {
+ continue
+ }
+ if text[0] == '#' {
+ continue
+ }
+ ele := strings.Fields(text)
+ if len(ele) == 0 {
continue
}
- if key == "approvers" {
- for _, k := range mi.Value.([]interface{}) {
- owners[k.(string)] = struct{}{}
+
+ // ok ele[0] is the path, the rest are (in our case) github usernames prefixed with @
+ for _, s := range ele[1:] {
+ if len(s) <= 1 {
+ continue
}
+ users[s[1:]] = struct{}{}
+ }
+ }
+ if err := scanner.Err(); err != nil {
+ return nil, err
+ }
+ u := []string{}
+ for k := range users {
+ if strings.HasPrefix(k, "@") {
+ k = k[1:]
}
+ u = append(u, k)
}
- return owners, nil
+ sort.Strings(u)
+ return u, nil
}