Skip to content

Commit

Permalink
Add --verbosity option
Browse files Browse the repository at this point in the history
  • Loading branch information
kemzeb committed Jan 2, 2024
1 parent b161c7f commit acf6f30
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 1 deletion.
12 changes: 11 additions & 1 deletion cmd/osv-scanner/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,11 @@ func run(args []string, stdout, stderr io.Writer) int {
Name: "no-call-analysis",
Usage: "disables call graph analysis",
},
&cli.StringFlag{
Name: "verbosity",
Usage: fmt.Sprintf("specify the level of information that should be provided during runtime; value can be: %s", strings.Join(reporter.VerbosityLevels(), ", ")),
Value: "info",
},
&cli.BoolFlag{
Name: "experimental-local-db",
Usage: "checks for vulnerabilities using local databases",
Expand Down Expand Up @@ -182,7 +187,12 @@ func run(args []string, stdout, stderr io.Writer) int {
}
}

if r, err = reporter.New(format, stdout, stderr, reporter.InfoLevel, termWidth); err != nil {
verbosityLevel, err := reporter.ParseVerbosityLevel(context.String("verbosity"))
if err != nil {
return err
}

if r, err = reporter.New(format, stdout, stderr, verbosityLevel, termWidth); err != nil {
return err
}

Expand Down
33 changes: 33 additions & 0 deletions pkg/reporter/verbosity.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package reporter

import (
"fmt"
"strings"
)

// VerbosityLevel is used to determine what amount of information should be given in OSV-Scanner's runtime.
type VerbosityLevel uint8

Expand All @@ -13,3 +18,31 @@ const (
// VerboseLevel is for providing even more information compared to InfoLevel about the inner workings of OSV-Scanner.
VerboseLevel
)

var verbosityLevels = []string{
"error",
"warn",
"info",
"verbose",
}

func VerbosityLevels() []string {
return verbosityLevels
}

func ParseVerbosityLevel(text string) (VerbosityLevel, error) {
switch text {
case "error":
return ErrorLevel, nil
case "warn":
return WarnLevel, nil
case "info":
return InfoLevel, nil
case "verbose":
return VerboseLevel, nil
default:
var l VerbosityLevel

return l, fmt.Errorf("invalid verbosity level \"%s\" - must be one of: %s", text, strings.Join(VerbosityLevels(), ", "))
}
}
40 changes: 40 additions & 0 deletions pkg/reporter/verbosity_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package reporter_test

import (
"testing"

"github.com/google/osv-scanner/pkg/reporter"
)

func TestParseVerbosityLevel_GivenValidLevels(t *testing.T) {
t.Parallel()

tests := []struct {
input string
expectedLvl reporter.VerbosityLevel
}{
{input: "error", expectedLvl: reporter.ErrorLevel},
{input: "warn", expectedLvl: reporter.WarnLevel},
{input: "info", expectedLvl: reporter.InfoLevel},
{input: "verbose", expectedLvl: reporter.VerboseLevel},
}

for _, tt := range tests {
lvl, err := reporter.ParseVerbosityLevel(tt.input)
if err != nil {
t.Error(err)
}
if lvl != tt.expectedLvl {
t.Errorf("level should be supported: %s", tt.input)
}
}
}

func TestParseVerbosityLevel_GivenInvalidLevels(t *testing.T) {
t.Parallel()

_, err := reporter.ParseVerbosityLevel("invalidlvl")
if err == nil {
t.Error("expected invalid level to be an error")
}
}

0 comments on commit acf6f30

Please sign in to comment.