Skip to content

Commit ca5899f

Browse files
committed
cmd/release: write out windows archive as a zip
Change-Id: I1cdc305f131d1a62a94109c357e20e4f1efb3c09 Reviewed-on: https://go-review.googlesource.com/12560 Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 871e9e9 commit ca5899f

File tree

1 file changed

+83
-3
lines changed

1 file changed

+83
-3
lines changed

cmd/release/release.go

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5-
// TODO(adg): put windows release in a zip file
6-
75
// Command release builds a Go release.
86
package main
97

108
import (
119
"archive/tar"
10+
"archive/zip"
1211
"bytes"
1312
"compress/gzip"
1413
"flag"
@@ -45,6 +44,8 @@ var (
4544

4645
var coordClient *buildlet.CoordinatorClient
4746

47+
const releaselet = "releaselet.go"
48+
4849
func main() {
4950
flag.Parse()
5051

@@ -55,6 +56,10 @@ func main() {
5556
return
5657
}
5758

59+
if _, err := os.Stat(releaselet); err != nil {
60+
log.Fatalf("couldn't locate %q: %v", releaselet, err)
61+
}
62+
5863
if *rev == "" {
5964
log.Fatal("must specify -rev flag")
6065
}
@@ -355,7 +360,6 @@ func (b *Build) make() error {
355360

356361
b.logf("Pushing and running releaselet.")
357362
// TODO(adg): locate releaselet.go in GOPATH
358-
const releaselet = "releaselet.go"
359363
f, err := os.Open(releaselet)
360364
if err != nil {
361365
return err
@@ -393,6 +397,9 @@ func (b *Build) make() error {
393397
return err
394398
}
395399

400+
if b.OS == "windows" {
401+
return b.fetchZip(client)
402+
}
396403
return b.fetchTarball(client)
397404
}
398405

@@ -406,6 +413,79 @@ func (b *Build) fetchTarball(client *buildlet.Client) error {
406413
return b.writeFile(filename, tgz)
407414
}
408415

416+
func (b *Build) fetchZip(client *buildlet.Client) error {
417+
b.logf("Downloading tarball and re-compressing as zip.")
418+
419+
tgz, err := client.GetTar(".")
420+
if err != nil {
421+
return err
422+
}
423+
defer tgz.Close()
424+
425+
filename := *version + "." + b.String() + ".zip"
426+
f, err := os.Create(filename)
427+
if err != nil {
428+
return err
429+
}
430+
if err := tgzToZip(f, tgz); err != nil {
431+
f.Close()
432+
return err
433+
}
434+
if err := f.Close(); err != nil {
435+
return err
436+
}
437+
438+
b.logf("Wrote %q.", filename)
439+
return nil
440+
}
441+
442+
func tgzToZip(w io.Writer, r io.Reader) error {
443+
zr, err := gzip.NewReader(r)
444+
if err != nil {
445+
return err
446+
}
447+
tr := tar.NewReader(zr)
448+
449+
zw := zip.NewWriter(w)
450+
for {
451+
th, err := tr.Next()
452+
if err == io.EOF {
453+
break
454+
}
455+
if err != nil {
456+
return err
457+
}
458+
fi := th.FileInfo()
459+
zh, err := zip.FileInfoHeader(fi)
460+
if err != nil {
461+
return err
462+
}
463+
zh.Name = th.Name // for the full path
464+
switch strings.ToLower(path.Ext(zh.Name)) {
465+
case ".jpg", ".jpeg", ".png", ".gif":
466+
// Don't re-compress already compressed files.
467+
zh.Method = zip.Store
468+
default:
469+
zh.Method = zip.Deflate
470+
}
471+
if fi.IsDir() {
472+
zh.Name += "/" // zip prefers a trailing slash
473+
zh.Method = zip.Store
474+
}
475+
w, err := zw.CreateHeader(zh)
476+
if err != nil {
477+
return err
478+
}
479+
if fi.IsDir() {
480+
continue
481+
}
482+
if _, err := io.Copy(w, tr); err != nil {
483+
return err
484+
}
485+
}
486+
return zw.Close()
487+
}
488+
409489
// fetchFile fetches the specified directory from the given buildlet, and
410490
// writes the first file it finds in that directory to dest.
411491
func (b *Build) fetchFile(client *buildlet.Client, dest, dir string) error {

0 commit comments

Comments
 (0)