func Zip()

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
}