internal/restore/restore_service.go
Rama main · réplica de lectura del repositorio original.
package restore
import (
"archive/tar"
"compress/gzip"
"io"
"os"
"path/filepath"
)
type RestoreService struct{}
func (restoreService RestoreService) RestoreSnapshotBundle(bundlePath string, targetDirectoryPath string) error {
bundleFile, errorValue := os.Open(bundlePath)
if errorValue != nil {
return errorValue
}
defer bundleFile.Close()
gzipReader, errorValue := gzip.NewReader(bundleFile)
if errorValue != nil {
return errorValue
}
defer gzipReader.Close()
tarReader := tar.NewReader(gzipReader)
for {
header, nextErrorValue := tarReader.Next()
if nextErrorValue == io.EOF {
return nil
}
if nextErrorValue != nil {
return nextErrorValue
}
targetPath := filepath.Join(targetDirectoryPath, header.Name)
errorValue = os.MkdirAll(filepath.Dir(targetPath), 0o755)
if errorValue != nil {
return errorValue
}
file, innerErrorValue := os.Create(targetPath)
if innerErrorValue != nil {
return innerErrorValue
}
_, innerErrorValue = io.Copy(file, tarReader)
closeErrorValue := file.Close()
if innerErrorValue != nil {
return innerErrorValue
}
if closeErrorValue != nil {
return closeErrorValue
}
}
}