github.com/abemedia/appcast@v0.4.0/integrations/apt/control.go (about)

     1  package apt
     2  
     3  import (
     4  	"archive/tar"
     5  	"bytes"
     6  	"io"
     7  	"path"
     8  	"strings"
     9  
    10  	"github.com/abemedia/appcast/integrations/apt/deb"
    11  	"github.com/blakesmith/ar"
    12  )
    13  
    14  func getControl(b []byte) (*Package, error) {
    15  	r := ar.NewReader(bytes.NewReader(b))
    16  
    17  	for {
    18  		h, err := r.Next()
    19  		if err != nil {
    20  			return nil, err
    21  		}
    22  		if !strings.HasPrefix(h.Name, "control.tar") {
    23  			continue
    24  		}
    25  
    26  		r, err := decompress(path.Ext(h.Name))(r)
    27  		if err != nil {
    28  			return nil, err
    29  		}
    30  		defer r.Close()
    31  
    32  		tr := tar.NewReader(r)
    33  
    34  		for {
    35  			h, err := tr.Next()
    36  			if err != nil {
    37  				return nil, err
    38  			}
    39  			if path.Base(h.Name) != "control" {
    40  				continue
    41  			}
    42  
    43  			b, err := io.ReadAll(tr)
    44  			if err != nil {
    45  				return nil, err
    46  			}
    47  			p := &Package{}
    48  			if err = deb.Unmarshal(b, p); err != nil {
    49  				return nil, err
    50  			}
    51  
    52  			return p, nil
    53  		}
    54  	}
    55  }