-
Notifications
You must be signed in to change notification settings - Fork 32
/
tree.go
70 lines (57 loc) · 1.79 KB
/
tree.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package recipes
import (
"github.com/disiqueira/gotree"
"github.com/godarch/darch/pkg/recipes"
"github.com/godarch/darch/pkg/utils"
"github.com/urfave/cli"
)
var treeCommand = cli.Command{
Name: "tree",
Usage: "list all recipes in a tree",
Action: func(clicontext *cli.Context) error {
rs, err := recipes.GetAllRecipes(getRecipesDir(clicontext))
if err != nil {
return err
}
externalImages := make([]string, 0)
for _, r := range rs {
if r.InheritsExternal {
externalImages = append(externalImages, r.Inherits)
}
}
// this will be our root items
externalImages = utils.RemoveDuplicates(externalImages)
var rootNode gotree.GTStructure
for _, externalImage := range externalImages {
var externalImageNode gotree.GTStructure
externalImageNode.Name = externalImage
for _, r := range rs {
if r.InheritsExternal && r.Inherits == externalImage {
var childNode gotree.GTStructure
childNode.Name = r.Name
for _, child := range buildTreeRecursively(r, rs) {
childNode.Items = append(childNode.Items, child)
}
externalImageNode.Items = append(externalImageNode.Items, childNode)
}
}
rootNode.Items = append(rootNode.Items, externalImageNode)
}
gotree.PrintTree(rootNode)
return nil
},
}
func buildTreeRecursively(parentDefinition recipes.Recipe, rs map[string]recipes.Recipe) []gotree.GTStructure {
children := make([]gotree.GTStructure, 0)
for _, childRecipeDefinition := range rs {
if childRecipeDefinition.Inherits == parentDefinition.Name {
var childNode gotree.GTStructure
childNode.Name = childRecipeDefinition.Name
for _, child := range buildTreeRecursively(childRecipeDefinition, rs) {
childNode.Items = append(childNode.Items, child)
}
children = append(children, childNode)
}
}
return children
}