...

Source file src/github.com/thlib/go-timezone-local/tzdata/gz.go

Documentation: github.com/thlib/go-timezone-local/tzdata

     1  package tzdata
     2  
     3  import (
     4  	"archive/tar"
     5  	"compress/gzip"
     6  	"fmt"
     7  	"io"
     8  )
     9  
    10  func ExtractTarGz(src io.Reader, dst io.Writer, name string) error {
    11  	uncompressedStream, err := gzip.NewReader(src)
    12  	if err != nil {
    13  		return fmt.Errorf("ExtractTarGz: NewReader failed")
    14  	}
    15  
    16  	tarReader := tar.NewReader(uncompressedStream)
    17  
    18  	for {
    19  		header, err := tarReader.Next()
    20  
    21  		if err == io.EOF {
    22  			return nil
    23  		}
    24  
    25  		if err != nil {
    26  			return fmt.Errorf("ExtractTarGz: Next() failed: %w", err)
    27  		}
    28  
    29  		switch header.Typeflag {
    30  		case tar.TypeDir:
    31  			return fmt.Errorf("ExtractTarGz: directories are not supported: %w", err)
    32  		case tar.TypeReg:
    33  			if header.Name == name {
    34  				if _, err := io.Copy(dst, tarReader); err != nil {
    35  					return fmt.Errorf("ExtractTarGz: Copy() failed: %w", err)
    36  				}
    37  				return nil
    38  			}
    39  		default:
    40  			return fmt.Errorf("ExtractTarGz: uknown type: %v in %v", header.Typeflag, header.Name)
    41  		}
    42  	}
    43  }
    44  

View as plain text