package Archive import ( "archive/tar" "compress/gzip" "io" "io/fs" "os" "path/filepath" "strings" ) func UnGzip(source, target string) error { var ( reader, writer *os.File archive *gzip.Reader e error ) reader, e = os.Open(source) if e != nil { return e } defer reader.Close() archive, e = gzip.NewReader(reader) if e != nil { return e } defer archive.Close() target = filepath.Join(target, archive.Name) writer, e = os.Create(target) if e != nil { return e } defer writer.Close() _, e = io.Copy(writer, archive) return e } func Untar(tarball, target string) error { var ( reader *os.File tarReader *tar.Reader header *tar.Header info fs.FileInfo file *os.File path string e error ) reader, e = os.Open(tarball) if e != nil { return e } defer reader.Close() tarReader = tar.NewReader(reader) for { header, e = tarReader.Next() if e == io.EOF { break } if e != nil { return e } path = "/" + strings.Join(strings.Split(header.Name, "/")[1:], "/") info = header.FileInfo() if info.IsDir() { e = os.MkdirAll(path, info.Mode()) if e != nil { return e } continue } file, e = os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode()) if e != nil { return e } defer file.Close() _, e = io.Copy(file, tarReader) if e != nil { return e } } return nil } func UntarGzip(source, target string) error { var ( tarPath string = strings.ReplaceAll(source, ".gz", "") e error ) e = UnGzip(source, tarPath) if e != nil { return e } return Untar(tarPath, target) }