mirror of
https://github.com/anchore/syft.git
synced 2026-11-01 06:56:40 +01:00
fix tests to use location instead of file.Reference
Signed-off-by: Alex Goodman <alex.goodman@anchore.com>
This commit is contained in:
@@ -94,7 +94,7 @@ func (r *AllLayersResolver) FilesByPath(paths ...string) ([]Location, error) {
|
||||
return nil, err
|
||||
}
|
||||
for _, result := range results {
|
||||
uniqueLocations = append(uniqueLocations, newLocationFromImage(result, r.img))
|
||||
uniqueLocations = append(uniqueLocations, NewLocationFromImage(result, r.img))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -132,7 +132,7 @@ func (r *AllLayersResolver) FilesByGlob(patterns ...string) ([]Location, error)
|
||||
return nil, err
|
||||
}
|
||||
for _, result := range results {
|
||||
uniqueLocations = append(uniqueLocations, newLocationFromImage(result, r.img))
|
||||
uniqueLocations = append(uniqueLocations, NewLocationFromImage(result, r.img))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -152,20 +152,20 @@ func (r *AllLayersResolver) RelativeFileByPath(location Location, path string) *
|
||||
return nil
|
||||
}
|
||||
|
||||
relativeLocation := newLocationFromImage(*relativeRef, r.img)
|
||||
relativeLocation := NewLocationFromImage(*relativeRef, r.img)
|
||||
|
||||
return &relativeLocation
|
||||
}
|
||||
|
||||
// MultipleFileContentsByRef returns the file contents for all file.References relative to the image. Note that a
|
||||
// file.Reference is a path relative to a particular layer.
|
||||
func (r *AllLayersResolver) MultipleFileContentsByRef(locations []Location) (map[Location]string, error) {
|
||||
func (r *AllLayersResolver) MultipleFileContentsByLocation(locations []Location) (map[Location]string, error) {
|
||||
return mapLocationRefs(r.img.MultipleFileContentsByRef, locations)
|
||||
}
|
||||
|
||||
// FileContentsByRef fetches file contents for a single file reference, irregardless of the source layer.
|
||||
// If the path does not exist an error is returned.
|
||||
func (r *AllLayersResolver) FileContentsByRef(location Location) (string, error) {
|
||||
func (r *AllLayersResolver) FileContentsByLocation(location Location) (string, error) {
|
||||
return r.img.FileContentsByRef(location.ref)
|
||||
}
|
||||
|
||||
|
||||
@@ -4,8 +4,6 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/anchore/stereoscope/pkg/imagetest"
|
||||
|
||||
"github.com/anchore/stereoscope/pkg/file"
|
||||
)
|
||||
|
||||
type resolution struct {
|
||||
@@ -97,7 +95,7 @@ func TestAllLayersResolver_FilesByPath(t *testing.T) {
|
||||
t.Fatalf("could not create resolver: %+v", err)
|
||||
}
|
||||
|
||||
refs, err := resolver.FilesByPath(file.Path(c.linkPath))
|
||||
refs, err := resolver.FilesByPath(c.linkPath)
|
||||
if err != nil {
|
||||
t.Fatalf("could not use resolver: %+v", err)
|
||||
}
|
||||
@@ -109,11 +107,11 @@ func TestAllLayersResolver_FilesByPath(t *testing.T) {
|
||||
for idx, actual := range refs {
|
||||
expected := c.resolutions[idx]
|
||||
|
||||
if actual.Path != file.Path(expected.path) {
|
||||
if actual.Path != expected.path {
|
||||
t.Errorf("bad resolve path: '%s'!='%s'", actual.Path, expected.path)
|
||||
}
|
||||
|
||||
entry, err := img.FileCatalog.Get(actual)
|
||||
entry, err := img.FileCatalog.Get(actual.ref)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get metadata: %+v", err)
|
||||
}
|
||||
@@ -222,11 +220,11 @@ func TestAllLayersResolver_FilesByGlob(t *testing.T) {
|
||||
for idx, actual := range refs {
|
||||
expected := c.resolutions[idx]
|
||||
|
||||
if actual.Path != file.Path(expected.path) {
|
||||
if actual.Path != expected.path {
|
||||
t.Errorf("bad resolve path: '%s'!='%s'", actual.Path, expected.path)
|
||||
}
|
||||
|
||||
entry, err := img.FileCatalog.Get(actual)
|
||||
entry, err := img.FileCatalog.Get(actual.ref)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get metadata: %+v", err)
|
||||
}
|
||||
|
||||
@@ -7,8 +7,6 @@ import (
|
||||
"path"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/docker/distribution/reference"
|
||||
|
||||
"github.com/anchore/syft/internal/log"
|
||||
"github.com/bmatcuk/doublestar"
|
||||
)
|
||||
@@ -48,7 +46,7 @@ func (s DirectoryResolver) FilesByPath(userPaths ...string) ([]Location, error)
|
||||
continue
|
||||
}
|
||||
|
||||
references = append(references, newLocation(userStrPath))
|
||||
references = append(references, NewLocation(userStrPath))
|
||||
}
|
||||
|
||||
return references, nil
|
||||
@@ -75,7 +73,7 @@ func (s DirectoryResolver) FilesByGlob(patterns ...string) ([]Location, error) {
|
||||
continue
|
||||
}
|
||||
|
||||
result = append(result, newLocation(matchedPath))
|
||||
result = append(result, NewLocation(matchedPath))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +93,7 @@ func (s *DirectoryResolver) RelativeFileByPath(_ Location, path string) *Locatio
|
||||
}
|
||||
|
||||
// MultipleFileContentsByRef returns the file contents for all file.References relative a directory.
|
||||
func (s DirectoryResolver) MultipleFileContentsByRef(locations []Location) (map[Location]string, error) {
|
||||
func (s DirectoryResolver) MultipleFileContentsByLocation(locations []Location) (map[Location]string, error) {
|
||||
refContents := make(map[Location]string)
|
||||
for _, location := range locations {
|
||||
contents, err := fileContents(location.Path)
|
||||
@@ -110,10 +108,10 @@ func (s DirectoryResolver) MultipleFileContentsByRef(locations []Location) (map[
|
||||
|
||||
// FileContentsByRef fetches file contents for a single file reference relative to a directory.
|
||||
// If the path does not exist an error is returned.
|
||||
func (s DirectoryResolver) FileContentsByRef(location Location) (string, error) {
|
||||
func (s DirectoryResolver) FileContentsByLocation(location Location) (string, error) {
|
||||
contents, err := fileContents(location.Path)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not read contents of file: %s", reference.Path)
|
||||
return "", fmt.Errorf("could not read contents of file: %s", location.Path)
|
||||
}
|
||||
|
||||
return string(contents), nil
|
||||
|
||||
@@ -2,8 +2,6 @@ package source
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/anchore/stereoscope/pkg/file"
|
||||
)
|
||||
|
||||
func TestDirectoryResolver_FilesByPath(t *testing.T) {
|
||||
@@ -58,7 +56,7 @@ func TestDirectoryResolver_FilesByPath(t *testing.T) {
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
resolver := DirectoryResolver{c.root}
|
||||
refs, err := resolver.FilesByPath(file.Path(c.input))
|
||||
refs, err := resolver.FilesByPath(c.input)
|
||||
if err != nil {
|
||||
t.Fatalf("could not use resolver: %+v, %+v", err, refs)
|
||||
}
|
||||
@@ -68,7 +66,7 @@ func TestDirectoryResolver_FilesByPath(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, actual := range refs {
|
||||
if actual.Path != file.Path(c.expected) {
|
||||
if actual.Path != c.expected {
|
||||
t.Errorf("bad resolve path: '%s'!='%s'", actual.Path, c.expected)
|
||||
}
|
||||
}
|
||||
@@ -79,22 +77,22 @@ func TestDirectoryResolver_FilesByPath(t *testing.T) {
|
||||
func TestDirectoryResolver_MultipleFilesByPath(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
input []file.Path
|
||||
input []string
|
||||
refCount int
|
||||
}{
|
||||
{
|
||||
name: "finds multiple files",
|
||||
input: []file.Path{file.Path("test-fixtures/image-symlinks/file-1.txt"), file.Path("test-fixtures/image-symlinks/file-2.txt")},
|
||||
input: []string{"test-fixtures/image-symlinks/file-1.txt", "test-fixtures/image-symlinks/file-2.txt"},
|
||||
refCount: 2,
|
||||
},
|
||||
{
|
||||
name: "skips non-existing files",
|
||||
input: []file.Path{file.Path("test-fixtures/image-symlinks/bogus.txt"), file.Path("test-fixtures/image-symlinks/file-1.txt")},
|
||||
input: []string{"test-fixtures/image-symlinks/bogus.txt", "test-fixtures/image-symlinks/file-1.txt"},
|
||||
refCount: 1,
|
||||
},
|
||||
{
|
||||
name: "does not return anything for non-existing directories",
|
||||
input: []file.Path{file.Path("test-fixtures/non-existing/bogus.txt"), file.Path("test-fixtures/non-existing/file-1.txt")},
|
||||
input: []string{"test-fixtures/non-existing/bogus.txt", "test-fixtures/non-existing/file-1.txt"},
|
||||
refCount: 0,
|
||||
},
|
||||
}
|
||||
@@ -117,47 +115,47 @@ func TestDirectoryResolver_MultipleFilesByPath(t *testing.T) {
|
||||
func TestDirectoryResolver_MultipleFileContentsByRef(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
input []file.Path
|
||||
input []string
|
||||
refCount int
|
||||
contents []string
|
||||
}{
|
||||
{
|
||||
name: "gets multiple file contents",
|
||||
input: []file.Path{file.Path("test-fixtures/image-symlinks/file-1.txt"), file.Path("test-fixtures/image-symlinks/file-2.txt")},
|
||||
input: []string{"test-fixtures/image-symlinks/file-1.txt", "test-fixtures/image-symlinks/file-2.txt"},
|
||||
refCount: 2,
|
||||
},
|
||||
{
|
||||
name: "skips non-existing files",
|
||||
input: []file.Path{file.Path("test-fixtures/image-symlinks/bogus.txt"), file.Path("test-fixtures/image-symlinks/file-1.txt")},
|
||||
input: []string{"test-fixtures/image-symlinks/bogus.txt", "test-fixtures/image-symlinks/file-1.txt"},
|
||||
refCount: 1,
|
||||
},
|
||||
{
|
||||
name: "does not return anything for non-existing directories",
|
||||
input: []file.Path{file.Path("test-fixtures/non-existing/bogus.txt"), file.Path("test-fixtures/non-existing/file-1.txt")},
|
||||
input: []string{"test-fixtures/non-existing/bogus.txt", "test-fixtures/non-existing/file-1.txt"},
|
||||
refCount: 0,
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
refs := make([]file.Reference, 0)
|
||||
locations := make([]Location, 0)
|
||||
resolver := DirectoryResolver{"test-fixtures"}
|
||||
|
||||
for _, p := range c.input {
|
||||
newRefs, err := resolver.FilesByPath(p)
|
||||
if err != nil {
|
||||
t.Errorf("could not generate refs: %+v", err)
|
||||
t.Errorf("could not generate locations: %+v", err)
|
||||
}
|
||||
for _, ref := range newRefs {
|
||||
refs = append(refs, ref)
|
||||
locations = append(locations, ref)
|
||||
}
|
||||
}
|
||||
|
||||
contents, err := resolver.MultipleFileContentsByRef(refs...)
|
||||
contents, err := resolver.MultipleFileContentsByLocation(locations)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to generate file contents by ref: %+v", err)
|
||||
}
|
||||
if len(contents) != c.refCount {
|
||||
t.Errorf("unexpected number of refs produced: %d != %d", len(contents), c.refCount)
|
||||
t.Errorf("unexpected number of locations produced: %d != %d", len(contents), c.refCount)
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
@@ -56,7 +56,7 @@ func (r *ImageSquashResolver) FilesByPath(paths ...string) ([]Location, error) {
|
||||
|
||||
if resolvedRef != nil && !uniqueFileIDs.Contains(*resolvedRef) {
|
||||
uniqueFileIDs.Add(*resolvedRef)
|
||||
uniqueLocations = append(uniqueLocations, newLocationFromImage(*resolvedRef, r.img))
|
||||
uniqueLocations = append(uniqueLocations, NewLocationFromImage(*resolvedRef, r.img))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,12 +118,12 @@ func (r *ImageSquashResolver) RelativeFileByPath(_ Location, path string) *Locat
|
||||
|
||||
// MultipleFileContentsByRef returns the file contents for all file.References relative to the image. Note that a
|
||||
// file.Reference is a path relative to a particular layer, in this case only from the squashed representation.
|
||||
func (r *ImageSquashResolver) MultipleFileContentsByRef(locations []Location) (map[Location]string, error) {
|
||||
func (r *ImageSquashResolver) MultipleFileContentsByLocation(locations []Location) (map[Location]string, error) {
|
||||
return mapLocationRefs(r.img.MultipleFileContentsByRef, locations)
|
||||
}
|
||||
|
||||
// FileContentsByRef fetches file contents for a single file reference, irregardless of the source layer.
|
||||
// If the path does not exist an error is returned.
|
||||
func (r *ImageSquashResolver) FileContentsByRef(location Location) (string, error) {
|
||||
func (r *ImageSquashResolver) FileContentsByLocation(location Location) (string, error) {
|
||||
return r.img.FileContentsByRef(location.ref)
|
||||
}
|
||||
|
||||
@@ -4,8 +4,6 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/anchore/stereoscope/pkg/imagetest"
|
||||
|
||||
"github.com/anchore/stereoscope/pkg/file"
|
||||
)
|
||||
|
||||
func TestImageSquashResolver_FilesByPath(t *testing.T) {
|
||||
@@ -61,7 +59,7 @@ func TestImageSquashResolver_FilesByPath(t *testing.T) {
|
||||
t.Fatalf("could not create resolver: %+v", err)
|
||||
}
|
||||
|
||||
refs, err := resolver.FilesByPath(file.Path(c.linkPath))
|
||||
refs, err := resolver.FilesByPath(c.linkPath)
|
||||
if err != nil {
|
||||
t.Fatalf("could not use resolver: %+v", err)
|
||||
}
|
||||
@@ -82,11 +80,11 @@ func TestImageSquashResolver_FilesByPath(t *testing.T) {
|
||||
|
||||
actual := refs[0]
|
||||
|
||||
if actual.Path != file.Path(c.resolvePath) {
|
||||
if actual.Path != c.resolvePath {
|
||||
t.Errorf("bad resolve path: '%s'!='%s'", actual.Path, c.resolvePath)
|
||||
}
|
||||
|
||||
entry, err := img.FileCatalog.Get(actual)
|
||||
entry, err := img.FileCatalog.Get(actual.ref)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get metadata: %+v", err)
|
||||
}
|
||||
@@ -172,11 +170,11 @@ func TestImageSquashResolver_FilesByGlob(t *testing.T) {
|
||||
|
||||
actual := refs[0]
|
||||
|
||||
if actual.Path != file.Path(c.resolvePath) {
|
||||
if actual.Path != c.resolvePath {
|
||||
t.Errorf("bad resolve path: '%s'!='%s'", actual.Path, c.resolvePath)
|
||||
}
|
||||
|
||||
entry, err := img.FileCatalog.Get(actual)
|
||||
entry, err := img.FileCatalog.Get(actual.ref)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get metadata: %+v", err)
|
||||
}
|
||||
|
||||
@@ -14,20 +14,13 @@ type Location struct {
|
||||
ref file.Reference
|
||||
}
|
||||
|
||||
func newLocation(path string) Location {
|
||||
func NewLocation(path string) Location {
|
||||
return Location{
|
||||
Path: path,
|
||||
}
|
||||
}
|
||||
|
||||
func newLocationFromRef(ref file.Reference) Location {
|
||||
return Location{
|
||||
Path: string(ref.Path),
|
||||
ref: ref,
|
||||
}
|
||||
}
|
||||
|
||||
func newLocationFromImage(ref file.Reference, img *image.Image) Location {
|
||||
func NewLocationFromImage(ref file.Reference, img *image.Image) Location {
|
||||
entry, err := img.FileCatalog.Get(ref)
|
||||
if err != nil {
|
||||
log.Warnf("unable to find file catalog entry for ref=%+v", ref)
|
||||
|
||||
@@ -14,8 +14,8 @@ type Resolver interface {
|
||||
|
||||
// ContentResolver knows how to get file content for given file.References
|
||||
type ContentResolver interface {
|
||||
FileContentsByRef(Location) (string, error)
|
||||
MultipleFileContentsByRef([]Location) (map[Location]string, error)
|
||||
FileContentsByLocation(Location) (string, error)
|
||||
MultipleFileContentsByLocation([]Location) (map[Location]string, error)
|
||||
// TODO: we should consider refactoring to return a set of io.Readers or file.Openers instead of the full contents themselves (allow for optional buffering).
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ var Options = []Scope{
|
||||
AllLayersScope,
|
||||
}
|
||||
|
||||
func ParseOption(userStr string) Scope {
|
||||
func ParseScope(userStr string) Scope {
|
||||
switch strings.ToLower(userStr) {
|
||||
case strings.ToLower(SquashedScope.String()):
|
||||
return SquashedScope
|
||||
|
||||
+18
-20
@@ -4,7 +4,6 @@ import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/anchore/stereoscope/pkg/file"
|
||||
"github.com/anchore/stereoscope/pkg/image"
|
||||
"github.com/mitchellh/go-homedir"
|
||||
"github.com/spf13/afero"
|
||||
@@ -36,10 +35,10 @@ func TestNewScopeFromImage(t *testing.T) {
|
||||
Layers: []*image.Layer{layer},
|
||||
}
|
||||
|
||||
t.Run("create a new Source object from image", func(t *testing.T) {
|
||||
t.Run("create a new Locations object from image", func(t *testing.T) {
|
||||
_, err := NewFromImage(&img, AllLayersScope)
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error when creating a new Source from img: %w", err)
|
||||
t.Errorf("unexpected error when creating a new Locations from img: %+v", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -49,31 +48,31 @@ func TestDirectoryScope(t *testing.T) {
|
||||
desc string
|
||||
input string
|
||||
expString string
|
||||
inputPaths []file.Path
|
||||
inputPaths []string
|
||||
expRefs int
|
||||
}{
|
||||
{
|
||||
desc: "no paths exist",
|
||||
input: "foobar/",
|
||||
inputPaths: []file.Path{file.Path("/opt/"), file.Path("/other")},
|
||||
inputPaths: []string{"/opt/", "/other"},
|
||||
expRefs: 0,
|
||||
},
|
||||
{
|
||||
desc: "path detected",
|
||||
input: "test-fixtures",
|
||||
inputPaths: []file.Path{file.Path("test-fixtures/path-detected/.vimrc")},
|
||||
inputPaths: []string{"test-fixtures/path-detected/.vimrc"},
|
||||
expRefs: 1,
|
||||
},
|
||||
{
|
||||
desc: "directory ignored",
|
||||
input: "test-fixtures",
|
||||
inputPaths: []file.Path{file.Path("test-fixtures/path-detected")},
|
||||
inputPaths: []string{"test-fixtures/path-detected"},
|
||||
expRefs: 0,
|
||||
},
|
||||
{
|
||||
desc: "no files-by-path detected",
|
||||
input: "test-fixtures",
|
||||
inputPaths: []file.Path{file.Path("test-fixtures/no-path-detected")},
|
||||
inputPaths: []string{"test-fixtures/no-path-detected"},
|
||||
expRefs: 0,
|
||||
},
|
||||
}
|
||||
@@ -82,7 +81,7 @@ func TestDirectoryScope(t *testing.T) {
|
||||
p, err := NewFromDirectory(test.input)
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("could not create NewDirScope: %w", err)
|
||||
t.Errorf("could not create NewDirScope: %+v", err)
|
||||
}
|
||||
if p.Target.(DirSource).Path != test.input {
|
||||
t.Errorf("mismatched stringer: '%s' != '%s'", p.Target.(DirSource).Path, test.input)
|
||||
@@ -90,7 +89,7 @@ func TestDirectoryScope(t *testing.T) {
|
||||
|
||||
refs, err := p.Resolver.FilesByPath(test.inputPaths...)
|
||||
if err != nil {
|
||||
t.Errorf("FilesByPath call produced an error: %w", err)
|
||||
t.Errorf("FilesByPath call produced an error: %+v", err)
|
||||
}
|
||||
if len(refs) != test.expRefs {
|
||||
t.Errorf("unexpected number of refs returned: %d != %d", len(refs), test.expRefs)
|
||||
@@ -125,20 +124,19 @@ func TestMultipleFileContentsByRefContents(t *testing.T) {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
p, err := NewFromDirectory(test.input)
|
||||
if err != nil {
|
||||
t.Errorf("could not create NewDirScope: %w", err)
|
||||
t.Errorf("could not create NewDirScope: %+v", err)
|
||||
}
|
||||
refs, err := p.Resolver.FilesByPath(file.Path(test.path))
|
||||
locations, err := p.Resolver.FilesByPath(test.path)
|
||||
if err != nil {
|
||||
t.Errorf("could not get file references from path: %s, %v", test.path, err)
|
||||
}
|
||||
|
||||
if len(refs) != 1 {
|
||||
t.Fatalf("expected a single ref to be generated but got: %d", len(refs))
|
||||
if len(locations) != 1 {
|
||||
t.Fatalf("expected a single location to be generated but got: %d", len(locations))
|
||||
}
|
||||
ref := refs[0]
|
||||
location := locations[0]
|
||||
|
||||
contents, err := p.Resolver.MultipleFileContentsByRef(ref)
|
||||
content := contents[ref]
|
||||
content, err := p.Resolver.FileContentsByLocation(location)
|
||||
|
||||
if content != test.expected {
|
||||
t.Errorf("unexpected contents from file: '%s' != '%s'", content, test.expected)
|
||||
@@ -165,9 +163,9 @@ func TestMultipleFileContentsByRefNoContents(t *testing.T) {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
p, err := NewFromDirectory(test.input)
|
||||
if err != nil {
|
||||
t.Errorf("could not create NewDirScope: %w", err)
|
||||
t.Errorf("could not create NewDirScope: %+v", err)
|
||||
}
|
||||
refs, err := p.Resolver.FilesByPath(file.Path(test.path))
|
||||
refs, err := p.Resolver.FilesByPath(test.path)
|
||||
if err != nil {
|
||||
t.Errorf("could not get file references from path: %s, %v", test.path, err)
|
||||
}
|
||||
@@ -210,7 +208,7 @@ func TestFilesByGlob(t *testing.T) {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
p, err := NewFromDirectory(test.input)
|
||||
if err != nil {
|
||||
t.Errorf("could not create NewDirScope: %w", err)
|
||||
t.Errorf("could not create NewDirScope: %+v", err)
|
||||
}
|
||||
|
||||
contents, err := p.Resolver.FilesByGlob(test.glob)
|
||||
|
||||
Reference in New Issue
Block a user