spiegel_podman/pkg/machine/compression/generic.go
Mario Loriedo 88af8852db Refactor machine decompress.go
Added some tests to verify that files extractions works
with different compression format.

Created a decompressor interface with 2 main methods:
  reader(): returns an io.Reader for the specific compression algorithm
  copy(): extracts the compressed file into the file provided as param

Created 5 decompressor types:
- gzip: extract gzip files
- xz: extract xz files
- zip: extract zip files
- generic: extract any other file using github.com/containers/image/v5/pkg/compression
- uncompressed: only do a copy of the file

Minor fix to the progress bar instances: added a call to bar.Abort(false)
that happens before Progress.Wait() to avoid that it hangs when a bar is
not set as completed although extraction is done.

Signed-off-by: Mario Loriedo <mario.loriedo@gmail.com>
2024-02-25 22:29:02 +01:00

54 lines
1.2 KiB
Go

package compression
import (
"io"
"os"
"github.com/containers/image/v5/pkg/compression"
"github.com/sirupsen/logrus"
)
type genericDecompressor struct {
compressedFilePath string
compressedFile *os.File
uncompressStream io.ReadCloser
}
func newGenericDecompressor(compressedFilePath string) decompressor {
return &genericDecompressor{
compressedFilePath: compressedFilePath,
}
}
func (d *genericDecompressor) srcFilePath() string {
return d.compressedFilePath
}
func (d *genericDecompressor) reader() (io.Reader, error) {
srcFile, err := os.Open(d.compressedFilePath)
if err != nil {
return nil, err
}
d.compressedFile = srcFile
return srcFile, nil
}
func (d *genericDecompressor) copy(w *os.File, r io.Reader) error {
uncompressStream, _, err := compression.AutoDecompress(r)
if err != nil {
return err
}
d.uncompressStream = uncompressStream
_, err = io.Copy(w, uncompressStream)
return err
}
func (d *genericDecompressor) close() {
if err := d.compressedFile.Close(); err != nil {
logrus.Errorf("Unable to close compressed file: %q", err)
}
if err := d.uncompressStream.Close(); err != nil {
logrus.Errorf("Unable to close uncompressed stream: %q", err)
}
}