cmd/release: move flag uses to main

As a step toward splitting cmd/release up into reusable functions, move
many flag uses to the main function. More later.

For golang/go#51797.

Change-Id: Ied7a24b432090b0dacb59184bfb4dff0035ef94a
Reviewed-on: https://go-review.googlesource.com/c/build/+/396437
Run-TryBot: Heschi Kreinick <heschi@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Alex Rakoczy <alex@golang.org>
diff --git a/cmd/release/release.go b/cmd/release/release.go
index 1d0ad1c..b38b94d 100644
--- a/cmd/release/release.go
+++ b/cmd/release/release.go
@@ -105,7 +105,10 @@
 	if !ok {
 		log.Fatalf("no such target %q in version %q", *flagTarget, *flagVersion)
 	}
-	if *flagLongTest && (*skipTests || target.BuildOnly) {
+	if *skipTests {
+		target.BuildOnly = true
+	}
+	if *flagLongTest && target.BuildOnly {
 		log.Fatalf("long testing requested, but no tests to run: skip=%v, build only=%v", *skipTests, target.BuildOnly)
 	}
 
@@ -114,7 +117,12 @@
 		Logger:  &logger{*flagTarget},
 	}
 	ctx.Printf("Start.")
-	if err := buildTarget(ctx, target, *flagLongTest); err != nil {
+	ctx.Printf("Create source archive.")
+	srcBuf := &bytes.Buffer{}
+	if err := writeSource(*rev, *flagVersion, srcBuf); err != nil {
+		log.Fatalf("Building source archive: %v", err)
+	}
+	if err := buildTarget(ctx, srcBuf, *flagVersion, target, *flagLongTest); err != nil {
 		ctx.Printf("Error: %v", err)
 		os.Exit(1)
 	} else {
@@ -190,7 +198,7 @@
 	return gzWriter.Close()
 }
 
-func buildTarget(ctx *workflow.TaskContext, target *releasetargets.Target, longTest bool) error {
+func buildTarget(ctx *workflow.TaskContext, sourceArchive io.Reader, version string, target *releasetargets.Target, longTest bool) error {
 	builder := target.Builder
 	if longTest {
 		builder = target.LongTestBuilder
@@ -220,12 +228,7 @@
 		go14   = "go1.4"
 	)
 
-	srcBuf := &bytes.Buffer{}
-	if err := writeSource(*rev, *flagVersion, srcBuf); err != nil {
-		return err
-	}
-
-	if err := client.PutTar(ctx, srcBuf, ""); err != nil {
+	if err := client.PutTar(ctx, sourceArchive, ""); err != nil {
 		return fmt.Errorf("failed to put generated source tarball: %v", err)
 	}
 
@@ -302,10 +305,13 @@
 	}
 
 	ctx.Printf("Building release tarball.")
-	stagingFile := func(ext string) string {
-		return filepath.Join(*stagingDir, *flagVersion+"."+*flagTarget+ext+".untested")
+	fileName := func(ext string) string {
+		return fmt.Sprintf("%v.%v.%v", version, target.Name, ext)
 	}
-	untestedTarballPath := stagingFile(".tar.gz")
+	stagingFileName := func(ext string) string {
+		return filepath.Join(*stagingDir, fmt.Sprintf("%v.%v.%v.untested", version, target.Name, ext))
+	}
+	untestedTarballPath := stagingFileName(".tar.gz")
 	if err := buildDistribution(ctx, client, untestedTarballPath, []adjustFunc{
 		dropRegexpMatches(dropPatterns),
 		dropUnwantedSysos(target),
@@ -357,13 +363,13 @@
 	}
 	var releases []releaseFile
 	if !target.BuildOnly && target.GOOS == "windows" {
-		untested := stagingFile(".msi")
+		untested := stagingFileName("msi")
 		if err := fetchFile(ctx, client, untested, "msi"); err != nil {
 			return err
 		}
 		releases = append(releases, releaseFile{
 			Untested: untested,
-			Final:    *flagVersion + "." + *flagTarget + ".msi",
+			Final:    fileName("msi"),
 		})
 	}
 
@@ -371,34 +377,34 @@
 	case !target.BuildOnly && target.GOOS != "windows":
 		releases = append(releases, releaseFile{
 			Untested: untestedTarballPath,
-			Final:    *flagVersion + "." + *flagTarget + ".tar.gz",
+			Final:    fileName("tar.gz"),
 		})
 	case !target.BuildOnly && target.GOOS == "windows":
-		untested := stagingFile(".zip")
+		untested := stagingFileName("zip")
 		if err := tgzToZip(untestedTarballPath, untested); err != nil {
 			return err
 		}
 		releases = append(releases, releaseFile{
 			Untested: untested,
-			Final:    *flagVersion + "." + *flagTarget + ".zip",
+			Final:    fileName("zip"),
 		})
 	case target.BuildOnly:
 		// Use an empty .test-only file to indicate the test outcome.
 		// This file gets moved from its initial location in the
 		// release-staging directory to the final release directory
 		// when the test-only build passes tests successfully.
-		untested := stagingFile(".test-only")
+		untested := stagingFileName("test-only")
 		if err := ioutil.WriteFile(untested, nil, 0600); err != nil {
 			return fmt.Errorf("writing empty test-only file: %v", err)
 		}
 		releases = append(releases, releaseFile{
 			Untested: untested,
-			Final:    *flagVersion + "." + *flagTarget + ".test-only",
+			Final:    fileName("test-only"),
 		})
 	}
 
 	// Execute build (all.bash) if running tests.
-	if *skipTests || target.BuildOnly {
+	if target.BuildOnly {
 		ctx.Printf("Skipping all.bash tests.")
 	} else {
 		if u := buildConfig.GoBootstrapURL(buildEnv); u != "" {
diff --git a/internal/releasetargets/releasetargets.go b/internal/releasetargets/releasetargets.go
index fa2316c..0d670a0 100644
--- a/internal/releasetargets/releasetargets.go
+++ b/internal/releasetargets/releasetargets.go
@@ -5,6 +5,7 @@
 package releasetargets
 
 import (
+	"fmt"
 	"sort"
 	"strings"
 
@@ -12,6 +13,7 @@
 )
 
 type Target struct {
+	Name            string
 	GOOS, GOARCH    string
 	Builder         string
 	BuildOnly       bool
@@ -29,7 +31,7 @@
 // propagated forward unless overridden. To remove a target in a later release,
 // set it to nil explicitly.
 // GOOS and GOARCH will be set automatically from the target name, but can be
-// overridden if necessary.
+// overridden if necessary. Name will also be set and should not be overriden.
 var allReleases = map[int]ReleaseTargets{
 	17: {
 		"darwin-amd64": &Target{
@@ -111,6 +113,10 @@
 func init() {
 	for _, targets := range allReleases {
 		for name, target := range targets {
+			if target.Name != "" {
+				panic(fmt.Sprintf("target.Name in %q should be left inferred", name))
+			}
+			target.Name = name
 			parts := strings.SplitN(name, "-", 2)
 			if target.GOOS == "" {
 				target.GOOS = parts[0]