Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions grype/pkg/purl_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type PURLLiteralMetadata struct {
}

func purlEnhancers(applyChannel func(*distro.Distro) bool) []Enhancer {
return []Enhancer{setUpstreamsFromPURL, setDistroFromPURL(applyChannel)}
return []Enhancer{setNameFromPURL, setUpstreamsFromPURL, setDistroFromPURL(applyChannel)}
}

func purlProvider(userInput string, config ProviderConfig, applyChannel func(*distro.Distro) bool) ([]*Package, Context, *sbom.SBOM, error) {
Expand Down Expand Up @@ -53,9 +53,25 @@ func getPurlReader(userInput string) (r io.Reader, ctx Context, err error) {
return nil, ctx, errDoesNotProvide
}

func setUpstreamsFromPURL(out *Package, purl packageurl.PackageURL, syftPkg syftPkg.Package) {
func setNameFromPURL(out *Package, purl packageurl.PackageURL, syftPackage syftPkg.Package) {
if syftPackage.Type != syftPkg.GoModulePkg {
return
}

if purl.Namespace != "" {
out.Name = purl.Namespace + "/" + purl.Name
} else {
out.Name = purl.Name
}

if purl.Subpath != "" {
out.Name += "/" + purl.Subpath
}
}

func setUpstreamsFromPURL(out *Package, purl packageurl.PackageURL, syftPackage syftPkg.Package) {
if len(out.Upstreams) == 0 || out.PURL == "" {
out.Upstreams = upstreamsFromPURL(purl, syftPkg.Type)
out.Upstreams = upstreamsFromPURL(purl, syftPackage.Type)
}
}

Expand Down
18 changes: 18 additions & 0 deletions grype/pkg/purl_provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,24 @@ func Test_PurlProvider(t *testing.T) {
},
},
},
{
name: "include subpath in name when purl is type Golang",
userInput: "pkg:golang/github.com/hashicorp/vault@v0.9.0#api/auth/kubernetes",
channels: testFixChannels(),
wantContext: Context{
Source: &source.Description{
Metadata: PURLLiteralMetadata{PURL: "pkg:golang/github.com/hashicorp/vault@v0.9.0#api/auth/kubernetes"},
},
},
wantPkgs: []*Package{
{
Name: "github.com/hashicorp/vault/api/auth/kubernetes",
Version: "v0.9.0",
Type: pkg.GoModulePkg,
PURL: "pkg:golang/github.com/hashicorp/vault@v0.9.0#api/auth/kubernetes",
},
},
},
{
name: "RPM with extended support (auto)",
userInput: "pkg:rpm/redhat/systemd-x@239-82.el8_10.2?distro=rhel-8.10+eus",
Expand Down