func ExtractFileFromCompressedTar()

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")
}