in tools/extract.go [34:104]
func ExtractFileFromCompressedTar(filename string, target string) error {
stream, err := os.Open(filename)
if err != nil {
return err
}
var uncompressedStream io.Reader = nil
if strings.HasSuffix(filename, ".tar.gz") || strings.HasSuffix(filename, ".tgz") {
trace("extracting gzip")
uncompressedStream, err = gzip.NewReader(stream)
if err != nil {
return err
}
}
if strings.HasSuffix(filename, ".tar.xz") {
trace("extracting xz")
uncompressedStream, err = xz.NewReader(stream, 0)
if err != nil {
return err
}
}
if strings.HasSuffix(filename, ".tar.bz2") {
trace("extracting bzip2")
uncompressedStream = bzip2.NewReader(stream)
}
if strings.HasSuffix(filename, ".tar") {
trace("extracting tar")
uncompressedStream = stream
}
tarReader := tar.NewReader(uncompressedStream)
for true {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
return err
}
switch header.Typeflag {
case tar.TypeDir:
trace("skipping dir", header.Name)
continue
case tar.TypeReg:
file := filepath.Base(header.Name)
if file == target {
trace("creating file", target)
flags := os.O_RDWR | os.O_CREATE | os.O_TRUNC
outFile, err := os.OpenFile(target, flags, 0755)
if err != nil {
return err
}
_, err = io.Copy(outFile, tarReader)
outFile.Close()
return nil
}
trace("discarding file", header.Name)
_, err = io.Copy(io.Discard, tarReader)
if err == nil {
continue
}
return err
default:
return fmt.Errorf("uknown type: %d in %s", header.Typeflag, header.Name)
}
}
return fmt.Errorf("file not found")
}