From f7a0b3c114d5bef4462ddff5bf7e8e2617b53ec7 Mon Sep 17 00:00:00 2001 From: Spencer Schrock <sschrock@google.com> Date: Mon, 16 Oct 2023 11:24:41 -0700 Subject: [PATCH 1/3] fallback to cron style when parsing dates. The cron output was never updated in #2712. In the interim, support both formats. Signed-off-by: Spencer Schrock <sschrock@google.com> --- pkg/json.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/json.go b/pkg/json.go index 1382cc9f086..a1fab73f4a6 100644 --- a/pkg/json.go +++ b/pkg/json.go @@ -16,6 +16,7 @@ package pkg import ( "encoding/json" + "errors" "fmt" "io" "time" @@ -185,7 +186,11 @@ func ExperimentalFromJSON2(r io.Reader) (result ScorecardResult, score float64, return ScorecardResult{}, 0, fmt.Errorf("decode json: %w", err) } + var parseErr *time.ParseError date, err := time.Parse(time.RFC3339, jsr.Date) + if errors.As(err, &parseErr) { + date, err = time.Parse("2006-01-02", jsr.Date) + } if err != nil { return ScorecardResult{}, 0, fmt.Errorf("parse scorecard analysis time: %w", err) } From aeb5840c376ab48cee81b275156bbedb010e0ffa Mon Sep 17 00:00:00 2001 From: Spencer Schrock <sschrock@google.com> Date: Mon, 16 Oct 2023 11:25:14 -0700 Subject: [PATCH 2/3] continue on first diff, to highlight all differences. Signed-off-by: Spencer Schrock <sschrock@google.com> --- cmd/internal/scdiff/app/compare.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/internal/scdiff/app/compare.go b/cmd/internal/scdiff/app/compare.go index 8ff1117ffcc..b0ff869802e 100644 --- a/cmd/internal/scdiff/app/compare.go +++ b/cmd/internal/scdiff/app/compare.go @@ -68,6 +68,8 @@ func compareReaders(x, y io.Reader, output io.Writer) error { xs.Buffer(nil, maxResultSize) ys := bufio.NewScanner(y) ys.Buffer(nil, maxResultSize) + + var differs bool for { if shouldContinue, err := advanceScanners(xs, ys); err != nil { return err @@ -82,9 +84,12 @@ func compareReaders(x, y io.Reader, output io.Writer) error { // go-cmp says its not production ready. Is this a valid usage? // it certainly helps with readability. fmt.Fprintf(output, "%s\n", cmp.Diff(xResult, yResult)) - return errResultsDiffer + differs = true } } + if differs { + return errResultsDiffer + } return nil } From a8a80759ef380aa6858eaadca7dfb311b65a85ad Mon Sep 17 00:00:00 2001 From: Spencer Schrock <sschrock@google.com> Date: Mon, 16 Oct 2023 13:58:42 -0700 Subject: [PATCH 3/3] tests for date fallback. Signed-off-by: Spencer Schrock <sschrock@google.com> --- pkg/json_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/pkg/json_test.go b/pkg/json_test.go index b9836bb8323..285a0694018 100644 --- a/pkg/json_test.go +++ b/pkg/json_test.go @@ -20,6 +20,7 @@ import ( "fmt" "os" "path" + "strings" "testing" "time" @@ -490,3 +491,43 @@ func TestJSONOutput(t *testing.T) { }) } } + +func TestExperimentalFromJSON2_time(t *testing.T) { + t.Parallel() + //nolint:lll,govet // result strings are long + tests := []struct { + name string + result string + want time.Time + wantErr bool + }{ + { + name: "main RFC3339 format", + result: `{"date":"2006-01-02T15:04:05+00:00","repo":{"name":"github.com/foo/bar","commit":"HEAD"},"score":-1.0,"metadata":null}`, + want: time.Date(2006, time.January, 2, 15, 4, 5, 0, time.UTC), + }, + { + name: "backup 2006-01-02 format", + result: `{"date":"2023-09-26","repo":{"name":"github.com/foo/bar","commit":"HEAD"},"score":-1.0,"metadata":null}`, + want: time.Date(2023, time.September, 26, 0, 0, 0, 0, time.UTC), + }, + { + name: "not RFC3339 or 2006-01-02 format", + result: `{"date":"January 1, 2023","repo":{"name":"github.com/foo/bar","commit":"HEAD"},"score":-1.0,"metadata":null}`, + wantErr: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + got, _, err := ExperimentalFromJSON2(strings.NewReader(tt.result)) + if tt.wantErr != (err != nil) { + t.Fatalf("got: %v, wantedErr: %v", err, tt.wantErr) + } + if !got.Date.Equal(tt.want) { + t.Errorf("got: %v, wanted: %v", got.Date, tt.want) + } + }) + } +}