in integration/create_server.go [140:193]
func extractTarGz(src string) (string, error) {
var rootPath string
isRootDir := true
file, err := os.Open(src)
if err != nil {
return "", fmt.Errorf("error opening archive file: %v", err.Error())
}
defer file.Close()
reader, err := gzip.NewReader(file)
if err != nil {
return "", fmt.Errorf("error creating gzip reader: %v", err.Error())
}
tarReader := tar.NewReader(reader)
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
return "", fmt.Errorf("error reading from tar archive: %s", err.Error())
}
switch header.Typeflag {
case tar.TypeDir:
if isRootDir {
rootPath = getRootFromPath(header.Name)
isRootDir = false
}
if err := os.MkdirAll(header.Name, os.ModePerm); err != nil {
return "", fmt.Errorf("mkdir failed: %s", err.Error())
}
case tar.TypeReg:
if err = ensureBaseDir(header.Name); err != nil {
return "", fmt.Errorf("error creating file from tar header: %s", err.Error())
}
outFile, err := os.Create(header.Name)
if err != nil {
return "", fmt.Errorf("error creating file from tar header: %s", err.Error())
}
if _, err = io.Copy(outFile, tarReader); err != nil {
return "", fmt.Errorf("error copying file from archive: %s", err.Error())
}
outFile.Close()
default:
return "", fmt.Errorf("unknown header type detected while extracting from archive %s", src)
}
}
return rootPath, nil
}