@@ -12,15 +12,17 @@ import (
12
12
"log"
13
13
"net/url"
14
14
"path"
15
+ "path/filepath"
15
16
"strings"
16
17
18
+ "github.com/klauspost/compress/zstd"
17
19
"github.com/uyuni-project/minima/util"
18
20
"golang.org/x/crypto/openpgp"
19
21
)
20
22
21
23
// common
22
24
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>
24
26
type XMLLocation struct {
25
27
Href string `xml:"href,attr"`
26
28
}
@@ -39,21 +41,21 @@ type XMLData struct {
39
41
Checksum XMLChecksum `xml:"checksum"`
40
42
}
41
43
42
- // repodata/<ID>-primary.xml.gz
44
+ // repodata/<ID>-primary.xml.<compression>
43
45
44
- // XMLMetaData maps a <metadata> tag in repodata/<ID>-primary.xml.gz
46
+ // XMLMetaData maps a <metadata> tag in repodata/<ID>-primary.xml.<compression>
45
47
type XMLMetaData struct {
46
48
Packages []XMLPackage `xml:"package"`
47
49
}
48
50
49
- // XMLPackage maps a <package> tag in repodata/<ID>-primary.xml.gz
51
+ // XMLPackage maps a <package> tag in repodata/<ID>-primary.xml.<compression>
50
52
type XMLPackage struct {
51
53
Arch string `xml:"arch"`
52
54
Location XMLLocation `xml:"location"`
53
55
Checksum XMLChecksum `xml:"checksum"`
54
56
}
55
57
56
- // XMLChecksum maps a <checksum> tag in repodata/<ID>-primary.xml.gz
58
+ // XMLChecksum maps a <checksum> tag in repodata/<ID>-primary.xml.<compression>
57
59
type XMLChecksum struct {
58
60
Type string `xml:"type,attr"`
59
61
Checksum string `xml:",cdata"`
@@ -72,7 +74,7 @@ type RepoType struct {
72
74
MetadataPath string
73
75
PackagesType string
74
76
DecodeMetadata func (io.Reader ) (XMLRepomd , error )
75
- DecodePackages func (io.Reader ) (XMLMetaData , error )
77
+ DecodePackages func (io.Reader , string ) (XMLMetaData , error )
76
78
MetadataSignatureExt string
77
79
Noarch string
78
80
}
@@ -313,19 +315,35 @@ func (e *SignatureError) Error() string {
313
315
return fmt .Sprintf ("Signature error: %s" , e .reason )
314
316
}
315
317
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 ()
322
328
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 ()
325
337
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
327
344
}
328
345
346
+
329
347
func (r * Syncer ) readChecksumMap () (checksumMap map [string ]XMLChecksum ) {
330
348
checksumMap = make (map [string ]XMLChecksum )
331
349
repomdReader , err := r .storage .NewReader (repomdPath , Permanent )
@@ -361,7 +379,8 @@ func (r *Syncer) readChecksumMap() (checksumMap map[string]XMLChecksum) {
361
379
if err != nil {
362
380
return
363
381
}
364
- primary , err := repoType .DecodePackages (primaryReader )
382
+ compType := strings .Trim (filepath .Ext (dataHref ), "." )
383
+ primary , err := repoType .DecodePackages (primaryReader , compType )
365
384
if err != nil {
366
385
return
367
386
}
@@ -380,7 +399,8 @@ func (r *Syncer) processPrimary(path string, checksumMap map[string]XMLChecksum,
380
399
if err != nil {
381
400
return
382
401
}
383
- primary , err := repoType .DecodePackages (reader )
402
+ compType := strings .Trim (filepath .Ext (path ), "." )
403
+ primary , err := repoType .DecodePackages (reader , compType )
384
404
if err != nil {
385
405
return
386
406
}
@@ -473,7 +493,7 @@ func decodeRelease(reader io.Reader) (repomd XMLRepomd, err error) {
473
493
return
474
494
}
475
495
476
- func decodePackages (reader io.Reader ) (metadata XMLMetaData , err error ) {
496
+ func decodePackages (reader io.Reader , _ string ) (metadata XMLMetaData , err error ) {
477
497
packagesEntries , err := util .ProcessPropertiesFile (reader )
478
498
if err != nil {
479
499
return
0 commit comments