Skip to content

Commit 533b4ab

Browse files
feat: remove array of graphs
Signed-off-by: Akash Kumar <meakash7902@gmail.com>
1 parent 43ed11e commit 533b4ab

File tree

2 files changed

+36
-47
lines changed

2 files changed

+36
-47
lines changed

pkg/client/client.go

Lines changed: 35 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,42 +1071,38 @@ func (c *KpmClient) ParseOciOptionFromString(oci string, tag string) (*opt.OciOp
10711071

10721072
// PrintDependencyGraph will print the dependency graph of kcl package dependencies
10731073
func (c *KpmClient) PrintDependencyGraph(kclPkg *pkg.KclPkg) error {
1074-
// create the main graph with a single root vertex.
1075-
root := fmt.Sprint(kclPkg.GetPkgName())
1076-
mainGraph := graph.New(graph.StringHash, graph.Directed())
1077-
err := mainGraph.AddVertex(root)
1074+
_, depGraph, err := c.downloadDeps(kclPkg.Dependencies, kclPkg.ModFile.Dependencies)
10781075
if err != nil {
10791076
return err
10801077
}
10811078

1082-
// get the dependency graphs and merge them into the main graph at root vertex.
1083-
_, depGraphs, err := c.downloadDeps(kclPkg.Dependencies, kclPkg.ModFile.Dependencies)
1079+
// add the root vertex(package name) to the dependency graph.
1080+
root := fmt.Sprint(kclPkg.GetPkgName())
1081+
err = depGraph.AddVertex(root)
10841082
if err != nil {
10851083
return err
10861084
}
10871085

1088-
for _, g := range depGraphs {
1089-
mainGraph, err = graph.Union(mainGraph, g)
1090-
if err != nil {
1091-
return err
1092-
}
1093-
src, err := FindSource(g)
1094-
if err != nil {
1095-
return err
1096-
}
1097-
err = mainGraph.AddEdge(root, src)
1086+
sources, err := FindSource(depGraph)
1087+
if err != nil {
1088+
return err
1089+
}
1090+
1091+
// make an edge between the root vertex and all the sources of the dependency graph.
1092+
for _, source := range sources {
1093+
err = depGraph.AddEdge(source, root)
10981094
if err != nil {
10991095
return err
11001096
}
11011097
}
11021098

1103-
adjMap, err := mainGraph.AdjacencyMap()
1099+
adjMap, err := depGraph.AdjacencyMap()
11041100
if err != nil {
11051101
return err
11061102
}
11071103

11081104
// print the dependency graph to stdout.
1109-
err = graph.BFS(mainGraph, root, func(source string) bool {
1105+
err = graph.BFS(depGraph, root, func(source string) bool {
11101106
for target := range adjMap[source] {
11111107
reporter.ReportMsgTo(
11121108
fmt.Sprint(source, target),
@@ -1146,22 +1142,19 @@ func (c *KpmClient) dependencyExists(dep *pkg.Dependency, lockDeps *pkg.Dependen
11461142
}
11471143

11481144
// downloadDeps will download all the dependencies of the current kcl package.
1149-
func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencies) (*pkg.Dependencies, []graph.Graph[string, string], error) {
1145+
func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencies) (*pkg.Dependencies, graph.Graph[string, string], error) {
11501146
newDeps := pkg.Dependencies{
11511147
Deps: make(map[string]pkg.Dependency),
11521148
}
11531149

1154-
depGraphs := make([]graph.Graph[string, string], len(deps.Deps))
1155-
i := 0
1150+
depGraph := graph.New(graph.StringHash, graph.Directed())
11561151

11571152
// Traverse all dependencies in kcl.mod
11581153
for _, d := range deps.Deps {
1159-
depGraphs[i] = graph.New(graph.StringHash, graph.Directed())
1160-
err := depGraphs[i].AddVertex(fmt.Sprintf("%s@%s", d.Name, d.Version))
1154+
err := depGraph.AddVertex(fmt.Sprintf("%s@%s", d.Name, d.Version))
11611155
if err != nil {
11621156
return nil, nil, err
11631157
}
1164-
i++
11651158
if len(d.Name) == 0 {
11661159
return nil, nil, errors.InvalidDependency
11671160
}
@@ -1205,7 +1198,6 @@ func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencie
12051198
lockDeps.Deps[d.Name] = *lockedDep
12061199
}
12071200

1208-
i = 0
12091201
// Recursively download the dependencies of the new dependencies.
12101202
for _, d := range newDeps.Deps {
12111203
// Load kcl.mod file of the new downloaded dependencies.
@@ -1222,27 +1214,25 @@ func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencie
12221214
}
12231215

12241216
// Download the dependencies.
1225-
nested, nestedDepGraphs, err := c.downloadDeps(deppkg.ModFile.Dependencies, lockDeps)
1217+
nested, nestedDepGraph, err := c.downloadDeps(deppkg.ModFile.Dependencies, lockDeps)
12261218
if err != nil {
12271219
return nil, nil, err
12281220
}
12291221

1230-
// merge the depGraph with the nestedDepGraphs.
1231-
src, err := FindSource(depGraphs[i])
1222+
source := fmt.Sprintf("%s@%s", d.Name, d.Version)
1223+
sourcesOfNestedDepGraph, err := FindSource(nestedDepGraph)
12321224
if err != nil {
12331225
return nil, nil, err
12341226
}
12351227

1236-
for _, g := range nestedDepGraphs {
1237-
depGraphs[i], err = graph.Union(g, depGraphs[i])
1238-
if err != nil {
1239-
return nil, nil, err
1240-
}
1241-
srcOfNestedg, err := FindSource(g)
1242-
if err != nil {
1243-
return nil, nil, err
1244-
}
1245-
err = depGraphs[i].AddEdge(src, srcOfNestedg)
1228+
depGraph, err = graph.Union(depGraph, nestedDepGraph)
1229+
if err != nil {
1230+
return nil, nil, err
1231+
}
1232+
1233+
// make an edge between the source of all nested dep graph and main dep graph
1234+
for _, sourceOfNestedDepGraph := range sourcesOfNestedDepGraph {
1235+
err = depGraph.AddEdge(source, sourceOfNestedDepGraph)
12461236
if err != nil {
12471237
return nil, nil, err
12481238
}
@@ -1254,10 +1244,9 @@ func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencie
12541244
newDeps.Deps[d.Name] = d
12551245
}
12561246
}
1257-
i++
12581247
}
12591248

1260-
return &newDeps, depGraphs, nil
1249+
return &newDeps, depGraph, nil
12611250
}
12621251

12631252
// pullTarFromOci will pull a kcl package tar file from oci registry.
@@ -1331,22 +1320,21 @@ func check(dep pkg.Dependency, newDepPath string) bool {
13311320
return dep.Sum == sum
13321321
}
13331322

1334-
func FindSource[K comparable, T any](g graph.Graph[K, T]) (K, error) {
1335-
var src K
1323+
func FindSource[K comparable, T any](g graph.Graph[K, T]) ([]K, error) {
13361324
if !g.Traits().IsDirected {
1337-
return src, fmt.Errorf("cannot find source of a non-DAG graph ")
1325+
return nil, fmt.Errorf("cannot find source of a non-DAG graph ")
13381326
}
13391327

13401328
predecessorMap, err := g.PredecessorMap()
13411329
if err != nil {
1342-
return src, fmt.Errorf("failed to get predecessor map: %w", err)
1330+
return nil, fmt.Errorf("failed to get predecessor map: %w", err)
13431331
}
13441332

1333+
var sources []K
13451334
for vertex, predecessors := range predecessorMap {
13461335
if len(predecessors) == 0 {
1347-
src = vertex
1348-
break
1336+
sources = append(sources, vertex)
13491337
}
13501338
}
1351-
return src, nil
1339+
return sources, nil
13521340
}

test/e2e/test_suites/kpm/exec_outside_pkg/help_msg/test_suite.stdout

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
COMMANDS:
22
init initialize new module in current directory
3+
graph prints the module dependency graph
34
add add new dependency
45
pkg package a kcl package into tar
56
metadata output the resolved dependencies of a package

0 commit comments

Comments
 (0)