func zipPath()

in cft/pkg/util.go [49:108]


func zipPath(root string) (string, error) {
	tmpFile, err := ioutil.TempFile(os.TempDir(), "*.zip")
	if err != nil {
		return "", err
	}
	defer tmpFile.Close()

	w := zip.NewWriter(tmpFile)
	defer w.Close()

	zRoot := root
	info, err := os.Stat(zRoot)
	if err != nil {
		return "", err
	}
	if !info.IsDir() {
		zRoot = filepath.Dir(zRoot)
	}

	err = filepath.Walk(root, func(path string, info fs.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if !info.Mode().IsRegular() {
			return nil
		}

		in, err := os.Open(path)
		if err != nil {
			return err
		}
		defer in.Close()

		zPath, err := filepath.Rel(zRoot, path)
		if err != nil {
			return err
		}

		zPath = filepath.ToSlash(zPath)

		fh, err := zip.FileInfoHeader(info)
		if err != nil {
			return err
		}

		fh.Name = zPath
		fh.Method = zip.Deflate

		out, err := w.CreateHeader(fh)
		if err != nil {
			return err
		}

		_, err = io.Copy(out, in)
		return err
	})

	return tmpFile.Name(), err
}