Fix file creation for output options (#875)

This commit is contained in:
Alex Goodman
2022-03-08 15:37:28 +00:00
committed by GitHub
parent 5123f073c7
commit 07d3c9af52
12 changed files with 190 additions and 20 deletions
+20 -5
View File
@@ -6,8 +6,8 @@ import (
"path"
"github.com/anchore/syft/internal/log"
"github.com/hashicorp/go-multierror"
"github.com/mitchellh/go-homedir"
)
// multiWriter holds a list of child sbom.Writers to apply all Write and Close operations to
@@ -21,8 +21,21 @@ type WriterOption struct {
Path string
}
func NewWriterOption(f Format, p string) WriterOption {
expandedPath, err := homedir.Expand(p)
if err != nil {
log.Warnf("could not expand given writer output path=%q: %w", p, err)
// ignore errors
expandedPath = p
}
return WriterOption{
Format: f,
Path: expandedPath,
}
}
// NewWriter create all report writers from input options; if a file is not specified, os.Stdout is used
func NewWriter(options ...WriterOption) (Writer, error) {
func NewWriter(options ...WriterOption) (_ Writer, err error) {
if len(options) == 0 {
return nil, fmt.Errorf("no output options provided")
}
@@ -30,9 +43,11 @@ func NewWriter(options ...WriterOption) (Writer, error) {
out := &multiWriter{}
defer func() {
// close any previously opened files; we can't really recover from any errors
if err := out.Close(); err != nil {
log.Warnf("unable to close sbom writers: %+v", err)
if err != nil {
// close any previously opened files; we can't really recover from any errors
if err := out.Close(); err != nil {
log.Warnf("unable to close sbom writers: %+v", err)
}
}
}()
+32
View File
@@ -2,9 +2,11 @@ package sbom
import (
"io"
"path/filepath"
"strings"
"testing"
"github.com/docker/docker/pkg/homedir"
"github.com/stretchr/testify/assert"
)
@@ -170,3 +172,33 @@ func TestOutputWriter(t *testing.T) {
})
}
}
func TestNewWriterOption(t *testing.T) {
tests := []struct {
name string
path string
expected string
}{
{
name: "expand home dir",
path: "~/place.txt",
expected: filepath.Join(homedir.Get(), "place.txt"),
},
{
name: "passthrough other paths",
path: "/other/place.txt",
expected: "/other/place.txt",
},
{
name: "no path",
path: "",
expected: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
o := NewWriterOption(dummyFormat("table"), tt.path)
assert.Equal(t, tt.expected, o.Path)
})
}
}