cmd/gorelease: support for non-starting first version

Fixes golang/go#40267

Change-Id: Ie90929fb6479c50c9a8659b0c4211d66dbd54198
Reviewed-on: https://go-review.googlesource.com/c/exp/+/320229
Trust: Jean de Klerk <deklerk@google.com>
Run-TryBot: Jean de Klerk <deklerk@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
diff --git a/cmd/gorelease/errors.go b/cmd/gorelease/errors.go
index 1e0ea28..e0ebd1e 100644
--- a/cmd/gorelease/errors.go
+++ b/cmd/gorelease/errors.go
@@ -34,11 +34,18 @@
 }
 
 type baseVersionError struct {
-	err error
+	err     error
+	modPath string
 }
 
 func (e *baseVersionError) Error() string {
-	return fmt.Sprintf("could not find base version: %v", e.err)
+	firstVersion := "v0.1.0"
+	_, major, _ := module.SplitPathVersion(e.modPath)
+	if major != "" {
+		firstVersion = major[1:] + ".0.0"
+	}
+
+	return fmt.Sprintf("could not find base version. Consider setting -version=%s if this is a first release, or explicitly set -base=none: %v", firstVersion, e.err)
 }
 
 func (e *baseVersionError) Unwrap() error {
diff --git a/cmd/gorelease/gorelease.go b/cmd/gorelease/gorelease.go
index 6347059..2c055df 100644
--- a/cmd/gorelease/gorelease.go
+++ b/cmd/gorelease/gorelease.go
@@ -740,7 +740,7 @@
 func inferBaseVersion(ctx context.Context, modPath, max string) (baseVersion string, err error) {
 	defer func() {
 		if err != nil {
-			err = &baseVersionError{err: err}
+			err = &baseVersionError{err: err, modPath: modPath}
 		}
 	}()
 
@@ -817,7 +817,6 @@
 	cmd := exec.CommandContext(ctx, "go", "list", "-m", "-versions", "--", modPath)
 	cmd.Env = copyEnv(ctx, cmd.Env)
 	cmd.Dir = tmpDir
-	cmd.Env = append(cmd.Env, "GO111MODULE=on")
 	out, err := cmd.Output()
 	if err != nil {
 		return nil, cleanCmdError(err)
diff --git a/cmd/gorelease/gorelease_test.go b/cmd/gorelease/gorelease_test.go
index c648816..54087b8 100644
--- a/cmd/gorelease/gorelease_test.go
+++ b/cmd/gorelease/gorelease_test.go
@@ -185,8 +185,11 @@
 				return nil, fmt.Errorf("%s:%d: %v", testPath, lineNum, err)
 			}
 		case "proxyVersions":
-			parts := strings.Split(value, ",")
+			if len(value) == 0 {
+				break
+			}
 			proxyVersions := make(map[module.Version]bool)
+			parts := strings.Split(value, ",")
 			for _, modpathWithVersion := range parts {
 				vParts := strings.Split(modpathWithVersion, "@")
 				if len(vParts) != 2 {
diff --git a/cmd/gorelease/testdata/basic/v3_autobase_verify_error.test b/cmd/gorelease/testdata/basic/v3_autobase_verify_error.test
index d9c9b6a..9519d65 100644
--- a/cmd/gorelease/testdata/basic/v3_autobase_verify_error.test
+++ b/cmd/gorelease/testdata/basic/v3_autobase_verify_error.test
@@ -3,4 +3,4 @@
 release=v3.1.0
 error=true
 -- want --
-could not find base version: no versions found lower than v3.1.0
+could not find base version. Consider setting -version=v3.0.0 if this is a first release, or explicitly set -base=none: no versions found lower than v3.1.0
diff --git a/cmd/gorelease/testdata/first/v1_2_3_explicit_none_base.test b/cmd/gorelease/testdata/first/v1_2_3_explicit_none_base.test
new file mode 100644
index 0000000..ea3e7d1
--- /dev/null
+++ b/cmd/gorelease/testdata/first/v1_2_3_explicit_none_base.test
@@ -0,0 +1,12 @@
+mod=example.com/first
+base=none
+release=v1.2.3
+proxyVersions=
+-- want --
+v1.2.3 is a valid semantic version for this release.
+-- go.mod --
+module example.com/first
+
+go 1.12
+-- p.go --
+package p
\ No newline at end of file