8
8
"compress/bzip2"
9
9
"compress/gzip"
10
10
"context"
11
- "encoding/binary"
12
11
"errors"
13
12
"fmt"
14
13
"io"
@@ -27,6 +26,8 @@ import (
27
26
"github.com/moby/patternmatcher"
28
27
"github.com/moby/sys/sequential"
29
28
"github.com/moby/sys/user"
29
+
30
+ "github.com/moby/go-archive/compression"
30
31
)
31
32
32
33
// ImpliedDirectoryMode represents the mode (Unix permissions) applied to directories that are implied by files in a
@@ -43,7 +44,9 @@ const ImpliedDirectoryMode = 0o755
43
44
44
45
type (
45
46
// Compression is the state represents if compressed or not.
46
- Compression int
47
+ //
48
+ // Deprecated: use [compression.Compression].
49
+ Compression = compression.Compression
47
50
// WhiteoutFormat is the format of whiteouts unpacked
48
51
WhiteoutFormat int
49
52
56
59
TarOptions struct {
57
60
IncludeFiles []string
58
61
ExcludePatterns []string
59
- Compression Compression
62
+ Compression compression. Compression
60
63
NoLchown bool
61
64
IDMap user.IdentityMapping
62
65
ChownOpts * ChownOpts
@@ -100,11 +103,11 @@ func NewDefaultArchiver() *Archiver {
100
103
type breakoutError error
101
104
102
105
const (
103
- Uncompressed Compression = 0 // Uncompressed represents the uncompressed .
104
- Bzip2 Compression = 1 // Bzip2 is bzip2 compression algorithm .
105
- Gzip Compression = 2 // Gzip is gzip compression algorithm .
106
- Xz Compression = 3 // Xz is xz compression algorithm .
107
- Zstd Compression = 4 // Zstd is zstd compression algorithm .
106
+ Uncompressed = compression . None // Deprecated: use [compression.None] .
107
+ Bzip2 = compression . Bzip2 // Deprecated: use [ compression.Bzip2] .
108
+ Gzip = compression . Gzip // Deprecated: use [ compression.Gzip] .
109
+ Xz = compression . Xz // Deprecated: use [ compression.Xz] .
110
+ Zstd = compression . Zstd // Deprecated: use [ compression.Zstd] .
108
111
)
109
112
110
113
const (
@@ -130,63 +133,11 @@ func IsArchivePath(path string) bool {
130
133
return err == nil
131
134
}
132
135
133
- const (
134
- zstdMagicSkippableStart = 0x184D2A50
135
- zstdMagicSkippableMask = 0xFFFFFFF0
136
- )
137
-
138
- var (
139
- bzip2Magic = []byte {0x42 , 0x5A , 0x68 }
140
- gzipMagic = []byte {0x1F , 0x8B , 0x08 }
141
- xzMagic = []byte {0xFD , 0x37 , 0x7A , 0x58 , 0x5A , 0x00 }
142
- zstdMagic = []byte {0x28 , 0xb5 , 0x2f , 0xfd }
143
- )
144
-
145
- type matcher = func ([]byte ) bool
146
-
147
- func magicNumberMatcher (m []byte ) matcher {
148
- return func (source []byte ) bool {
149
- return bytes .HasPrefix (source , m )
150
- }
151
- }
152
-
153
- // zstdMatcher detects zstd compression algorithm.
154
- // Zstandard compressed data is made of one or more frames.
155
- // There are two frame formats defined by Zstandard: Zstandard frames and Skippable frames.
156
- // See https://datatracker.ietf.org/doc/html/rfc8878#section-3 for more details.
157
- func zstdMatcher () matcher {
158
- return func (source []byte ) bool {
159
- if bytes .HasPrefix (source , zstdMagic ) {
160
- // Zstandard frame
161
- return true
162
- }
163
- // skippable frame
164
- if len (source ) < 8 {
165
- return false
166
- }
167
- // magic number from 0x184D2A50 to 0x184D2A5F.
168
- if binary .LittleEndian .Uint32 (source [:4 ])& zstdMagicSkippableMask == zstdMagicSkippableStart {
169
- return true
170
- }
171
- return false
172
- }
173
- }
174
-
175
136
// DetectCompression detects the compression algorithm of the source.
176
- func DetectCompression (source []byte ) Compression {
177
- compressionMap := map [Compression ]matcher {
178
- Bzip2 : magicNumberMatcher (bzip2Magic ),
179
- Gzip : magicNumberMatcher (gzipMagic ),
180
- Xz : magicNumberMatcher (xzMagic ),
181
- Zstd : zstdMatcher (),
182
- }
183
- for _ , compression := range []Compression {Bzip2 , Gzip , Xz , Zstd } {
184
- fn := compressionMap [compression ]
185
- if fn (source ) {
186
- return compression
187
- }
188
- }
189
- return Uncompressed
137
+ //
138
+ // Deprecated: use [compression.Detect].
139
+ func DetectCompression (source []byte ) compression.Compression {
140
+ return compression .Detect (source )
190
141
}
191
142
192
143
func xzDecompress (ctx context.Context , archive io.Reader ) (io.ReadCloser , error ) {
@@ -278,12 +229,12 @@ func DecompressStream(archive io.Reader) (io.ReadCloser, error) {
278
229
return nil , err
279
230
}
280
231
281
- switch comp := DetectCompression (bs ); comp {
282
- case Uncompressed :
232
+ switch comp := compression . Detect (bs ); comp {
233
+ case compression . None :
283
234
return & readCloserWrapper {
284
235
Reader : buf ,
285
236
}, nil
286
- case Gzip :
237
+ case compression . Gzip :
287
238
ctx , cancel := context .WithCancel (context .Background ())
288
239
289
240
gzReader , err := gzDecompress (ctx , buf )
@@ -298,12 +249,12 @@ func DecompressStream(archive io.Reader) (io.ReadCloser, error) {
298
249
return gzReader .Close ()
299
250
},
300
251
}, nil
301
- case Bzip2 :
252
+ case compression . Bzip2 :
302
253
bz2Reader := bzip2 .NewReader (buf )
303
254
return & readCloserWrapper {
304
255
Reader : bz2Reader ,
305
256
}, nil
306
- case Xz :
257
+ case compression . Xz :
307
258
ctx , cancel := context .WithCancel (context .Background ())
308
259
309
260
xzReader , err := xzDecompress (ctx , buf )
@@ -319,7 +270,7 @@ func DecompressStream(archive io.Reader) (io.ReadCloser, error) {
319
270
return xzReader .Close ()
320
271
},
321
272
}, nil
322
- case Zstd :
273
+ case compression . Zstd :
323
274
zstdReader , err := zstd .NewReader (buf )
324
275
if err != nil {
325
276
return nil , err
@@ -343,13 +294,13 @@ type nopWriteCloser struct {
343
294
func (nopWriteCloser ) Close () error { return nil }
344
295
345
296
// CompressStream compresses the dest with specified compression algorithm.
346
- func CompressStream (dest io.Writer , comp Compression ) (io.WriteCloser , error ) {
297
+ func CompressStream (dest io.Writer , comp compression. Compression ) (io.WriteCloser , error ) {
347
298
switch comp {
348
- case Uncompressed :
299
+ case compression . None :
349
300
return nopWriteCloser {dest }, nil
350
- case Gzip :
301
+ case compression . Gzip :
351
302
return gzip .NewWriter (dest ), nil
352
- case Bzip2 , Xz :
303
+ case compression . Bzip2 , compression . Xz :
353
304
// archive/bzip2 does not support writing, and there is no xz support at all
354
305
// However, this is not a problem as docker only currently generates gzipped tars
355
306
return nil , fmt .Errorf ("unsupported compression format: %s" , (& comp ).Extension ())
@@ -446,23 +397,6 @@ func ReplaceFileTarWrapper(inputTarStream io.ReadCloser, mods map[string]TarModi
446
397
return pipeReader
447
398
}
448
399
449
- // Extension returns the extension of a file that uses the specified compression algorithm.
450
- func (c * Compression ) Extension () string {
451
- switch * c {
452
- case Uncompressed :
453
- return "tar"
454
- case Bzip2 :
455
- return "tar.bz2"
456
- case Gzip :
457
- return "tar.gz"
458
- case Xz :
459
- return "tar.xz"
460
- case Zstd :
461
- return "tar.zst"
462
- }
463
- return ""
464
- }
465
-
466
400
// assert that we implement [tar.FileInfoNames].
467
401
var _ tar.FileInfoNames = (* nosysFileInfo )(nil )
468
402
@@ -894,7 +828,7 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, o
894
828
895
829
// Tar creates an archive from the directory at `path`, and returns it as a
896
830
// stream of bytes.
897
- func Tar (path string , comp Compression ) (io.ReadCloser , error ) {
831
+ func Tar (path string , comp compression. Compression ) (io.ReadCloser , error ) {
898
832
return TarWithOptions (path , & TarOptions {Compression : comp })
899
833
}
900
834
@@ -1322,7 +1256,7 @@ func untarHandler(tarArchive io.Reader, dest string, options *TarOptions, decomp
1322
1256
// TarUntar is a convenience function which calls Tar and Untar, with the output of one piped into the other.
1323
1257
// If either Tar or Untar fails, TarUntar aborts and returns the error.
1324
1258
func (archiver * Archiver ) TarUntar (src , dst string ) error {
1325
- archive , err := Tar (src , Uncompressed )
1259
+ archive , err := Tar (src , compression . None )
1326
1260
if err != nil {
1327
1261
return err
1328
1262
}
0 commit comments