diff --git a/hack/goget/main.go b/hack/goget/main.go
index 962731a..7b3864b 100644
--- a/hack/goget/main.go
+++ b/hack/goget/main.go
@@ -7,6 +7,7 @@ import (
"os"
"sort"
"strings"
+ "sync"
"forgejo.edf-bootstrap.cx.fg1.ffm.osc.live/richardrobertreitz/docudile/lib"
)
@@ -41,7 +42,184 @@ type index struct {
group string
}
-var arg = ""
+func main() {
+ if len(os.Args) != 2 {
+ log.Fatal("args: # output directory for generated files")
+ }
+
+ outputDir := os.Args[1]
+ if !strings.HasSuffix(outputDir, "/") {
+ outputDir += "/"
+ }
+
+ create(false, "", outputDir)
+ //create(true, "pod", outputDir)
+ //create(true, "bashes.provisioning.shell.crossplane.io", outputDir)
+ //return
+
+ out, err := lib.ExecNotFatal(`#!/bin/bash
+ kubectl api-resources --verbs=list -o name | sort
+ `, []string{})
+
+ if err != nil {
+ log.Fatal("error: ", err)
+ }
+
+ scans := []string{}
+ scanner := bufio.NewScanner(strings.NewReader(out))
+ for scanner.Scan() {
+ scans = append(scans, scanner.Text())
+ }
+
+ if err := scanner.Err(); err != nil {
+ log.Fatal("error: ", err)
+ }
+
+ var wg sync.WaitGroup
+ wg.Add(len(scans))
+
+ for _, page := range scans {
+ go func(page string) {
+ defer wg.Done()
+ if !strings.HasPrefix(page, "events.") && !strings.HasPrefix(page, "customresourcedefinitions.a") {
+ create(true, page, outputDir)
+ fmt.Println("scaned " + page)
+ } else {
+ fmt.Println("skipped " + page)
+ }
+ }(page)
+ }
+ wg.Wait()
+}
+
+func create(pages bool, page string, dir string) {
+ specs := make(map[string]spec)
+ arg := ""
+
+ if !pages {
+ out, err := lib.ExecNotFatal(`#!/bin/bash
+ kubectl api-resources --verbs=list -o name | sort
+ `, []string{})
+
+ if err != nil {
+ log.Fatal("error: ", err)
+ }
+
+ scanner := bufio.NewScanner(strings.NewReader(out))
+ for scanner.Scan() {
+ spec := getSpec(0, scanner.Text())
+ if len(spec.uuid) > 0 {
+ specs[spec.uuid] = spec
+ }
+ }
+
+ if err := scanner.Err(); err != nil {
+ log.Fatal("error: ", err)
+ }
+ } else {
+ arg = page
+ spec := getSpec(1, page)
+ specs[spec.uuid] = spec
+ }
+
+ tree := []spec{}
+
+ for _, spec := range specs {
+ tree = append(tree, spec)
+ }
+
+ sort.SliceStable(tree, func(i, j int) bool {
+ if tree[i].group == tree[j].group {
+ return tree[i].kind < tree[j].kind
+ } else {
+ groupA := strings.Fields(strings.Replace(tree[i].group, ".", " ", -1))
+ revGroupA := strings.Join(reverse(groupA), ".")
+ groupB := strings.Fields(strings.Replace(tree[j].group, ".", " ", -1))
+ revGroupB := strings.Join(reverse(groupB), ".")
+ return revGroupA < revGroupB
+ }
+ })
+
+ if !pages {
+ fmt.Println("create index")
+ out := createFile(dir + "index.html")
+ outOne := createFile(dir + "onepage.html")
+ writeFile(out, "multi page one page")
+ writeFile(outOne, "multi page one page")
+ writeFile(out, "Groups
")
+ writeFile(outOne, "Groups
")
+ last := ""
+ for _, object := range tree {
+ if len(object.group) == 0 {
+ if last != "default" {
+ last = "default"
+ writeFile(out, last+"- ")
+ writeFile(outOne, last+"
- ")
+ }
+ writeFile(out, ""+object.kind+"
")
+ writeFile(outOne, ""+object.kind+"
")
+ } else {
+ group := strings.Fields(strings.Replace(object.group, ".", " ", -1))
+ revGroup := strings.Join(reverse(group), ".")
+ if last != revGroup {
+ last = revGroup
+ writeFile(out, "
"+revGroup+"- ")
+ writeFile(outOne, "
"+revGroup+"- ")
+ }
+ writeFile(out, ""+object.kind+"
")
+ writeFile(outOne, ""+object.kind+"
")
+ }
+ }
+ writeFile(out, "
")
+ writeFile(outOne, "
")
+
+ objects := []index{}
+
+ for name, spec := range specs {
+ objects = append(objects, index{spec.kind, spec.version, name, spec.uuid, spec.group})
+ }
+
+ sort.SliceStable(objects, func(i, j int) bool {
+ groupA := strings.Fields(strings.Replace(objects[i].group, ".", " ", -1))
+ revGroupA := strings.Join(reverse(groupA), ".")
+ groupB := strings.Fields(strings.Replace(objects[j].group, ".", " ", -1))
+ revGroupB := strings.Join(reverse(groupB), ".")
+ if objects[i].name == objects[j].name && revGroupA == revGroupB {
+ return objects[i].version < objects[j].version
+ } else if objects[i].name == objects[j].name {
+ return revGroupA < revGroupB
+ } else {
+ return objects[i].name < objects[j].name
+ }
+ })
+
+ writeFile(out, "Index
")
+ writeFile(outOne, "Index
")
+ for _, object := range objects {
+ if len(object.group) == 0 {
+ writeFile(out, ""+object.name+" default
")
+ writeFile(outOne, ""+object.name+" default
")
+ } else {
+ group := strings.Fields(strings.Replace(object.group, ".", " ", -1))
+ revGroup := strings.Join(reverse(group), ".")
+ writeFile(out, ""+object.name+" "+revGroup+"
")
+ writeFile(outOne, ""+object.name+" "+revGroup+"
")
+ }
+ }
+ writeFile(out, "
")
+ writeFile(outOne, "")
+ closeFile(out)
+ closeFile(outOne)
+ } else {
+ for _, spec := range tree {
+ printSpec(spec, true, arg, dir)
+ }
+
+ for _, spec := range tree {
+ recurseSpecs(spec, arg, dir)
+ }
+ }
+}
func getSpec(level int, specName string) spec {
spec := spec{}
@@ -52,7 +230,7 @@ func getSpec(level int, specName string) spec {
if err != nil {
if specName == "events.events.k8s.io" {
- fmt.Println("warning: skipped " + specName + " intentionally, seems substituted by events")
+ fmt.Println("debug: skipped " + specName + " intentionally, seems duplicate of events")
return spec
} else {
log.Fatal("warning, cant lookup "+specName+": ", err)
@@ -203,143 +381,64 @@ func getSpec(level int, specName string) spec {
return spec
}
-func main() {
- specs := make(map[string]spec)
-
- if len(os.Args) == 1 {
- out, err := lib.ExecNotFatal(`#!/bin/bash
- kubectl api-resources --verbs=list -o name | sort
- `, []string{})
-
- if err != nil {
- log.Fatal("error: ", err)
- }
-
- scanner := bufio.NewScanner(strings.NewReader(out))
- for scanner.Scan() {
- spec := getSpec(0, scanner.Text())
- if len(spec.uuid) > 0 {
- specs[spec.uuid] = spec
- }
- }
-
- if err := scanner.Err(); err != nil {
- log.Fatal("error: ", err)
- }
- } else {
- arg = os.Args[1]
- spec := getSpec(1, os.Args[1])
- specs[spec.uuid] = spec
- }
-
- tree := []spec{}
-
- for _, spec := range specs {
- tree = append(tree, spec)
- }
-
- sort.SliceStable(tree, func(i, j int) bool {
- if tree[i].group == tree[j].group {
- return tree[i].kind < tree[j].kind
- } else {
- groupA := strings.Fields(strings.Replace(tree[i].group, ".", " ", -1))
- revGroupA := strings.Join(reverse(groupA), ".")
- groupB := strings.Fields(strings.Replace(tree[j].group, ".", " ", -1))
- revGroupB := strings.Join(reverse(groupB), ".")
- return revGroupA < revGroupB
- }
- })
-
- if len(os.Args) == 1 {
- fmt.Println("")
- fmt.Println("tree:")
- for _, object := range tree {
- if len(object.group) == 0 {
- fmt.Println("default, " + object.kind + ", " + object.uuid)
- } else {
- group := strings.Fields(strings.Replace(object.group, ".", " ", -1))
- revGroup := strings.Join(reverse(group), ".")
- fmt.Println(revGroup + ", " + object.kind + ", " + object.uuid)
- }
- }
-
- objects := []index{}
-
- for name, spec := range specs {
- objects = append(objects, index{spec.kind, spec.version, name, spec.uuid, spec.group})
- }
-
- sort.SliceStable(objects, func(i, j int) bool {
- groupA := strings.Fields(strings.Replace(objects[i].group, ".", " ", -1))
- revGroupA := strings.Join(reverse(groupA), ".")
- groupB := strings.Fields(strings.Replace(objects[j].group, ".", " ", -1))
- revGroupB := strings.Join(reverse(groupB), ".")
- //fmt.Println(objects[i].key)
- if objects[i].name == objects[j].name && revGroupA == revGroupB {
- return objects[i].version < objects[j].version
- } else if objects[i].name == objects[j].name {
- return revGroupA < revGroupB
- } else {
- return objects[i].name < objects[j].name
- }
- })
-
- fmt.Println("")
- fmt.Println("index:")
- for _, object := range objects {
- if len(object.group) == 0 {
- fmt.Println(object.name + ", default, " + object.uuid)
- } else {
- group := strings.Fields(strings.Replace(object.group, ".", " ", -1))
- revGroup := strings.Join(reverse(group), ".")
- fmt.Println(object.name + ", " + revGroup + ", " + object.uuid)
- }
- }
- }
-
- if len(os.Args) > 1 {
- for _, spec := range tree {
- printSpec(spec, true)
- }
-
- for _, spec := range tree {
- recurseSpecs(spec)
- }
- }
-}
-
-func recurseSpecs(spec spec) {
- printSpec(spec, false)
+func recurseSpecs(spec spec, arg string, dir string) {
+ printSpec(spec, false, arg, dir)
for _, subSpec := range spec.specs {
if len(subSpec.specs) > 0 {
- recurseSpecs(subSpec)
+ recurseSpecs(subSpec, arg, dir)
}
}
}
-func printSpec(spec spec, recurse bool) {
- fmt.Println(spec.uuid)
- fmt.Println("### uuid = " + spec.uuid)
- if len(spec.group) == 0 {
- fmt.Println("group = 'default'")
+func printSpec(spec spec, recurse bool, arg string, dir string) {
+ var out *os.File
+ if recurse {
+ out = createFile(dir + "onepage_" + spec.uuid + ".html")
+ writeFile(out, "index
")
} else {
- fmt.Println("group = '" + spec.group + "'")
+ out = createFile(dir + "index_" + spec.uuid + ".html")
+ link := spec.uuid[len(arg):]
+ if len(link) > 0 {
+ link = link[1:]
+ }
+ if len(link) > 0 {
+ if strings.LastIndex(link, ".") >= 0 {
+ link = "." + link[:strings.LastIndex(link, ".")]
+ } else {
+ link = ""
+ }
+ }
+ if len(arg) != len(spec.uuid) {
+ writeFile(out, "index "+strings.ToLower(spec.kind)+link+"
")
+ } else {
+ writeFile(out, "index
")
+ }
}
- fmt.Println("kind = '" + spec.kind + "'")
- fmt.Println("version = '" + spec.version + "'")
- fmt.Println("field[" + fmt.Sprint(len(spec.field)) + "]:")
+ writeFile(out, "")
+ writeFile(out, "### uuid = "+spec.uuid)
+ if len(spec.group) == 0 {
+ writeFile(out, "group = 'default'")
+ } else {
+ writeFile(out, "group = '"+spec.group+"'")
+ }
+ writeFile(out, "kind = '"+spec.kind+"'")
+ writeFile(out, "version = '"+spec.version+"'")
+ writeFile(out, "field["+fmt.Sprint(len(spec.field))+"]:")
for i := 0; i < len(spec.field); i++ {
- fmt.Println(" " + spec.field[i])
+ writeFile(out, " "+spec.field[i])
}
- fmt.Println("description[" + fmt.Sprint(len(spec.description)) + "]:")
+ writeFile(out, "description["+fmt.Sprint(len(spec.description))+"]:")
for i := 0; i < len(spec.description); i++ {
- fmt.Println(" " + spec.description[i])
+ writeFile(out, " "+spec.description[i])
}
- fmt.Println("fields[" + fmt.Sprint(len(spec.fields)) + "]:")
- printFields(1, spec.fields, len(spec.uuid), strings.ToLower(spec.kind), recurse)
+ writeFile(out, "fields["+fmt.Sprint(len(spec.fields))+"]:")
+ printFields(1, spec.fields, len(spec.uuid), strings.ToLower(spec.kind), recurse, arg, out)
+
+ writeFile(out, "
")
+ closeFile(out)
}
-func printFields(level int, fields []field, baseUuidLength int, baseName string, recurse bool) {
+func printFields(level int, fields []field, baseUuidLength int, baseName string, recurse bool, arg string, out *os.File) {
fill := ""
for i := 0; i < level; i++ {
fill += " "
@@ -347,23 +446,25 @@ func printFields(level int, fields []field, baseUuidLength int, baseName string,
for i := range fields {
linked := ""
if len(fields[i].fields) > 0 {
- linked = ", link"
+ if !recurse {
+ linked = ", link"
+ }
}
- fmt.Println(fill + " " + fields[i].name + ", " + fields[i].kind + ", " + fmt.Sprint(fields[i].required) + ", enums[" + fields[i].enums + "]" + linked)
+ writeFile(out, fill+" "+fields[i].name+", "+fields[i].kind+", "+fmt.Sprint(fields[i].required)+", enums["+fields[i].enums+"]"+linked)
if len(fields[i].uuid) > baseUuidLength && len(fields[i].uuid[baseUuidLength+1:]) > 0 {
- fmt.Println(fill + " " + baseName + "." + fields[i].uuid[baseUuidLength+1:])
+ writeFile(out, fill+" "+baseName+"."+fields[i].uuid[baseUuidLength+1:])
} else if len(fields[i].uuid) == baseUuidLength {
if recurse {
- fmt.Println(fill + " " + baseName)
+ writeFile(out, fill+" "+baseName)
} else {
- fmt.Println(fill + " " + baseName + fields[i].uuid[len(arg):])
+ writeFile(out, fill+" "+baseName+fields[i].uuid[len(arg):])
}
}
for j := range fields[i].description {
- fmt.Println(fill + " " + fields[i].description[j])
+ writeFile(out, fill+" "+fields[i].description[j])
}
if recurse {
- printFields(level+1, fields[i].fields, baseUuidLength, baseName, recurse)
+ printFields(level+1, fields[i].fields, baseUuidLength, baseName, recurse, arg, out)
}
}
}
@@ -379,3 +480,25 @@ func reverse(s []string) []string {
return a
}
+
+func check(e error) {
+ if e != nil {
+ panic(e)
+ }
+}
+
+func closeFile(file *os.File) {
+ file.Close()
+}
+
+func createFile(fileName string) *os.File {
+ f, err := os.Create(fileName)
+ check(err)
+ //fmt.Println("created file " + fileName)
+ return f
+}
+
+func writeFile(file *os.File, data string) {
+ _, err := file.WriteString(data + "\n")
+ check(err)
+}