diff --git a/utils/extract_utils.go b/utils/extract_utils.go index 636fde1..6c51928 100644 --- a/utils/extract_utils.go +++ b/utils/extract_utils.go @@ -7,12 +7,16 @@ import ( "os" ) -func ReadTarballContent(tarballPath, fileToExtract string) ([]byte, error) { +type TarballFileReader struct { + tarReader *tar.Reader + file *os.File +} + +func ReadTarballContent(tarballPath, fileToExtract string) (*TarballFileReader, error) { file, err := os.Open(tarballPath) if err != nil { return nil, err } - defer file.Close() tr := tar.NewReader(file) for { @@ -28,11 +32,10 @@ func ReadTarballContent(tarballPath, fileToExtract string) ([]byte, error) { return nil, errors.New("file to extract must be a regular file") } - bytes, err := io.ReadAll(tr) - if err != nil { - return nil, err - } - return bytes, nil + return &TarballFileReader{ + tarReader: tr, + file: file, + }, nil } } diff --git a/utils/package_utils.go b/utils/package_utils.go index a775c27..4ec43f6 100644 --- a/utils/package_utils.go +++ b/utils/package_utils.go @@ -2,7 +2,6 @@ package utils import ( "archive/tar" - "bytes" "compress/gzip" "errors" "fmt" @@ -488,18 +487,19 @@ func extractPackage(bpmpkg *BPMPackage, verbose bool, filename, rootDir string) return err, nil } - content, err := ReadTarballContent(filename, "files.tar.gz") + tarballFile, err := ReadTarballContent(filename, "files.tar.gz") if err != nil { return err, nil } + defer tarballFile.file.Close() - archive, err := gzip.NewReader(bytes.NewReader(content)) + archive, err := gzip.NewReader(tarballFile.tarReader) if err != nil { return err, nil } - tr := tar.NewReader(archive) + packageFilesReader := tar.NewReader(archive) for { - header, err := tr.Next() + header, err := packageFilesReader.Next() if err == io.EOF { break } @@ -559,7 +559,7 @@ func extractPackage(bpmpkg *BPMPackage, verbose bool, filename, rootDir string) if err != nil { return err, nil } - if _, err := io.Copy(outFile, tr); err != nil { + if _, err := io.Copy(outFile, packageFilesReader); err != nil { return err, nil } if err := os.Chmod(extractFilename, header.FileInfo().Mode()); err != nil { @@ -1119,12 +1119,14 @@ func InstallPackage(filename, rootDir string, verbose, force, binaryPkgFromSrc, if err != nil { return err } - bs, err := ReadTarballContent(filename, "pkg.files") + + tarballFile, err := ReadTarballContent(filename, "pkg.files") if err != nil { return err } - _, err = f.Write(bs) - err = f.Close() + defer tarballFile.file.Close() + + _, err = io.Copy(f, tarballFile.tarReader) if err != nil { return err }