From 76f929b8d02be2754e79e647c4c44b6e69cd0b0c Mon Sep 17 00:00:00 2001 From: Jonathan Amsterdam Date: Thu, 14 Oct 2021 16:23:30 -0400 Subject: [PATCH] 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 Run-TryBot: Jonathan Amsterdam TryBot-Result: kokoro Reviewed-by: Jamal Carvalho --- internal/frontend/header.go | 5 ++++- internal/frontend/header_test.go | 5 +++++ internal/frontend/search_test.go | 7 ++++++- internal/frontend/versions.go | 6 +++++- internal/postgres/insert_module.go | 4 ---- internal/postgres/insert_module_test.go | 19 ++++++++----------- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/internal/frontend/header.go b/internal/frontend/header.go index cb9dadc6..b2fc0319 100644 --- a/internal/frontend/header.go +++ b/internal/frontend/header.go @@ -97,8 +97,11 @@ func effectiveName(pkgPath, pkgName string) string { } // 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 ffac4d02..c608137e 100644 --- a/internal/frontend/header_test.go +++ b/internal/frontend/header_test.go @@ -103,6 +103,11 @@ func TestAbsoluteTime(t *testing.T) { 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 de826e2b..18c59435 100644 --- a/internal/frontend/search_test.go +++ b/internal/frontend/search_test.go @@ -341,7 +341,7 @@ func TestNewSearchResult(t *testing.T) { 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 @@ func TestElapsedTime(t *testing.T) { 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 e7f9c503..8f12a916 100644 --- a/internal/frontend/versions.go +++ b/internal/frontend/versions.go @@ -180,9 +180,13 @@ func buildVersionDetails(ctx context.Context, currentModulePath string, 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 7c8c08ed..c4f4a4aa 100644 --- a/internal/postgres/insert_module.go +++ b/internal/postgres/insert_module.go @@ -44,10 +44,6 @@ func (db *DB) InsertModule(ctx context.Context, m *internal.Module, lmv *interna 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 3c44d872..d415dcd5 100644 --- a/internal/postgres/insert_module_test.go +++ b/internal/postgres/insert_module_test.go @@ -77,6 +77,14 @@ func TestInsertModule(t *testing.T) { }(), 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 @@ func TestInsertModuleErrors(t *testing.T) { 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 {