Skip to content

Commit e264afc

Browse files
feat: implement AddDependencies function to build BOM dependency graph
1 parent 3042a2e commit e264afc

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,53 @@
11
package builder
2+
3+
import cdx "github.com/CycloneDX/cyclonedx-go"
4+
5+
// AddDependencies builds a minimal dependency graph for the BOM where the
6+
// model (metadata component) depends on all dataset components. The function
7+
// creates one dependency entry for the model (with a dependsOn list) and a
8+
// dependency entry for each dataset (with no dependsOn entries) — matching
9+
// the example structure used elsewhere in the codebase.
10+
func AddDependencies(bom *cdx.BOM) {
11+
if bom == nil {
12+
return
13+
}
14+
15+
// Determine model BOMRef
16+
var modelRef string
17+
if bom.Metadata != nil && bom.Metadata.Component != nil {
18+
modelRef = bom.Metadata.Component.BOMRef
19+
}
20+
if modelRef == "" {
21+
return
22+
}
23+
24+
// Collect dataset BOMRefs
25+
var datasetRefs []string
26+
if bom.Components != nil {
27+
for _, comp := range *bom.Components {
28+
if comp.Type == cdx.ComponentTypeData && comp.BOMRef != "" {
29+
datasetRefs = append(datasetRefs, comp.BOMRef)
30+
}
31+
}
32+
}
33+
34+
// Build dependencies slice: model entry (with dependsOn) + dataset entries
35+
deps := make([]cdx.Dependency, 0, 1+len(datasetRefs))
36+
37+
// Model dependency (depends on datasets if present)
38+
modelDep := cdx.Dependency{Ref: modelRef}
39+
if len(datasetRefs) > 0 {
40+
// copy to avoid referencing underlying slice later
41+
cp := make([]string, len(datasetRefs))
42+
copy(cp, datasetRefs)
43+
modelDep.Dependencies = &cp
44+
}
45+
deps = append(deps, modelDep)
46+
47+
// Add dataset nodes (no further dependencies)
48+
for _, ds := range datasetRefs {
49+
deps = append(deps, cdx.Dependency{Ref: ds})
50+
}
51+
52+
bom.Dependencies = &deps
53+
}

internal/generator/generator.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
cdx "github.com/CycloneDX/cyclonedx-go"
1515
)
1616

17+
// Version without progress callbacks
18+
1719
type DiscoveredBOM struct {
1820
Discovery scanner.Discovery
1921
BOM *cdx.BOM
@@ -98,6 +100,9 @@ func BuildDummyBOM() ([]DiscoveredBOM, error) {
98100
}
99101
}
100102

103+
// Add dependencies from model to datasets
104+
builder.AddDependencies(bom)
105+
101106
return []DiscoveredBOM{
102107
{
103108
Discovery: dummyDiscovery,
@@ -129,7 +134,6 @@ func BuildPerDiscovery(discoveries []scanner.Discovery, hfToken string, timeout
129134
modelID = strings.TrimSpace(d.Name)
130135
}
131136

132-
133137
var resp *fetcher.ModelAPIResponse
134138
var readme *fetcher.ModelReadmeCard
135139
if modelID != "" {
@@ -202,6 +206,8 @@ func BuildPerDiscovery(discoveries []scanner.Discovery, hfToken string, timeout
202206
*bom.Components = append(*bom.Components, *dsComp)
203207
}
204208

209+
// Add dependencies from model to datasets
210+
builder.AddDependencies(bom)
205211

206212
results = append(results, DiscoveredBOM{
207213
Discovery: d,
@@ -283,7 +289,6 @@ func BuildFromModelIDs(modelIDs []string, hfToken string, timeout time.Duration)
283289

284290
bomBuilder := newBOMBuilder()
285291

286-
287292
resp, err := modelApiFetcher.Fetch(context.Background(), modelID)
288293
if err != nil {
289294
resp = nil
@@ -357,6 +362,8 @@ func BuildFromModelIDs(modelIDs []string, hfToken string, timeout time.Duration)
357362
*bom.Components = append(*bom.Components, *dsComp)
358363
}
359364

365+
// Add dependencies from model to datasets
366+
builder.AddDependencies(bom)
360367

361368
results = append(results, DiscoveredBOM{
362369
Discovery: discovery,

internal/generator/generator_progress.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ func BuildFromModelIDsWithProgress(ctx context.Context, modelIDs []string, opts
166166
progress(ProgressEvent{Type: EventDatasetComplete, ModelID: modelID, Message: dsID})
167167
}
168168

169+
// Add dependencies from model to datasets
170+
builder.AddDependencies(bom)
171+
169172
progress(ProgressEvent{Type: EventModelComplete, ModelID: modelID, Datasets: datasetCount})
170173

171174
results = append(results, DiscoveredBOM{
@@ -284,6 +287,9 @@ func BuildPerDiscoveryWithProgress(ctx context.Context, discoveries []scanner.Di
284287
progress(ProgressEvent{Type: EventDatasetComplete, ModelID: modelID, Message: dsID})
285288
}
286289

290+
// Add dependencies from model to datasets
291+
builder.AddDependencies(bom)
292+
287293
progress(ProgressEvent{Type: EventModelComplete, ModelID: modelID, Datasets: datasetCount})
288294

289295
results = append(results, DiscoveredBOM{

0 commit comments

Comments
 (0)