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 }