@@ -1071,42 +1071,38 @@ func (c *KpmClient) ParseOciOptionFromString(oci string, tag string) (*opt.OciOp
1071
1071
1072
1072
// PrintDependencyGraph will print the dependency graph of kcl package dependencies
1073
1073
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 )
1078
1075
if err != nil {
1079
1076
return err
1080
1077
}
1081
1078
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 )
1084
1082
if err != nil {
1085
1083
return err
1086
1084
}
1087
1085
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 )
1098
1094
if err != nil {
1099
1095
return err
1100
1096
}
1101
1097
}
1102
1098
1103
- adjMap , err := mainGraph .AdjacencyMap ()
1099
+ adjMap , err := depGraph .AdjacencyMap ()
1104
1100
if err != nil {
1105
1101
return err
1106
1102
}
1107
1103
1108
1104
// 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 {
1110
1106
for target := range adjMap [source ] {
1111
1107
reporter .ReportMsgTo (
1112
1108
fmt .Sprint (source , target ),
@@ -1146,22 +1142,19 @@ func (c *KpmClient) dependencyExists(dep *pkg.Dependency, lockDeps *pkg.Dependen
1146
1142
}
1147
1143
1148
1144
// 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 ) {
1150
1146
newDeps := pkg.Dependencies {
1151
1147
Deps : make (map [string ]pkg.Dependency ),
1152
1148
}
1153
1149
1154
- depGraphs := make ([]graph.Graph [string , string ], len (deps .Deps ))
1155
- i := 0
1150
+ depGraph := graph .New (graph .StringHash , graph .Directed ())
1156
1151
1157
1152
// Traverse all dependencies in kcl.mod
1158
1153
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 ))
1161
1155
if err != nil {
1162
1156
return nil , nil , err
1163
1157
}
1164
- i ++
1165
1158
if len (d .Name ) == 0 {
1166
1159
return nil , nil , errors .InvalidDependency
1167
1160
}
@@ -1205,7 +1198,6 @@ func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencie
1205
1198
lockDeps .Deps [d .Name ] = * lockedDep
1206
1199
}
1207
1200
1208
- i = 0
1209
1201
// Recursively download the dependencies of the new dependencies.
1210
1202
for _ , d := range newDeps .Deps {
1211
1203
// Load kcl.mod file of the new downloaded dependencies.
@@ -1222,27 +1214,25 @@ func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencie
1222
1214
}
1223
1215
1224
1216
// Download the dependencies.
1225
- nested , nestedDepGraphs , err := c .downloadDeps (deppkg .ModFile .Dependencies , lockDeps )
1217
+ nested , nestedDepGraph , err := c .downloadDeps (deppkg .ModFile .Dependencies , lockDeps )
1226
1218
if err != nil {
1227
1219
return nil , nil , err
1228
1220
}
1229
1221
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 )
1232
1224
if err != nil {
1233
1225
return nil , nil , err
1234
1226
}
1235
1227
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 )
1246
1236
if err != nil {
1247
1237
return nil , nil , err
1248
1238
}
@@ -1254,10 +1244,9 @@ func (c *KpmClient) downloadDeps(deps pkg.Dependencies, lockDeps pkg.Dependencie
1254
1244
newDeps .Deps [d .Name ] = d
1255
1245
}
1256
1246
}
1257
- i ++
1258
1247
}
1259
1248
1260
- return & newDeps , depGraphs , nil
1249
+ return & newDeps , depGraph , nil
1261
1250
}
1262
1251
1263
1252
// pullTarFromOci will pull a kcl package tar file from oci registry.
@@ -1331,22 +1320,21 @@ func check(dep pkg.Dependency, newDepPath string) bool {
1331
1320
return dep .Sum == sum
1332
1321
}
1333
1322
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 ) {
1336
1324
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 " )
1338
1326
}
1339
1327
1340
1328
predecessorMap , err := g .PredecessorMap ()
1341
1329
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 )
1343
1331
}
1344
1332
1333
+ var sources []K
1345
1334
for vertex , predecessors := range predecessorMap {
1346
1335
if len (predecessors ) == 0 {
1347
- src = vertex
1348
- break
1336
+ sources = append (sources , vertex )
1349
1337
}
1350
1338
}
1351
- return src , nil
1339
+ return sources , nil
1352
1340
}
0 commit comments