cmd/release: move releaselet into a package

+build ignore files are difficult to edit using gopls. Split the
releaselet into its own package, which can have real tests.

Change-Id: I0d74c7d624d6922a61da2283747451bc6b555c21
Reviewed-on: https://go-review.googlesource.com/c/build/+/385715
Trust: Heschi Kreinick <heschi@google.com>
Run-TryBot: Heschi Kreinick <heschi@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Auto-Submit: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/cmd/release/release.go b/cmd/release/release.go
index 9b6ea16..a8d83ba 100644
--- a/cmd/release/release.go
+++ b/cmd/release/release.go
@@ -33,7 +33,7 @@
 	"golang.org/x/build/dashboard"
 )
 
-//go:embed releaselet.go
+//go:embed releaselet/releaselet.go
 var releaselet string
 
 var (
diff --git a/cmd/release/releaselet.go b/cmd/release/releaselet/releaselet.go
similarity index 95%
rename from cmd/release/releaselet.go
rename to cmd/release/releaselet/releaselet.go
index 7866162..1351736 100644
--- a/cmd/release/releaselet.go
+++ b/cmd/release/releaselet/releaselet.go
@@ -2,11 +2,9 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-//go:build ignore
-// +build ignore
-
 // Command releaselet does buildlet-side release construction tasks.
-// It is intended to be executed on the buildlet preparing a release.
+// It is intended to be executed on the buildlet preparing a release
+// using the version of Go to be released.
 package main
 
 import (
@@ -29,11 +27,6 @@
 )
 
 func main() {
-	if v, _ := strconv.ParseBool(os.Getenv("RUN_RELEASELET_TESTS")); v {
-		runSelfTests()
-		return
-	}
-
 	if dir := archDir(); dir != "" {
 		if err := cp("go/bin/go", "go/bin/"+dir+"/go"); err != nil {
 			log.Fatal(err)
@@ -636,26 +629,3 @@
 	"images/DialogLeft.jpg": storageBase + "windows/DialogLeft.jpg",
 	"images/gopher.ico":     storageBase + "windows/gopher.ico",
 }
-
-// runSelfTests contains the tests for this file, since this file
-// is +build ignore. This is called by releaselet_test.go with an
-// environment variable set, which func main above recognizes.
-func runSelfTests() {
-	// Test splitVersion.
-	for _, tt := range []struct {
-		v                   string
-		major, minor, patch int
-	}{
-		{"go1", 1, 0, 0},
-		{"go1.34", 1, 34, 0},
-		{"go1.34.7", 1, 34, 7},
-	} {
-		major, minor, patch := splitVersion(tt.v)
-		if major != tt.major || minor != tt.minor || patch != tt.patch {
-			log.Fatalf("splitVersion(%q) = %v, %v, %v; want %v, %v, %v",
-				tt.v, major, minor, patch, tt.major, tt.minor, tt.patch)
-		}
-	}
-
-	fmt.Println("ok")
-}
diff --git a/cmd/release/releaselet/releaselet_test.go b/cmd/release/releaselet/releaselet_test.go
new file mode 100644
index 0000000..0855052
--- /dev/null
+++ b/cmd/release/releaselet/releaselet_test.go
@@ -0,0 +1,41 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"io/ioutil"
+	"strings"
+	"testing"
+)
+
+func TestSplitVersion(t *testing.T) {
+	// Test splitVersion.
+	for _, tt := range []struct {
+		v                   string
+		major, minor, patch int
+	}{
+		{"go1", 1, 0, 0},
+		{"go1.34", 1, 34, 0},
+		{"go1.34.7", 1, 34, 7},
+	} {
+		major, minor, patch := splitVersion(tt.v)
+		if major != tt.major || minor != tt.minor || patch != tt.patch {
+			t.Errorf("splitVersion(%q) = %v, %v, %v; want %v, %v, %v",
+				tt.v, major, minor, patch, tt.major, tt.minor, tt.patch)
+		}
+	}
+}
+
+func TestSingleFile(t *testing.T) {
+	files, err := ioutil.ReadDir(".")
+	if err != nil {
+		t.Fatal(err)
+	}
+	for _, f := range files {
+		if !strings.HasSuffix(f.Name(), "_test.go") && f.Name() != "releaselet.go" {
+			t.Errorf("releaselet should be a single file, found %v", f.Name())
+		}
+	}
+}
diff --git a/cmd/release/releaselet_test.go b/cmd/release/releaselet_test.go
deleted file mode 100644
index 376814b..0000000
--- a/cmd/release/releaselet_test.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"io/ioutil"
-	"os/exec"
-	"strings"
-	"testing"
-
-	"golang.org/x/build/internal/envutil"
-)
-
-func TestReleaselet(t *testing.T) {
-	cmd := exec.Command("go", "run", "releaselet.go")
-	envutil.SetEnv(cmd, "RUN_RELEASELET_TESTS=true")
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("error running releaselet.go tests: %v, %s", err, out)
-	}
-	got := strings.TrimSpace(string(out))
-	if got != "ok" {
-		t.Errorf("got output %q; want ok", out)
-	}
-}
-
-func TestReleaseletIsUpToDate(t *testing.T) {
-	want, err := ioutil.ReadFile("releaselet.go")
-	if err != nil {
-		t.Fatalf("error while reading releaselet.go: %v", err)
-	}
-	got := []byte(releaselet)
-	if !bytes.Equal(got, want) {
-		t.Error(`The releaselet constant in static.go is stale. To see the difference, run:
-	$ go generate golang.org/x/build/cmd/release
-	$ git diff`)
-	}
-}