|
|
|
@ -209,6 +209,26 @@ func extractTarGz(r io.Reader, targetDir string) error {
|
|
|
|
return extractTar(gzr, targetDir)
|
|
|
|
return extractTar(gzr, targetDir)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// extractFile creates a single file from the tar archive
|
|
|
|
|
|
|
|
func extractFile(path string, mode int64, src io.Reader) error {
|
|
|
|
|
|
|
|
dir := filepath.Dir(path)
|
|
|
|
|
|
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
outFile, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, os.FileMode(mode))
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer outFile.Close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if _, err := io.Copy(outFile, src); err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// extractTar extracts a tar archive to a directory
|
|
|
|
// extractTar extracts a tar archive to a directory
|
|
|
|
func extractTar(r io.Reader, targetDir string) error {
|
|
|
|
func extractTar(r io.Reader, targetDir string) error {
|
|
|
|
tarReader := tar.NewReader(r)
|
|
|
|
tarReader := tar.NewReader(r)
|
|
|
|
@ -233,17 +253,7 @@ func extractTar(r io.Reader, targetDir string) error {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case tar.TypeReg:
|
|
|
|
case tar.TypeReg:
|
|
|
|
dir := filepath.Dir(path)
|
|
|
|
if err := extractFile(path, header.Mode, tarReader); err != nil {
|
|
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
outFile, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer outFile.Close()
|
|
|
|
|
|
|
|
if _, err := io.Copy(outFile, tarReader); err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case tar.TypeXGlobalHeader, tar.TypeXHeader:
|
|
|
|
case tar.TypeXGlobalHeader, tar.TypeXHeader:
|
|
|
|
|