mirror of
https://github.com/anchore/syft.git
synced 2026-11-02 15:36:41 +01:00
Keep original FileInfo persisted on file.Metadata structs (#1794)
* pull in fileinfo changes from stereoscope #172 Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * fix CLI test assumption about the docker daemon Signed-off-by: Alex Goodman <alex.goodman@anchore.com> --------- Signed-off-by: Alex Goodman <alex.goodman@anchore.com> Signed-off-by: <>
This commit is contained in:
@@ -103,26 +103,38 @@ func TestEncodeFullJSONDocument(t *testing.T) {
|
||||
Packages: catalog,
|
||||
FileMetadata: map[source.Coordinates]source.FileMetadata{
|
||||
source.NewLocation("/a/place").Coordinates: {
|
||||
Mode: 0775,
|
||||
FileInfo: stereoFile.ManualInfo{
|
||||
NameValue: "/a/place",
|
||||
ModeValue: 0775,
|
||||
},
|
||||
Type: stereoFile.TypeDirectory,
|
||||
UserID: 0,
|
||||
GroupID: 0,
|
||||
},
|
||||
source.NewLocation("/a/place/a").Coordinates: {
|
||||
Mode: 0775,
|
||||
FileInfo: stereoFile.ManualInfo{
|
||||
NameValue: "/a/place/a",
|
||||
ModeValue: 0775,
|
||||
},
|
||||
Type: stereoFile.TypeRegular,
|
||||
UserID: 0,
|
||||
GroupID: 0,
|
||||
},
|
||||
source.NewLocation("/b").Coordinates: {
|
||||
Mode: 0775,
|
||||
FileInfo: stereoFile.ManualInfo{
|
||||
NameValue: "/b",
|
||||
ModeValue: 0775,
|
||||
},
|
||||
Type: stereoFile.TypeSymLink,
|
||||
LinkDestination: "/c",
|
||||
UserID: 0,
|
||||
GroupID: 0,
|
||||
},
|
||||
source.NewLocation("/b/place/b").Coordinates: {
|
||||
Mode: 0644,
|
||||
FileInfo: stereoFile.ManualInfo{
|
||||
NameValue: "/b/place/b",
|
||||
ModeValue: 0644,
|
||||
},
|
||||
Type: stereoFile.TypeRegular,
|
||||
UserID: 1,
|
||||
GroupID: 2,
|
||||
|
||||
@@ -131,10 +131,18 @@ func toFileMetadataEntry(coordinates source.Coordinates, metadata *source.FileMe
|
||||
return nil
|
||||
}
|
||||
|
||||
mode, err := strconv.Atoi(fmt.Sprintf("%o", metadata.Mode))
|
||||
if err != nil {
|
||||
log.Warnf("invalid mode found in file catalog @ location=%+v mode=%q: %+v", coordinates, metadata.Mode, err)
|
||||
mode = 0
|
||||
var mode int
|
||||
var size int64
|
||||
if metadata != nil && metadata.FileInfo != nil {
|
||||
var err error
|
||||
|
||||
mode, err = strconv.Atoi(fmt.Sprintf("%o", metadata.Mode()))
|
||||
if err != nil {
|
||||
log.Warnf("invalid mode found in file catalog @ location=%+v mode=%q: %+v", coordinates, metadata.Mode, err)
|
||||
mode = 0
|
||||
}
|
||||
|
||||
size = metadata.Size()
|
||||
}
|
||||
|
||||
return &model.FileMetadataEntry{
|
||||
@@ -144,7 +152,7 @@ func toFileMetadataEntry(coordinates source.Coordinates, metadata *source.FileMe
|
||||
UserID: metadata.UserID,
|
||||
GroupID: metadata.GroupID,
|
||||
MIMEType: metadata.MIMEType,
|
||||
Size: metadata.Size,
|
||||
Size: size,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -152,3 +152,45 @@ func Test_toFileType(t *testing.T) {
|
||||
|
||||
assert.ElementsMatch(t, allTypesTested, file.AllTypes(), "not all file.Types are under test")
|
||||
}
|
||||
|
||||
func Test_toFileMetadataEntry(t *testing.T) {
|
||||
coords := source.Coordinates{
|
||||
RealPath: "/path",
|
||||
FileSystemID: "x",
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
metadata *source.FileMetadata
|
||||
want *model.FileMetadataEntry
|
||||
}{
|
||||
{
|
||||
name: "no metadata",
|
||||
},
|
||||
{
|
||||
name: "no file info",
|
||||
metadata: &source.FileMetadata{
|
||||
FileInfo: nil,
|
||||
},
|
||||
want: &model.FileMetadataEntry{
|
||||
Type: file.TypeRegular.String(),
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "with file info",
|
||||
metadata: &source.FileMetadata{
|
||||
FileInfo: &file.ManualInfo{
|
||||
ModeValue: 1,
|
||||
},
|
||||
},
|
||||
want: &model.FileMetadataEntry{
|
||||
Mode: 1,
|
||||
Type: file.TypeRegular.String(),
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert.Equal(t, tt.want, toFileMetadataEntry(coords, tt.metadata))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package syftjson
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
@@ -79,14 +80,16 @@ func toSyftFiles(files []model.File) sbom.Artifacts {
|
||||
fm := os.FileMode(mode)
|
||||
|
||||
ret.FileMetadata[coord] = source.FileMetadata{
|
||||
FileInfo: stereoscopeFile.ManualInfo{
|
||||
NameValue: path.Base(coord.RealPath),
|
||||
SizeValue: f.Metadata.Size,
|
||||
ModeValue: fm,
|
||||
},
|
||||
Path: coord.RealPath,
|
||||
LinkDestination: f.Metadata.LinkDestination,
|
||||
Size: f.Metadata.Size,
|
||||
UserID: f.Metadata.UserID,
|
||||
GroupID: f.Metadata.GroupID,
|
||||
Type: toSyftFileType(f.Metadata.Type),
|
||||
IsDir: fm.IsDir(),
|
||||
Mode: fm,
|
||||
MIMEType: f.Metadata.MIMEType,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,14 +202,16 @@ func Test_toSyftFiles(t *testing.T) {
|
||||
want: sbom.Artifacts{
|
||||
FileMetadata: map[source.Coordinates]source.FileMetadata{
|
||||
coord: {
|
||||
FileInfo: stereoFile.ManualInfo{
|
||||
NameValue: "place",
|
||||
SizeValue: 92,
|
||||
ModeValue: 511, // 777 octal = 511 decimal
|
||||
},
|
||||
Path: coord.RealPath,
|
||||
LinkDestination: "",
|
||||
Size: 92,
|
||||
UserID: 42,
|
||||
GroupID: 32,
|
||||
Type: stereoFile.TypeRegular,
|
||||
IsDir: false,
|
||||
Mode: 511, // 777 octal = 511 decimal
|
||||
MIMEType: "text/plain",
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user