This repository has been archived on 2024-03-03. You can view files and clone it, but cannot push or open issues or pull requests.
doggo-fetcher/pkg/tar.go
DataHearth 25cafd23e3
WIP
2022-06-18 22:45:29 +02:00

69 lines
1.2 KiB
Go

package pkg
import (
"archive/tar"
"compress/gzip"
"fmt"
"io"
"os"
"path/filepath"
)
func ExtractRelease(releasePath, releaseName string) (string, error) {
f, err := os.Open(releasePath)
if err != nil {
return "", err
}
defer f.Close()
gzipReader, err := gzip.NewReader(f)
if err != nil {
return "", err
}
defer gzipReader.Close()
dst, _ := filepath.Split(releasePath)
tarReader := tar.NewReader(gzipReader)
dstFolder := ""
for {
h, err := tarReader.Next()
if err != nil {
if err == io.EOF {
extractedRelease := fmt.Sprintf("%s/%s", filepath.Dir(dstFolder), releaseName)
if err := os.Rename(dstFolder, extractedRelease); err != nil {
return "", err
}
return extractedRelease, os.Remove(releasePath)
}
return "", err
}
target := filepath.Join(dst, h.Name)
if dstFolder == "" {
dstFolder = target
}
switch h.Typeflag {
case tar.TypeDir:
if err = os.MkdirAll(target, h.FileInfo().Mode()); err != nil {
return "", err
}
case tar.TypeReg:
file, err := os.OpenFile(target, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, h.FileInfo().Mode())
if err != nil {
return "", err
}
defer file.Close()
if _, err = io.Copy(file, tarReader); err != nil {
return "", err
}
}
}
}