Update kubectl kustomize to kyaml/v0.13.9, cmd/config/v0.10.9, api/v0.12.1, kustomize/v4.5.7 (#111606)

This commit is contained in:
Natasha Sarkar
2022-08-02 22:13:51 -05:00
committed by GitHub
parent cb41d5002c
commit 83c3c37a87
102 changed files with 45098 additions and 102225 deletions

View File

@@ -41,10 +41,11 @@ The utility will yield Unicode-friendly trees. The output is predictable and the
## Use cases
When you want to render a complex data structure:
### When you want to render a complex data structure:
```go
func main() {
// to add a custom root name use `treeprint.NewWithRoot()` instead
tree := treeprint.New()
// create a new branch in the root
@@ -86,10 +87,11 @@ Will give you:
└── outernode
```
Another case, when you have to make a tree where any leaf may have some meta-data (as `tree` is capable of it):
### Another case, when you have to make a tree where any leaf may have some meta-data (as `tree` is capable of it):
```go
func main {
// to add a custom root name use `treeprint.NewWithRoot()` instead
tree := treeprint.New()
tree.AddNode("Dockerfile")
@@ -122,6 +124,30 @@ Output:
└── [122K] testtool.a
```
### Iterating over the tree nodes
```go
tree := New()
one := tree.AddBranch("one")
one.AddNode("one-subnode1").AddNode("one-subnode2")
one.AddBranch("two").AddNode("two-subnode1").AddNode("two-subnode2").
AddBranch("three").AddNode("three-subnode1").AddNode("three-subnode2")
tree.AddNode("outernode")
// if you need to iterate over the whole tree
// call `VisitAll` from your top root node.
tree.VisitAll(func(item *node) {
if len(item.Nodes) > 0 {
// branch nodes
fmt.Println(item.Value) // will output one, two, three
} else {
// leaf nodes
fmt.Println(item.Value) // will output one-*, two-*, three-* and outernode
}
})
```
Yay! So it works.
## License

View File

@@ -6,11 +6,18 @@ import (
"fmt"
"io"
"reflect"
"strings"
)
// Value defines any value
type Value interface{}
// MetaValue defines any meta value
type MetaValue interface{}
// NodeVisitor function type for iterating over nodes
type NodeVisitor func(item *node)
// Tree represents a tree structure with leaf-nodes and branch-nodes.
type Tree interface {
// AddNode adds a new node to a branch.
@@ -39,6 +46,11 @@ type Tree interface {
SetValue(value Value)
SetMetaValue(meta MetaValue)
// VisitAll iterates over the tree, branches and nodes.
// If need to iterate over the whole tree, use the root node.
// Note this method uses a breadth-first approach.
VisitAll(fn NodeVisitor)
}
type node struct {
@@ -50,8 +62,10 @@ type node struct {
func (n *node) FindLastNode() Tree {
ns := n.Nodes
n = ns[len(ns)-1]
return n
if len(ns) == 0 {
return nil
}
return ns[len(ns)-1]
}
func (n *node) AddNode(v Value) Tree {
@@ -59,9 +73,6 @@ func (n *node) AddNode(v Value) Tree {
Root: n,
Value: v,
})
if n.Root != nil {
return n.Root
}
return n
}
@@ -71,14 +82,12 @@ func (n *node) AddMetaNode(meta MetaValue, v Value) Tree {
Meta: meta,
Value: v,
})
if n.Root != nil {
return n.Root
}
return n
}
func (n *node) AddBranch(v Value) Tree {
branch := &node{
Root: n,
Value: v,
}
n.Nodes = append(n.Nodes, branch)
@@ -87,6 +96,7 @@ func (n *node) AddBranch(v Value) Tree {
func (n *node) AddMetaBranch(meta MetaValue, v Value) Tree {
branch := &node{
Root: n,
Meta: meta,
Value: v,
}
@@ -131,7 +141,7 @@ func (n *node) Bytes() []byte {
if n.Meta != nil {
buf.WriteString(fmt.Sprintf("[%v] %v", n.Meta, n.Value))
} else {
buf.WriteString(fmt.Sprintf("%v",n.Value))
buf.WriteString(fmt.Sprintf("%v", n.Value))
}
buf.WriteByte('\n')
} else {
@@ -140,7 +150,7 @@ func (n *node) Bytes() []byte {
edge = EdgeTypeEnd
levelsEnded = append(levelsEnded, level)
}
printValues(buf, 0, levelsEnded, edge, n.Meta, n.Value)
printValues(buf, 0, levelsEnded, edge, n)
}
if len(n.Nodes) > 0 {
printNodes(buf, level, levelsEnded, n.Nodes)
@@ -152,14 +162,25 @@ func (n *node) String() string {
return string(n.Bytes())
}
func (n *node) SetValue(value Value){
func (n *node) SetValue(value Value) {
n.Value = value
}
func (n *node) SetMetaValue(meta MetaValue){
func (n *node) SetMetaValue(meta MetaValue) {
n.Meta = meta
}
func (n *node) VisitAll(fn NodeVisitor) {
for _, node := range n.Nodes {
fn(node)
if len(node.Nodes) > 0 {
node.VisitAll(fn)
continue
}
}
}
func printNodes(wr io.Writer,
level int, levelsEnded []int, nodes []*node) {
@@ -169,7 +190,7 @@ func printNodes(wr io.Writer,
levelsEnded = append(levelsEnded, level)
edge = EdgeTypeEnd
}
printValues(wr, level, levelsEnded, edge, node.Meta, node.Value)
printValues(wr, level, levelsEnded, edge, node)
if len(node.Nodes) > 0 {
printNodes(wr, level+1, levelsEnded, node.Nodes)
}
@@ -177,15 +198,19 @@ func printNodes(wr io.Writer,
}
func printValues(wr io.Writer,
level int, levelsEnded []int, edge EdgeType, meta MetaValue, val Value) {
level int, levelsEnded []int, edge EdgeType, node *node) {
for i := 0; i < level; i++ {
if isEnded(levelsEnded, i) {
fmt.Fprint(wr, " ")
fmt.Fprint(wr, strings.Repeat(" ", IndentSize+1))
continue
}
fmt.Fprintf(wr, "%s   ", EdgeTypeLink)
fmt.Fprintf(wr, "%s%s", EdgeTypeLink, strings.Repeat(" ", IndentSize))
}
val := renderValue(level, node)
meta := node.Meta
if meta != nil {
fmt.Fprintf(wr, "%s [%v] %v\n", edge, meta, val)
return
@@ -202,14 +227,68 @@ func isEnded(levelsEnded []int, level int) bool {
return false
}
func renderValue(level int, node *node) Value {
lines := strings.Split(fmt.Sprintf("%v", node.Value), "\n")
// If value does not contain multiple lines, return itself.
if len(lines) < 2 {
return node.Value
}
// If value contains multiple lines,
// generate a padding and prefix each line with it.
pad := padding(level, node)
for i := 1; i < len(lines); i++ {
lines[i] = fmt.Sprintf("%s%s", pad, lines[i])
}
return strings.Join(lines, "\n")
}
// padding returns a padding for the multiline values with correctly placed link edges.
// It is generated by traversing the tree upwards (from leaf to the root of the tree)
// and, on each level, checking if the node the last one of its siblings.
// If a node is the last one, the padding on that level should be empty (there's nothing to link to below it).
// If a node is not the last one, the padding on that level should be the link edge so the sibling below is correctly connected.
func padding(level int, node *node) string {
links := make([]string, level+1)
for node.Root != nil {
if isLast(node) {
links[level] = strings.Repeat(" ", IndentSize+1)
} else {
links[level] = fmt.Sprintf("%s%s", EdgeTypeLink, strings.Repeat(" ", IndentSize))
}
level--
node = node.Root
}
return strings.Join(links, "")
}
// isLast checks if the node is the last one in the slice of its parent children
func isLast(n *node) bool {
return n == n.Root.FindLastNode()
}
type EdgeType string
var (
EdgeTypeLink EdgeType = "│"
EdgeTypeMid EdgeType = "├──"
EdgeTypeEnd EdgeType = "└──"
EdgeTypeLink EdgeType = "│"
EdgeTypeMid EdgeType = "├──"
EdgeTypeEnd EdgeType = "└──"
)
// IndentSize is the number of spaces per tree level.
var IndentSize = 3
// New Generates new tree
func New() Tree {
return &node{Value: "."}
}
// NewWithRoot Generates new tree with the given root value
func NewWithRoot(root Value) Tree {
return &node{Value: root}
}