Ctrl K
ComunidadGuías…

internal/restore/restore_service.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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
		}
	}
}