func unpackIt(a archive.Archive, src string) error { reader, writer := io.Pipe() cw := make(chan error, 1) defer close(cw) f, err := os.Open(src) if err != nil { return err } go func() { defer writer.Close() _, err = io.Copy(writer, f) if err != nil { cw <- err return } }() return a.Unpack("/tmp/extracted", reader) }
func packIt(a archive.Archive, srcs []string, dst string) (error, error) { reader, writer := io.Pipe() defer reader.Close() cw := make(chan error, 1) defer close(cw) go func() { defer writer.Close() cw <- a.Pack(srcs, writer) }() bytes, err := ioutil.ReadAll(reader) ioutil.WriteFile(dst, bytes, 0644) werr := <-cw return err, werr }
func restoreCache(src string, s storage.Storage, a archive.Archive) error { reader, writer := io.Pipe() cw := make(chan error, 1) defer close(cw) go func() { defer writer.Close() cw <- s.Get(src, writer) }() err := a.Unpack("", reader) werr := <-cw if werr != nil { return werr } return err }
func rebuildCache(srcs []string, dst string, s storage.Storage, a archive.Archive) error { log.Infof("Rebuilding cache at %s to %s", srcs, dst) reader, writer := io.Pipe() defer reader.Close() cw := make(chan error, 1) defer close(cw) go func() { defer writer.Close() cw <- a.Pack(srcs, writer) }() err := s.Put(dst, reader) werr := <-cw if werr != nil { return werr } return err }