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)
+			}
+		})
+	}
+}