Skip to content

Commit 1504539

Browse files
Merge pull request #97 from interlynk-io/fix/project_name
2 parents ce1ed8c + a9e872f commit 1504539

16 files changed

Lines changed: 210 additions & 207 deletions

File tree

pkg/sbom/extract.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package sbom
1616

1717
import (
1818
"encoding/json"
19-
"fmt"
2019
"strings"
2120
)
2221

@@ -25,7 +24,7 @@ type PrimaryComponent struct {
2524
Version string
2625
}
2726

28-
func ExtractPrimaryComponentName(content []byte) (PrimaryComponent, error) {
27+
func ExtractPrimaryComponentName(content []byte) PrimaryComponent {
2928
// get primaryComp for cyclonedx
3029
var cdx struct {
3130
Metadata struct {
@@ -36,11 +35,17 @@ func ExtractPrimaryComponentName(content []byte) (PrimaryComponent, error) {
3635
} `json:"metadata"`
3736
}
3837

39-
if err := json.Unmarshal(content, &cdx); err == nil && cdx.Metadata.Component.Name != "" && cdx.Metadata.Component.Version != "" {
38+
if err := json.Unmarshal(content, &cdx); err == nil && cdx.Metadata.Component.Name != "" {
39+
var projectVersion string
40+
if cdx.Metadata.Component.Version == "" {
41+
projectVersion = "unknown"
42+
} else {
43+
projectVersion = cdx.Metadata.Component.Version
44+
}
4045
return PrimaryComponent{
4146
Name: cdx.Metadata.Component.Name,
42-
Version: cdx.Metadata.Component.Version,
43-
}, nil
47+
Version: projectVersion,
48+
}
4449
}
4550

4651
// get primaryComp for cyclonedx
@@ -70,13 +75,19 @@ func ExtractPrimaryComponentName(content []byte) (PrimaryComponent, error) {
7075

7176
// Match targetID to a package
7277
for _, pkg := range spdx.Packages {
73-
if pkg.SPDXID == targetID && pkg.Name != "" && pkg.VersionInfo != "" {
78+
if pkg.SPDXID == targetID && pkg.Name != "" {
79+
var pkgVersion string
80+
if pkg.VersionInfo == "" {
81+
pkgVersion = "unknown"
82+
} else {
83+
pkgVersion = pkg.VersionInfo
84+
}
7485
return PrimaryComponent{
7586
Name: pkg.Name,
76-
Version: pkg.VersionInfo,
77-
}, nil
87+
Version: pkgVersion,
88+
}
7889
}
7990
}
8091
}
81-
return PrimaryComponent{}, fmt.Errorf("no primary component found in JSON SBOM")
92+
return PrimaryComponent{}
8293
}

pkg/source/folder/adapter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,6 @@ func (f *FolderAdapter) UploadSBOMs(ctx tcontext.TransferMetadata, iterator iter
131131

132132
// DryRun for Folder Adapter: Displays all fetched SBOMs from folder adapter
133133
func (f *FolderAdapter) DryRun(ctx tcontext.TransferMetadata, iter iterator.SBOMIterator) error {
134-
reporter := NewFolderReporter(false, "")
134+
reporter := NewFolderReporter(false, "", f.Config.FolderPath)
135135
return reporter.DryRun(ctx, iter)
136136
}

pkg/source/folder/fetcher.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ type SequentialFetcher struct{}
4141
// 3. Reads the content & adds it to the iterator along with path.
4242
func (f *SequentialFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error) {
4343
logger.LogDebug(ctx.Context, "Fetching SBOMs Sequentially")
44-
4544
var sbomList []*iterator.SBOM
4645
err := filepath.Walk(config.FolderPath, func(path string, info os.FileInfo, err error) error {
4746
if err != nil {
@@ -64,16 +63,13 @@ func (f *SequentialFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderC
6463
}
6564

6665
if source.IsSBOMFile(content) {
67-
68-
projectName, projectVersion := getProjectNameAndVersion(ctx, path, content)
69-
logger.LogDebug(ctx.Context, "Project Details", "name", projectName, "version", projectVersion)
66+
logger.LogDebug(ctx.Context, "Locally SBOM located folder", "path", config.FolderPath)
7067

7168
fileName := getFilePath(config.FolderPath, path)
7269
sbomList = append(sbomList, &iterator.SBOM{
7370
Data: content,
7471
Path: fileName,
75-
Namespace: projectName,
76-
Version: projectVersion,
72+
Namespace: config.FolderPath,
7773
})
7874
} else {
7975
logger.LogDebug(ctx.Context, "Skipping non-SBOM file", "path", getFilePath(config.FolderPath, path))
@@ -128,8 +124,7 @@ func (f *ParallelFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderCon
128124
continue
129125
}
130126

131-
projectName, projectVersion := getProjectNameAndVersion(ctx, path, content)
132-
logger.LogDebug(ctx.Context, "Project Details", "name", projectName, "version", projectVersion)
127+
logger.LogDebug(ctx.Context, "Locally SBOM located folder", "path", config.FolderPath)
133128

134129
// get a relative file path.
135130
fileName := getFilePath(config.FolderPath, path)
@@ -138,8 +133,7 @@ func (f *ParallelFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderCon
138133
sbomList = append(sbomList, &iterator.SBOM{
139134
Data: content,
140135
Path: fileName,
141-
Namespace: projectName,
142-
Version: projectVersion,
136+
Namespace: config.FolderPath,
143137
})
144138
mu.Unlock()
145139
}

pkg/source/folder/reporter.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,18 @@ import (
2626
)
2727

2828
type FolderReporter struct {
29-
verbose bool
30-
outputDir string
29+
verbose bool
30+
inputDir string
31+
folderPath string
3132
}
3233

33-
func NewFolderReporter(verbose bool, outputDir string) *FolderReporter {
34-
return &FolderReporter{verbose: verbose, outputDir: outputDir}
34+
func NewFolderReporter(verbose bool, inputDir, folderPath string) *FolderReporter {
35+
return &FolderReporter{verbose: verbose, inputDir: inputDir, folderPath: folderPath}
3536
}
3637

3738
func (r *FolderReporter) DryRun(ctx tcontext.TransferMetadata, iter iterator.SBOMIterator) error {
3839
logger.LogDebug(ctx.Context, "Dry-run mode: Displaying SBOMs fetched from folder")
39-
processor := sbom.NewSBOMProcessor(r.outputDir, r.verbose)
40+
processor := sbom.NewSBOMProcessor(r.inputDir, r.verbose)
4041
sbomCount := 0
4142
fmt.Println("\n📦 Details of all Fetched SBOMs by Folder Input Adapter")
4243

@@ -55,7 +56,7 @@ func (r *FolderReporter) DryRun(ctx tcontext.TransferMetadata, iter iterator.SBO
5556
logger.LogError(ctx.Context, err, "Failed to process SBOM")
5657
return err
5758
}
58-
if r.outputDir != "" {
59+
if r.inputDir != "" {
5960
if err := processor.WriteSBOM(doc, ""); err != nil {
6061
logger.LogError(ctx.Context, err, "Failed to write SBOM")
6162
return err
@@ -70,7 +71,7 @@ func (r *FolderReporter) DryRun(ctx tcontext.TransferMetadata, iter iterator.SBO
7071
}
7172
sbomCount++
7273
fmt.Printf(" - 📁 Folder: %s | Format: %s | SpecVersion: %s | Filename: %s\n",
73-
sbom.Namespace, doc.Format, doc.SpecVersion, doc.Filename)
74+
r.folderPath, doc.Format, doc.SpecVersion, doc.Filename)
7475
}
7576
fmt.Printf("📊 Total SBOMs: %d\n", sbomCount)
7677
return nil

pkg/source/folder/retrieve.go

Lines changed: 0 additions & 52 deletions
This file was deleted.

pkg/source/folder/watcher.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,14 @@ func (f *WatcherFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderConf
110110
}
111111

112112
if source.IsSBOMFile(content) {
113-
projectName, projectVersion := getProjectNameAndVersion(ctx, event.Name, content)
114-
logger.LogDebug(ctx.Context, "Project Details", "name", projectName, "version", projectVersion)
113+
logger.LogDebug(ctx.Context, "Locally SBOM located folder", "path", config.FolderPath)
115114

116115
fileName := getFilePath(config.FolderPath, event.Name)
117116
logger.LogDebug(ctx.Context, "Detected SBOM", "file", fileName)
118117
sbomChan <- &iterator.SBOM{
119118
Data: content,
120119
Path: fileName,
121-
Namespace: projectName,
122-
Version: projectVersion,
120+
Namespace: config.FolderPath,
123121
}
124122
}
125123
}

pkg/source/github/adapter.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ func (g *GitHubAdapter) fetchSBOMsSequentially(ctx tcontext.TransferMetadata, re
489489

490490
releaseSBOM, err := giter.fetchSBOMFromAPI(ctx)
491491
if err != nil {
492-
logger.LogInfo(ctx.Context, "Failed to fetch SBOMs from API Method for", "repo", repo)
492+
logger.LogDebug(ctx.Context, "Failed to fetch SBOMs from API Method for", "repo", repo)
493493
continue
494494
}
495495
if len(releaseSBOM) > 0 {
@@ -500,7 +500,7 @@ func (g *GitHubAdapter) fetchSBOMsSequentially(ctx tcontext.TransferMetadata, re
500500

501501
releaseSBOMs, err := giter.fetchSBOMFromReleases(ctx)
502502
if err != nil {
503-
logger.LogInfo(ctx.Context, "Failed to fetch SBOMs from Release Method for", "repo", repo)
503+
logger.LogDebug(ctx.Context, "Failed to fetch SBOMs from Release Method for", "repo", repo)
504504
continue
505505
}
506506
if len(releaseSBOMs) > 0 {
@@ -511,7 +511,7 @@ func (g *GitHubAdapter) fetchSBOMsSequentially(ctx tcontext.TransferMetadata, re
511511

512512
releaseSBOM, err := giter.fetchSBOMFromTool(ctx)
513513
if err != nil {
514-
logger.LogInfo(ctx.Context, "Failed to generate SBOMs via Tool Method for", "repo", repo)
514+
logger.LogDebug(ctx.Context, "Failed to generate SBOMs via Tool Method for", "repo", repo)
515515
continue
516516
}
517517

pkg/source/github/iterator.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@ func (it *GitHubIterator) fetchSBOMFromAPI(ctx tcontext.TransferMetadata) ([]*it
6868
var sbomSlice []*iterator.SBOM
6969

7070
sbomSlice = append(sbomSlice, &iterator.SBOM{
71-
Path: "",
72-
Data: sbomData,
71+
Path: "",
72+
Data: sbomData,
73+
74+
// namespace as owner/repo, where SBOM are present
7375
Namespace: fmt.Sprintf("%s/%s", it.client.Owner, it.client.Repo),
7476
Version: "latest",
7577
})
@@ -90,8 +92,10 @@ func (it *GitHubIterator) fetchSBOMFromReleases(ctx tcontext.TransferMetadata) (
9092
for version, sbomDataList := range sbomFiles {
9193
for _, sbomData := range sbomDataList { // sbomPath is a string (file path)
9294
sbomSlice = append(sbomSlice, &iterator.SBOM{
93-
Path: sbomData.Filename,
94-
Data: sbomData.Content,
95+
Path: sbomData.Filename,
96+
Data: sbomData.Content,
97+
98+
// namespace as owner/repo, where SBOM are present
9599
Namespace: fmt.Sprintf("%s/%s", it.client.Owner, it.client.Repo),
96100
Version: version,
97101
})
@@ -131,8 +135,10 @@ func (it *GitHubIterator) fetchSBOMFromTool(ctx tcontext.TransferMetadata) ([]*i
131135
}
132136

133137
sbomSlice = append(sbomSlice, &iterator.SBOM{
134-
Path: "",
135-
Data: sbomBytes,
138+
Path: "",
139+
Data: sbomBytes,
140+
141+
// namespace as owner/repo, where SBOM are present
136142
Namespace: fmt.Sprintf("%s/%s", it.client.Owner, it.client.Repo),
137143
Version: it.client.Version,
138144
Branch: it.client.Branch,

pkg/target/dependencytrack/reporter.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ package dependencytrack
1717
import (
1818
"fmt"
1919
"io"
20+
"path/filepath"
2021

2122
"github.com/interlynk-io/sbommv/pkg/iterator"
2223
"github.com/interlynk-io/sbommv/pkg/logger"
2324
"github.com/interlynk-io/sbommv/pkg/sbom"
2425
"github.com/interlynk-io/sbommv/pkg/tcontext"
26+
"github.com/interlynk-io/sbommv/pkg/utils"
2527
)
2628

2729
type DependencyTrackReporter struct {
@@ -41,7 +43,7 @@ func NewDependencyTrackReporter(apiURL, projectName, projectVersion string) *Dep
4143
func (r *DependencyTrackReporter) DryRun(ctx tcontext.TransferMetadata, iter iterator.SBOMIterator) error {
4244
logger.LogDebug(ctx.Context, "Dry-run mode: Simulating SBOM upload to Dependency-Track")
4345
fmt.Println("\n📦 Dependency-Track Output Adapter Dry-Run")
44-
fmt.Printf("📦 API Endpoint: %s\n", r.apiURL)
46+
fmt.Printf("📦 DTrack API Endpoint: %s\n", r.apiURL)
4547
sbomCount := 0
4648

4749
processor := sbom.NewSBOMProcessor("", false)
@@ -62,19 +64,22 @@ func (r *DependencyTrackReporter) DryRun(ctx tcontext.TransferMetadata, iter ite
6264
return err
6365
}
6466

65-
projectName, err := getProjectName(ctx, r.projectName, sbom.Namespace)
66-
if err != nil {
67-
continue
67+
sourceAdapter := ctx.Value("source")
68+
69+
projectName, projectVersion := utils.ConstructProjectName(ctx, r.projectName, r.projectVersion, sbom.Namespace, sbom.Version, sbom.Data, sourceAdapter.(string))
70+
if projectName == "" {
71+
projectName = filepath.Base(sbom.Path)
72+
projectName = projectName[:len(projectName)-len(filepath.Ext(projectName))]
73+
projectVersion = "latest"
6874
}
6975

70-
projectVersion := getProjectVersion(ctx, r.projectVersion, sbom.Version)
7176
finalProjectName := fmt.Sprintf("%s-%s", projectName, projectVersion)
7277

73-
fmt.Printf("- 📁 Would upload to project '%s' | Format: %s | SpecVersion: %s\n",
74-
finalProjectName, doc.Format, doc.SpecVersion)
78+
fmt.Printf("- 📁 Would upload to project '%s' | Format: %s | SpecVersion: %s | Filename: %s\n",
79+
finalProjectName, doc.Format, doc.SpecVersion, sbom.Path)
7580
sbomCount++
7681
}
77-
fmt.Printf("📦 DTrack API Endpoint: %s\n", r.apiURL)
7882
fmt.Printf("\n 📊 Total SBOMs to upload: %d\n", sbomCount)
83+
fmt.Println("\n✅ Dry-run completed. No data was uploaded to DTrack.")
7984
return nil
8085
}

0 commit comments

Comments
 (0)