//go:build linux || freebsd // +build linux freebsd package archive import ( "compress/gzip" "fmt" "io" ) type tarGzExtractor struct { *BaseExtractor tar *tarExtractor } func NewTarGzExtractor() *tarGzExtractor { return &tarGzExtractor{ BaseExtractor: NewBaseExtractor("tar.gz", []string{".tar.gz", ".tgz"}), tar: NewTarExtractor(), } } // Extract extracts a tar.gz archive into destDir func (t *tarGzExtractor) Extract(r io.Reader, destDir string) error { // Step 1: Create gzip reader for decompression gzr, err := gzip.NewReader(r) if err != nil { return fmt.Errorf("failed to create gzip reader: %w", err) } defer func() { if cerr := gzr.Close(); cerr != nil && err == nil { err = cerr } }() // Step 2: Extract tar from decompressed stream // gzr implements io.Reader that returns DECOMPRESSED data return t.tar.Extract(gzr, destDir) } func init() { Register(NewTarGzExtractor()) }