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 }