cmd/releasebot: add support for security releases

Change-Id: I24f22a6101b550d459a4f4db1971e0c23ffae1d3
Reviewed-on: https://go-review.googlesource.com/c/153866
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
diff --git a/cmd/release/release.go b/cmd/release/release.go
index 4e9e289..53844bd 100644
--- a/cmd/release/release.go
+++ b/cmd/release/release.go
@@ -37,7 +37,8 @@
 	target = flag.String("target", "", "If specified, build specific target platform (e.g. 'linux-amd64'). Default is to build all.")
 	watch  = flag.Bool("watch", false, "Watch the build. Only compatible with -target")
 
-	rev       = flag.String("rev", "", "Go revision to build")
+	rev       = flag.String("rev", "", "Go revision to build, alternative to -tarball")
+	tarball   = flag.String("tarball", "", "Go tree tarball to build, alternative to -rev")
 	toolsRev  = flag.String("tools", "", "Tools revision to build")
 	tourRev   = flag.String("tour", "master", "Tour revision to include")
 	netRev    = flag.String("net", "master", "Net revision to include")
@@ -70,8 +71,8 @@
 		log.Fatalf("couldn't find releaselet source: %v", err)
 	}
 
-	if *rev == "" {
-		log.Fatal("must specify -rev flag")
+	if (*rev == "" && *tarball == "") || (*rev != "" && *tarball != "") {
+		log.Fatal("must specify one of -rev and -tarball")
 	}
 	if *toolsRev == "" {
 		log.Fatal("must specify -tools flag")
@@ -285,24 +286,38 @@
 		goPath = "gopath"
 		go14   = "go1.4"
 	)
+	if *tarball != "" {
+		tarFile, err := os.Open(*tarball)
+		if err != nil {
+			b.logf("failed to open tarball %q: %v", *tarball, err)
+			return err
+		}
+		if err := client.PutTar(tarFile, goDir); err != nil {
+			b.logf("failed to put tarball %q into dir %q: %v", *tarball, goDir, err)
+			return err
+		}
+		tarFile.Close()
+	} else {
+		tar := "https://go.googlesource.com/go/+archive/" + *rev + ".tar.gz"
+		if err := client.PutTarFromURL(tar, goDir); err != nil {
+			b.logf("failed to put tarball %q into dir %q: %v", tar, goDir, err)
+			return err
+		}
+	}
 	for _, r := range []struct {
 		repo, rev string
 	}{
-		{"go", *rev},
 		{"tools", *toolsRev},
 		{"tour", *tourRev},
 		{"net", *netRev},
 	} {
-		if b.Source && r.repo != "go" {
+		if b.Source {
 			continue
 		}
 		if r.repo == "tour" && !versionIncludesTour(*version) {
 			continue
 		}
-		dir := goDir
-		if r.repo != "go" {
-			dir = goPath + "/src/golang.org/x/" + r.repo
-		}
+		dir := goPath + "/src/golang.org/x/" + r.repo
 		tar := "https://go.googlesource.com/" + r.repo + "/+archive/" + r.rev + ".tar.gz"
 		if err := client.PutTarFromURL(tar, dir); err != nil {
 			b.logf("failed to put tarball %q into dir %q: %v", tar, dir, err)