internal/{postgres,frontend}: support modules with zero commit times

It's valid to have a module with a zero commit time (as reported by
the proxy .info endpoint). That can happen if the module is served
from a vanity URL with a go-import meta tag of type `mod`.

Process those modules and display them with a publish date of
"unknown."

Fixes golang/go#48952

Change-Id: I8efdebfa27c8b6ed68c183bac77d87ee715f8262
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/356129
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jamal Carvalho <jamal@golang.org>
diff --git a/internal/frontend/header.go b/internal/frontend/header.go
index cb9dadc..b2fc031 100644
--- a/internal/frontend/header.go
+++ b/internal/frontend/header.go
@@ -97,8 +97,11 @@
 }
 
 // absoluteTime takes a date and returns returns a human-readable,
-// date with the format mmm d, yyyy:
+// date with the format mmm d, yyyy.
 func absoluteTime(date time.Time) string {
+	if date.IsZero() {
+		return "unknown"
+	}
 	// Convert to UTC because that is how the date is represented in the DB.
 	// (The pgx driver returns local times.) Example: if a date is stored
 	// as Jan 30 at midnight, then the local NYC time is on Jan 29, and this
diff --git a/internal/frontend/header_test.go b/internal/frontend/header_test.go
index ffac4d0..c608137 100644
--- a/internal/frontend/header_test.go
+++ b/internal/frontend/header_test.go
@@ -103,6 +103,11 @@
 			date:         now.Add(time.Hour * 24 * -5),
 			absoluteTime: now.Add(time.Hour * 24 * -5).Format("Jan _2, 2006"),
 		},
+		{
+			name:         "zero time",
+			date:         time.Time{},
+			absoluteTime: "unknown",
+		},
 	}
 
 	for _, test := range testCases {
diff --git a/internal/frontend/search_test.go b/internal/frontend/search_test.go
index de826e2..18c5943 100644
--- a/internal/frontend/search_test.go
+++ b/internal/frontend/search_test.go
@@ -341,7 +341,7 @@
 		t.Run(test.name, func(t *testing.T) {
 			pr := message.NewPrinter(test.tag)
 			got := newSearchResult(&test.in, false, pr)
-			test.want.CommitTime = "Jan  1, 0001"
+			test.want.CommitTime = "unknown"
 			if diff := cmp.Diff(&test.want, got); diff != "" {
 				t.Errorf("mimatch (-want, +got):\n%s", diff)
 			}
@@ -425,6 +425,11 @@
 			date:        now.Add(time.Hour * 24 * -14),
 			elapsedTime: now.Add(time.Hour * 24 * -14).Format("Jan _2, 2006"),
 		},
+		{
+			name:        "zero",
+			date:        time.Time{},
+			elapsedTime: "unknown",
+		},
 	}
 
 	for _, test := range testCases {
diff --git a/internal/frontend/versions.go b/internal/frontend/versions.go
index e7f9c50..8f12a91 100644
--- a/internal/frontend/versions.go
+++ b/internal/frontend/versions.go
@@ -180,9 +180,13 @@
 			Major:        major,
 			Incompatible: version.IsIncompatible(mi.Version),
 		}
+		commitTime := "date unknown"
+		if !mi.CommitTime.IsZero() {
+			commitTime = absoluteTime(mi.CommitTime)
+		}
 		vs := &VersionSummary{
 			Link:                linkify(mi),
-			CommitTime:          absoluteTime(mi.CommitTime),
+			CommitTime:          commitTime,
 			Version:             linkVersion(mi.ModulePath, mi.Version, mi.Version),
 			IsMinor:             isMinor(mi.Version),
 			Retracted:           mi.Retracted,
diff --git a/internal/postgres/insert_module.go b/internal/postgres/insert_module.go
index 7c8c08e..c4f4a4a 100644
--- a/internal/postgres/insert_module.go
+++ b/internal/postgres/insert_module.go
@@ -44,10 +44,6 @@
 	if err := validateModule(m); err != nil {
 		return false, err
 	}
-	// The proxy accepts modules with zero commit times, but they are bad.
-	if m.CommitTime.IsZero() {
-		return false, fmt.Errorf("empty commit time: %w", derrors.BadModule)
-	}
 	// Compare existing data from the database, and the module to be
 	// inserted. Rows that currently exist should not be missing from the
 	// new module. We want to be sure that we will overwrite every row that
diff --git a/internal/postgres/insert_module_test.go b/internal/postgres/insert_module_test.go
index 3c44d87..d415dcd 100644
--- a/internal/postgres/insert_module_test.go
+++ b/internal/postgres/insert_module_test.go
@@ -77,6 +77,14 @@
 			}(),
 			goMod: "module " + sample.ModulePath + " // Deprecated: use v2",
 		},
+		{
+			name: "zero commit time",
+			module: func() *internal.Module {
+				v := sample.DefaultModule()
+				v.CommitTime = time.Time{}
+				return v
+			}(),
+		},
 	} {
 		t.Run(test.name, func(t *testing.T) {
 			testDB, release := acquire(t)
@@ -259,17 +267,6 @@
 			wantModulePath: sample.ModulePath,
 			wantWriteErr:   derrors.DBModuleInsertInvalid,
 		},
-		{
-			name: "empty commit time",
-			module: func() *internal.Module {
-				v := sample.DefaultModule()
-				v.CommitTime = time.Time{}
-				return v
-			}(),
-			wantVersion:    sample.VersionString,
-			wantModulePath: sample.ModulePath,
-			wantWriteErr:   derrors.BadModule,
-		},
 	}
 
 	for _, test := range testCases {