1package getter 2 3import ( 4 "compress/gzip" 5 "fmt" 6 "os" 7 "path/filepath" 8) 9 10// TarGzipDecompressor is an implementation of Decompressor that can 11// decompress tar.gzip files. 12type TarGzipDecompressor struct{} 13 14func (d *TarGzipDecompressor) Decompress(dst, src string, dir bool, umask os.FileMode) error { 15 // If we're going into a directory we should make that first 16 mkdir := dst 17 if !dir { 18 mkdir = filepath.Dir(dst) 19 } 20 if err := os.MkdirAll(mkdir, mode(0755, umask)); err != nil { 21 return err 22 } 23 24 // File first 25 f, err := os.Open(src) 26 if err != nil { 27 return err 28 } 29 defer f.Close() 30 31 // Gzip compression is second 32 gzipR, err := gzip.NewReader(f) 33 if err != nil { 34 return fmt.Errorf("Error opening a gzip reader for %s: %s", src, err) 35 } 36 defer gzipR.Close() 37 38 return untar(gzipR, dst, src, dir, umask) 39} 40