github.com/koron/hk@v0.0.0-20150303213137-b8aeaa3ab34c/hkdist/gen.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"log"
     7  	"sync"
     8  
     9  	"github.com/heroku/hk/Godeps/_workspace/src/github.com/kr/binarydist"
    10  )
    11  
    12  func gen(args []string) {
    13  	from := release{Plat: args[1], Cmd: args[0], Ver: args[2]}
    14  	to := release{Plat: args[1], Cmd: args[0], Ver: args[3]}
    15  	genPatch(from, to)
    16  }
    17  
    18  func genPatch(a, b release) {
    19  	log.Println("genPatch", a, b)
    20  	if err := computeAndStorePatch(a, b); err != nil {
    21  		log.Println("genPatch: ", err)
    22  	} else {
    23  		log.Println("genPatch finish")
    24  	}
    25  }
    26  
    27  func computeAndStorePatch(a, b release) error {
    28  	var wg sync.WaitGroup
    29  	var ar, br io.ReadCloser
    30  	wg.Add(2)
    31  	go func() {
    32  		ar = newGzReader(fetch(s3DistURL+a.Gzname(), nil))
    33  		wg.Done()
    34  	}()
    35  	go func() {
    36  		br = newGzReader(fetch(s3DistURL+b.Gzname(), nil))
    37  		wg.Done()
    38  	}()
    39  	wg.Wait()
    40  	defer ar.Close()
    41  	defer br.Close()
    42  
    43  	patch := new(bytes.Buffer)
    44  	if err := binarydist.Diff(ar, br, patch); err != nil {
    45  		return err
    46  	}
    47  	return s3put(patch, s3PatchURL+patchFilename(a.Cmd, a.Plat, a.Ver, b.Ver))
    48  }
    49  
    50  func patchFilename(cmd, plat, from, to string) string {
    51  	return cmd + "/" + from + "/" + to + "/" + plat
    52  }