@@ -12,15 +12,17 @@ import (
1212 "log"
1313 "net/url"
1414 "path"
15+ "path/filepath"
1516 "strings"
1617
18+ "github.com/klauspost/compress/zstd"
1719 "github.com/uyuni-project/minima/util"
1820 "golang.org/x/crypto/openpgp"
1921)
2022
2123// common
2224
23- // XMLLocation maps a <location> tag in repodata/repomd.xml or repodata/<ID>-primary.xml.gz
25+ // XMLLocation maps a <location> tag in repodata/repomd.xml or repodata/<ID>-primary.xml.<compression>
2426type XMLLocation struct {
2527 Href string `xml:"href,attr"`
2628}
@@ -39,21 +41,21 @@ type XMLData struct {
3941 Checksum XMLChecksum `xml:"checksum"`
4042}
4143
42- // repodata/<ID>-primary.xml.gz
44+ // repodata/<ID>-primary.xml.<compression>
4345
44- // XMLMetaData maps a <metadata> tag in repodata/<ID>-primary.xml.gz
46+ // XMLMetaData maps a <metadata> tag in repodata/<ID>-primary.xml.<compression>
4547type XMLMetaData struct {
4648 Packages []XMLPackage `xml:"package"`
4749}
4850
49- // XMLPackage maps a <package> tag in repodata/<ID>-primary.xml.gz
51+ // XMLPackage maps a <package> tag in repodata/<ID>-primary.xml.<compression>
5052type XMLPackage struct {
5153 Arch string `xml:"arch"`
5254 Location XMLLocation `xml:"location"`
5355 Checksum XMLChecksum `xml:"checksum"`
5456}
5557
56- // XMLChecksum maps a <checksum> tag in repodata/<ID>-primary.xml.gz
58+ // XMLChecksum maps a <checksum> tag in repodata/<ID>-primary.xml.<compression>
5759type XMLChecksum struct {
5860 Type string `xml:"type,attr"`
5961 Checksum string `xml:",cdata"`
@@ -72,7 +74,7 @@ type RepoType struct {
7274 MetadataPath string
7375 PackagesType string
7476 DecodeMetadata func (io.Reader ) (XMLRepomd , error )
75- DecodePackages func (io.Reader ) (XMLMetaData , error )
77+ DecodePackages func (io.Reader , string ) (XMLMetaData , error )
7678 MetadataSignatureExt string
7779 Noarch string
7880}
@@ -313,19 +315,35 @@ func (e *SignatureError) Error() string {
313315 return fmt .Sprintf ("Signature error: %s" , e .reason )
314316}
315317
316- func readMetaData (reader io.Reader ) (primary XMLMetaData , err error ) {
317- gzReader , err := gzip .NewReader (reader )
318- if err != nil {
319- return
320- }
321- defer gzReader .Close ()
318+ // Uncompress and read primary XML
319+ func readMetaData (reader io.Reader , compType string ) (XMLMetaData , error ) {
320+ var primary XMLMetaData
321+ switch compType {
322+ case "gz" :
323+ reader , err := gzip .NewReader (reader )
324+ if err != nil {
325+ return primary , err
326+ }
327+ defer reader .Close ()
322328
323- decoder := xml .NewDecoder (gzReader )
324- err = decoder .Decode (& primary )
329+ decoder := xml .NewDecoder (reader )
330+ err = decoder .Decode (& primary )
331+ case "zst" :
332+ reader , err := zstd .NewReader (reader )
333+ if err != nil {
334+ return primary , err
335+ }
336+ defer reader .Close ()
325337
326- return
338+ decoder := xml .NewDecoder (reader )
339+ err = decoder .Decode (& primary )
340+ default :
341+ return primary , errors .New ("Unsupported compression type" )
342+ }
343+ return primary , nil
327344}
328345
346+
329347func (r * Syncer ) readChecksumMap () (checksumMap map [string ]XMLChecksum ) {
330348 checksumMap = make (map [string ]XMLChecksum )
331349 repomdReader , err := r .storage .NewReader (repomdPath , Permanent )
@@ -361,7 +379,8 @@ func (r *Syncer) readChecksumMap() (checksumMap map[string]XMLChecksum) {
361379 if err != nil {
362380 return
363381 }
364- primary , err := repoType .DecodePackages (primaryReader )
382+ compType := strings .Trim (filepath .Ext (dataHref ), "." )
383+ primary , err := repoType .DecodePackages (primaryReader , compType )
365384 if err != nil {
366385 return
367386 }
@@ -380,7 +399,8 @@ func (r *Syncer) processPrimary(path string, checksumMap map[string]XMLChecksum,
380399 if err != nil {
381400 return
382401 }
383- primary , err := repoType .DecodePackages (reader )
402+ compType := strings .Trim (filepath .Ext (path ), "." )
403+ primary , err := repoType .DecodePackages (reader , compType )
384404 if err != nil {
385405 return
386406 }
@@ -473,7 +493,7 @@ func decodeRelease(reader io.Reader) (repomd XMLRepomd, err error) {
473493 return
474494}
475495
476- func decodePackages (reader io.Reader ) (metadata XMLMetaData , err error ) {
496+ func decodePackages (reader io.Reader , _ string ) (metadata XMLMetaData , err error ) {
477497 packagesEntries , err := util .ProcessPropertiesFile (reader )
478498 if err != nil {
479499 return
0 commit comments