in openwhisk/zip.go [111:177]
func Zip(dir string) ([]byte, error) {
buf := new(bytes.Buffer)
zwr := zip.NewWriter(buf)
dir = filepath.Clean(dir)
err := filepath.Walk(dir, func(filePath string, info os.FileInfo, err error) error {
// trim the relevant part of the path
relPath := strings.TrimPrefix(filePath, dir)
if relPath == "" {
return nil
}
relPath = relPath[1:]
if err != nil {
return err
}
// create a proper entry
isLink := (info.Mode() & os.ModeSymlink) == os.ModeSymlink
header := &zip.FileHeader{
Name: relPath,
Method: zip.Deflate,
}
if isLink {
header.SetMode(0755 | os.ModeSymlink)
w, err := zwr.CreateHeader(header)
if err != nil {
return err
}
ln, err := os.Readlink(filePath)
if err != nil {
return err
}
w.Write([]byte(ln))
} else if info.IsDir() {
header.Name = relPath + "/"
header.SetMode(0755)
_, err := zwr.CreateHeader(header)
if err != nil {
return err
}
} else if info.Mode().IsRegular() {
header.SetMode(0755)
w, err := zwr.CreateHeader(header)
if err != nil {
return err
}
fsFile, err := os.Open(filePath)
if err != nil {
return err
}
defer fsFile.Close()
_, err = io.Copy(w, fsFile)
if err != nil {
return err
}
}
return nil
})
if err != nil {
return nil, err
}
err = zwr.Close()
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}