cmd/buildlet, cmd/release: disable pargzip for release builds

Fixes golang/go#19052

Change-Id: Icf2923ea72290bd99b78e1c2fd9675668157b3ac
Reviewed-on: https://go-review.googlesource.com/36910
Reviewed-by: Quentin Smith <quentin@golang.org>
diff --git a/buildlet/buildletclient.go b/buildlet/buildletclient.go
index 3473942..1985ce8 100644
--- a/buildlet/buildletclient.go
+++ b/buildlet/buildletclient.go
@@ -137,7 +137,8 @@
 	password       string // basic auth password or empty for none
 	remoteBuildlet string // non-empty if for remote buildlets
 
-	closeFuncs []func() // optional extra code to run on close
+	closeFuncs  []func() // optional extra code to run on close
+	releaseMode bool
 
 	ctx              context.Context
 	ctxCancel        context.CancelFunc
@@ -154,6 +155,16 @@
 	broken bool // client is broken in some way
 }
 
+// SetReleaseMode sets whether this client is being used in "release
+// mode", to prepare the final binaries to be shipped to uses. All
+// this mode does for now is disable pargzip multi-stream gzip
+// files. See golang.org/issue/19052.
+//
+// SetReleaseMode must be set before using the client.
+func (c *Client) SetReleaseMode(v bool) {
+	c.releaseMode = v
+}
+
 func (c *Client) String() string {
 	if c == nil {
 		return "(nil *buildlet.Client)"
@@ -375,7 +386,11 @@
 // GetTar returns a .tar.gz stream of the given directory, relative to the buildlet's work dir.
 // The provided dir may be empty to get everything.
 func (c *Client) GetTar(ctx context.Context, dir string) (io.ReadCloser, error) {
-	req, err := http.NewRequest("GET", c.URL()+"/tgz?dir="+url.QueryEscape(dir), nil)
+	var args string
+	if c.releaseMode {
+		args = "&pargzip=0"
+	}
+	req, err := http.NewRequest("GET", c.URL()+"/tgz?dir="+url.QueryEscape(dir)+args, nil)
 	if err != nil {
 		return nil, err
 	}
diff --git a/cmd/buildlet/buildlet.go b/cmd/buildlet/buildlet.go
index 86916f9..d3a9cac 100644
--- a/cmd/buildlet/buildlet.go
+++ b/cmd/buildlet/buildlet.go
@@ -433,7 +433,12 @@
 		http.Error(w, "bogus dir", http.StatusBadRequest)
 		return
 	}
-	zw := pargzip.NewWriter(w)
+	var zw io.WriteCloser
+	if r.FormValue("pargzip") == "0" {
+		zw = gzip.NewWriter(w)
+	} else {
+		zw = pargzip.NewWriter(w)
+	}
 	tw := tar.NewWriter(zw)
 	base := filepath.Join(*workDir, filepath.FromSlash(dir))
 	err := filepath.Walk(base, func(path string, fi os.FileInfo, err error) error {
diff --git a/cmd/release/release.go b/cmd/release/release.go
index cf64641..db34d8c 100644
--- a/cmd/release/release.go
+++ b/cmd/release/release.go
@@ -257,6 +257,7 @@
 	if err != nil {
 		return nil, err
 	}
+	bc.SetReleaseMode(true) // disable pargzip; golang.org/issue/19052
 	return bc, nil
 }