func Unzip()

in openwhisk/zip.go [58:109]


func Unzip(src []byte, dest string) error {
	r := openZip(src)
	os.MkdirAll(dest, 0755)
	// Closure to address file descriptors issue with all the deferred .Close() methods
	extractAndWriteFile := func(f *zip.File) error {

		path := filepath.Join(dest, f.Name)
		isLink := f.FileInfo().Mode()&os.ModeSymlink == os.ModeSymlink

		// dir
		if f.FileInfo().IsDir() && !isLink {
			return os.MkdirAll(path, f.Mode())
		}

		// open file
		rc, err := f.Open()
		if err != nil {
			return err
		}
		defer rc.Close()

		// link
		if isLink {
			buf, err := ioutil.ReadAll(rc)
			if err != nil {
				return err
			}
			return os.Symlink(string(buf), path)
		}

		// file
		// eventually create a missing ddir
		err = os.MkdirAll(filepath.Dir(path), 0755)
		if err != nil {
			return err
		}
		file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
		if err != nil {
			return err
		}
		defer file.Close()
		_, err = io.Copy(file, rc)
		return err
	}
	for _, f := range r.File {
		err := extractAndWriteFile(f)
		if err != nil {
			log.Println(err)
		}
	}
	return nil
}