From 093ba23e9a5c55475e5971c6426f36568ec35469 Mon Sep 17 00:00:00 2001 From: Richard Robert Reitz Date: Sun, 23 Mar 2025 15:47:10 +0100 Subject: [PATCH] Finished --- hack/goget/main.go | 387 +++++++++++++++++++++++++++++---------------- 1 file changed, 255 insertions(+), 132 deletions(-) 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) +}