|
@@ -115,15 +115,18 @@ func v0TarHeaderSelect(h *tar.Header) (orderedHeaders [][2]string) {
|
|
|
|
|
|
func v1TarHeaderSelect(h *tar.Header) (orderedHeaders [][2]string) {
|
|
func v1TarHeaderSelect(h *tar.Header) (orderedHeaders [][2]string) {
|
|
// Get extended attributes.
|
|
// Get extended attributes.
|
|
- xAttrKeys := make([]string, len(h.Xattrs))
|
|
|
|
- for k := range h.Xattrs {
|
|
|
|
- xAttrKeys = append(xAttrKeys, k)
|
|
|
|
|
|
+ const paxSchilyXattr = "SCHILY.xattr."
|
|
|
|
+ var xattrs [][2]string
|
|
|
|
+ for k, v := range h.PAXRecords {
|
|
|
|
+ if xattr, ok := strings.CutPrefix(k, paxSchilyXattr); ok {
|
|
|
|
+ xattrs = append(xattrs, [2]string{xattr, v})
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- sort.Strings(xAttrKeys)
|
|
|
|
|
|
+ sort.Slice(xattrs, func(i, j int) bool { return xattrs[i][0] < xattrs[j][0] })
|
|
|
|
|
|
// Make the slice with enough capacity to hold the 11 basic headers
|
|
// Make the slice with enough capacity to hold the 11 basic headers
|
|
// we want from the v0 selector plus however many xattrs we have.
|
|
// we want from the v0 selector plus however many xattrs we have.
|
|
- orderedHeaders = make([][2]string, 0, 11+len(xAttrKeys))
|
|
|
|
|
|
+ orderedHeaders = make([][2]string, 0, 11+len(xattrs))
|
|
|
|
|
|
// Copy all headers from v0 excluding the 'mtime' header (the 5th element).
|
|
// Copy all headers from v0 excluding the 'mtime' header (the 5th element).
|
|
v0headers := v0TarHeaderSelect(h)
|
|
v0headers := v0TarHeaderSelect(h)
|
|
@@ -131,9 +134,7 @@ func v1TarHeaderSelect(h *tar.Header) (orderedHeaders [][2]string) {
|
|
orderedHeaders = append(orderedHeaders, v0headers[6:]...)
|
|
orderedHeaders = append(orderedHeaders, v0headers[6:]...)
|
|
|
|
|
|
// Finally, append the sorted xattrs.
|
|
// Finally, append the sorted xattrs.
|
|
- for _, k := range xAttrKeys {
|
|
|
|
- orderedHeaders = append(orderedHeaders, [2]string{k, h.Xattrs[k]})
|
|
|
|
- }
|
|
|
|
|
|
+ orderedHeaders = append(orderedHeaders, xattrs...)
|
|
|
|
|
|
return
|
|
return
|
|
}
|
|
}
|