feat: scan local go mod cache for licenses of golang packages (#1645)

Signed-off-by: Avi Deitcher <avi@deitcher.net>
Co-authored-by: Keith Zantow <kzantow@gmail.com>
This commit is contained in:
Avi Deitcher
2023-03-23 10:38:15 -04:00
committed by GitHub
co-authored by Keith Zantow
parent 11e926ab2f
commit 9fd532246a
22 changed files with 775 additions and 23 deletions
+108
View File
@@ -0,0 +1,108 @@
package source
import (
"io"
"github.com/anchore/syft/internal/log"
)
func NewDeferredResolverFromSource(creator func() (Source, error)) *DeferredResolver {
return NewDeferredResolver(func() (FileResolver, error) {
s, err := creator()
if err != nil {
return nil, err
}
return s.FileResolver(SquashedScope)
})
}
func NewDeferredResolver(creator func() (FileResolver, error)) *DeferredResolver {
return &DeferredResolver{
creator: creator,
}
}
type DeferredResolver struct {
creator func() (FileResolver, error)
resolver FileResolver
}
func (d *DeferredResolver) getResolver() (FileResolver, error) {
if d.resolver == nil {
resolver, err := d.creator()
if err != nil {
return nil, err
}
d.resolver = resolver
}
return d.resolver, nil
}
func (d *DeferredResolver) FileContentsByLocation(location Location) (io.ReadCloser, error) {
r, err := d.getResolver()
if err != nil {
return nil, err
}
return r.FileContentsByLocation(location)
}
func (d *DeferredResolver) HasPath(s string) bool {
r, err := d.getResolver()
if err != nil {
log.Debug("unable to get resolver: %v", err)
return false
}
return r.HasPath(s)
}
func (d *DeferredResolver) FilesByPath(paths ...string) ([]Location, error) {
r, err := d.getResolver()
if err != nil {
return nil, err
}
return r.FilesByPath(paths...)
}
func (d *DeferredResolver) FilesByGlob(patterns ...string) ([]Location, error) {
r, err := d.getResolver()
if err != nil {
return nil, err
}
return r.FilesByGlob(patterns...)
}
func (d *DeferredResolver) FilesByMIMEType(types ...string) ([]Location, error) {
r, err := d.getResolver()
if err != nil {
return nil, err
}
return r.FilesByMIMEType(types...)
}
func (d *DeferredResolver) RelativeFileByPath(location Location, path string) *Location {
r, err := d.getResolver()
if err != nil {
return nil
}
return r.RelativeFileByPath(location, path)
}
func (d *DeferredResolver) AllLocations() <-chan Location {
r, err := d.getResolver()
if err != nil {
log.Debug("unable to get resolver: %v", err)
return nil
}
return r.AllLocations()
}
func (d *DeferredResolver) FileMetadataByLocation(location Location) (FileMetadata, error) {
r, err := d.getResolver()
if err != nil {
return FileMetadata{}, err
}
return r.FileMetadataByLocation(location)
}
var _ FileResolver = (*DeferredResolver)(nil)
+24
View File
@@ -0,0 +1,24 @@
package source
import (
"testing"
"github.com/stretchr/testify/require"
)
func Test_NewDeferredResolver(t *testing.T) {
creatorCalled := false
deferredResolver := NewDeferredResolver(func() (FileResolver, error) {
creatorCalled = true
return NewMockResolverForPaths(), nil
})
require.False(t, creatorCalled)
require.Nil(t, deferredResolver.resolver)
_, _ = deferredResolver.FilesByGlob("**/*")
require.True(t, creatorCalled)
require.NotNil(t, deferredResolver.resolver)
}