@@ -104,16 +104,17 @@ func (ic *imageCopier) bpcPreserveEncrypted(stream *sourceStream, _ bpDetectComp
104104
105105// bpcCompressUncompressed checks if we should be compressing an uncompressed input, and returns a *bpCompressionStepData if so.
106106func (ic * imageCopier ) bpcCompressUncompressed (stream * sourceStream , detected bpDetectCompressionStepData ) (* bpCompressionStepData , error ) {
107- if ic .c .dest .DesiredLayerCompression () == types .Compress && ! detected .isCompressed {
107+ var chosenFormat * compressiontypes.Algorithm
108+ if ic .c .compressionFormat != nil {
109+ chosenFormat = ic .c .compressionFormat
110+ } else {
111+ chosenFormat = defaultCompressionFormat
112+ }
113+ if ic .c .dest .DesiredLayerCompression () == types .Compress && ! detected .isCompressed &&
114+ ic .src .CanCompressLayer (stream .info .MediaType , chosenFormat ) {
108115 logrus .Debugf ("Compressing blob on the fly" )
109- var uploadedAlgorithm * compressiontypes.Algorithm
110- if ic .c .compressionFormat != nil {
111- uploadedAlgorithm = ic .c .compressionFormat
112- } else {
113- uploadedAlgorithm = defaultCompressionFormat
114- }
115116
116- reader , annotations := ic .c .compressedStream (stream .reader , * uploadedAlgorithm )
117+ reader , annotations := ic .c .compressedStream (stream .reader , * chosenFormat )
117118 // Note: reader must be closed on all return paths.
118119 stream .reader = reader
119120 stream .info = types.BlobInfo { // FIXME? Should we preserve more data in src.info?
@@ -122,10 +123,10 @@ func (ic *imageCopier) bpcCompressUncompressed(stream *sourceStream, detected bp
122123 }
123124 return & bpCompressionStepData {
124125 operation : types .Compress ,
125- uploadedAlgorithm : uploadedAlgorithm ,
126+ uploadedAlgorithm : chosenFormat ,
126127 uploadedAnnotations : annotations ,
127128 srcCompressorName : detected .srcCompressorName ,
128- uploadedCompressorName : uploadedAlgorithm .Name (),
129+ uploadedCompressorName : chosenFormat .Name (),
129130 closers : []io.Closer {reader },
130131 }, nil
131132 }
@@ -135,7 +136,8 @@ func (ic *imageCopier) bpcCompressUncompressed(stream *sourceStream, detected bp
135136// bpcRecompressCompressed checks if we should be recompressing a compressed input to another format, and returns a *bpCompressionStepData if so.
136137func (ic * imageCopier ) bpcRecompressCompressed (stream * sourceStream , detected bpDetectCompressionStepData ) (* bpCompressionStepData , error ) {
137138 if ic .c .dest .DesiredLayerCompression () == types .Compress && detected .isCompressed &&
138- ic .c .compressionFormat != nil && ic .c .compressionFormat .Name () != detected .format .Name () {
139+ ic .c .compressionFormat != nil && ic .c .compressionFormat .Name () != detected .format .Name () &&
140+ ic .src .CanCompressLayer (stream .info .MediaType , ic .c .compressionFormat ) {
139141 // When the blob is compressed, but the desired format is different, it first needs to be decompressed and finally
140142 // re-compressed using the desired format.
141143 logrus .Debugf ("Blob will be converted" )
@@ -173,7 +175,8 @@ func (ic *imageCopier) bpcRecompressCompressed(stream *sourceStream, detected bp
173175
174176// bpcDecompressCompressed checks if we should be decompressing a compressed input, and returns a *bpCompressionStepData if so.
175177func (ic * imageCopier ) bpcDecompressCompressed (stream * sourceStream , detected bpDetectCompressionStepData ) (* bpCompressionStepData , error ) {
176- if ic .c .dest .DesiredLayerCompression () == types .Decompress && detected .isCompressed {
178+ if ic .c .dest .DesiredLayerCompression () == types .Decompress && detected .isCompressed &&
179+ ic .src .CanDecompressLayer (stream .info .MediaType ) {
177180 logrus .Debugf ("Blob will be decompressed" )
178181 s , err := detected .decompressor (stream .reader )
179182 if err != nil {
0 commit comments