dep: Update containers/image to 1d7e25b91705e4d1cddb5396baf112caeb1119f3
Signed-off-by: Andrew Pilloud <andrewpilloud@igneoussystems.com>
This commit is contained in:
parent
54c176e336
commit
de9995d5f0
84 changed files with 3091 additions and 748 deletions
67
vendor/github.com/containers/image/pkg/compression/compression.go
generated
vendored
Normal file
67
vendor/github.com/containers/image/pkg/compression/compression.go
generated
vendored
Normal file
|
@ -0,0 +1,67 @@
|
|||
package compression
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/bzip2"
|
||||
"compress/gzip"
|
||||
"io"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
)
|
||||
|
||||
// DecompressorFunc returns the decompressed stream, given a compressed stream.
|
||||
type DecompressorFunc func(io.Reader) (io.Reader, error)
|
||||
|
||||
// GzipDecompressor is a DecompressorFunc for the gzip compression algorithm.
|
||||
func GzipDecompressor(r io.Reader) (io.Reader, error) {
|
||||
return gzip.NewReader(r)
|
||||
}
|
||||
|
||||
// Bzip2Decompressor is a DecompressorFunc for the bzip2 compression algorithm.
|
||||
func Bzip2Decompressor(r io.Reader) (io.Reader, error) {
|
||||
return bzip2.NewReader(r), nil
|
||||
}
|
||||
|
||||
// XzDecompressor is a DecompressorFunc for the xz compression algorithm.
|
||||
func XzDecompressor(r io.Reader) (io.Reader, error) {
|
||||
return nil, errors.New("Decompressing xz streams is not supported")
|
||||
}
|
||||
|
||||
// compressionAlgos is an internal implementation detail of DetectCompression
|
||||
var compressionAlgos = map[string]struct {
|
||||
prefix []byte
|
||||
decompressor DecompressorFunc
|
||||
}{
|
||||
"gzip": {[]byte{0x1F, 0x8B, 0x08}, GzipDecompressor}, // gzip (RFC 1952)
|
||||
"bzip2": {[]byte{0x42, 0x5A, 0x68}, Bzip2Decompressor}, // bzip2 (decompress.c:BZ2_decompress)
|
||||
"xz": {[]byte{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}, XzDecompressor}, // xz (/usr/share/doc/xz/xz-file-format.txt)
|
||||
}
|
||||
|
||||
// DetectCompression returns a DecompressorFunc if the input is recognized as a compressed format, nil otherwise.
|
||||
// Because it consumes the start of input, other consumers must use the returned io.Reader instead to also read from the beginning.
|
||||
func DetectCompression(input io.Reader) (DecompressorFunc, io.Reader, error) {
|
||||
buffer := [8]byte{}
|
||||
|
||||
n, err := io.ReadAtLeast(input, buffer[:], len(buffer))
|
||||
if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
|
||||
// This is a “real” error. We could just ignore it this time, process the data we have, and hope that the source will report the same error again.
|
||||
// Instead, fail immediately with the original error cause instead of a possibly secondary/misleading error returned later.
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
var decompressor DecompressorFunc
|
||||
for name, algo := range compressionAlgos {
|
||||
if bytes.HasPrefix(buffer[:n], algo.prefix) {
|
||||
logrus.Debugf("Detected compression format %s", name)
|
||||
decompressor = algo.decompressor
|
||||
break
|
||||
}
|
||||
}
|
||||
if decompressor == nil {
|
||||
logrus.Debugf("No compression detected")
|
||||
}
|
||||
|
||||
return decompressor, io.MultiReader(bytes.NewReader(buffer[:n]), input), nil
|
||||
}
|
86
vendor/github.com/containers/image/pkg/compression/compression_test.go
generated
vendored
Normal file
86
vendor/github.com/containers/image/pkg/compression/compression_test.go
generated
vendored
Normal file
|
@ -0,0 +1,86 @@
|
|||
package compression
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestDetectCompression(t *testing.T) {
|
||||
cases := []struct {
|
||||
filename string
|
||||
unimplemented bool
|
||||
}{
|
||||
{"fixtures/Hello.uncompressed", false},
|
||||
{"fixtures/Hello.gz", false},
|
||||
{"fixtures/Hello.bz2", false},
|
||||
{"fixtures/Hello.xz", true},
|
||||
}
|
||||
|
||||
// The original stream is preserved.
|
||||
for _, c := range cases {
|
||||
originalContents, err := ioutil.ReadFile(c.filename)
|
||||
require.NoError(t, err, c.filename)
|
||||
|
||||
stream, err := os.Open(c.filename)
|
||||
require.NoError(t, err, c.filename)
|
||||
defer stream.Close()
|
||||
|
||||
_, updatedStream, err := DetectCompression(stream)
|
||||
require.NoError(t, err, c.filename)
|
||||
|
||||
updatedContents, err := ioutil.ReadAll(updatedStream)
|
||||
require.NoError(t, err, c.filename)
|
||||
assert.Equal(t, originalContents, updatedContents, c.filename)
|
||||
}
|
||||
|
||||
// The correct decompressor is chosen, and the result is as expected.
|
||||
for _, c := range cases {
|
||||
stream, err := os.Open(c.filename)
|
||||
require.NoError(t, err, c.filename)
|
||||
defer stream.Close()
|
||||
|
||||
decompressor, updatedStream, err := DetectCompression(stream)
|
||||
require.NoError(t, err, c.filename)
|
||||
|
||||
var uncompressedStream io.Reader
|
||||
switch {
|
||||
case decompressor == nil:
|
||||
uncompressedStream = updatedStream
|
||||
case c.unimplemented:
|
||||
_, err := decompressor(updatedStream)
|
||||
assert.Error(t, err)
|
||||
continue
|
||||
default:
|
||||
s, err := decompressor(updatedStream)
|
||||
require.NoError(t, err)
|
||||
uncompressedStream = s
|
||||
}
|
||||
|
||||
uncompressedContents, err := ioutil.ReadAll(uncompressedStream)
|
||||
require.NoError(t, err, c.filename)
|
||||
assert.Equal(t, []byte("Hello"), uncompressedContents, c.filename)
|
||||
}
|
||||
|
||||
// Empty input is handled reasonably.
|
||||
decompressor, updatedStream, err := DetectCompression(bytes.NewReader([]byte{}))
|
||||
require.NoError(t, err)
|
||||
assert.Nil(t, decompressor)
|
||||
updatedContents, err := ioutil.ReadAll(updatedStream)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []byte{}, updatedContents)
|
||||
|
||||
// Error reading input
|
||||
reader, writer := io.Pipe()
|
||||
defer reader.Close()
|
||||
writer.CloseWithError(errors.New("Expected error reading input in DetectCompression"))
|
||||
_, _, err = DetectCompression(reader)
|
||||
assert.Error(t, err)
|
||||
}
|
BIN
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.bz2
generated
vendored
Normal file
BIN
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.bz2
generated
vendored
Normal file
Binary file not shown.
BIN
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.gz
generated
vendored
Normal file
BIN
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.gz
generated
vendored
Normal file
Binary file not shown.
1
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.uncompressed
generated
vendored
Normal file
1
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.uncompressed
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
Hello
|
BIN
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.xz
generated
vendored
Normal file
BIN
vendor/github.com/containers/image/pkg/compression/fixtures/Hello.xz
generated
vendored
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue