bpcRecompressCompressed checks if we should be recompressing a compressed input to another format, and returns a *bpCompressionStepData if so.
(stream *sourceStream, detected bpDetectCompressionStepData)
| 189 | |
| 190 | // bpcRecompressCompressed checks if we should be recompressing a compressed input to another format, and returns a *bpCompressionStepData if so. |
| 191 | func (ic *imageCopier) bpcRecompressCompressed(stream *sourceStream, detected bpDetectCompressionStepData) (*bpCompressionStepData, error) { |
| 192 | if ic.c.dest.DesiredLayerCompression() == types.Compress && detected.isCompressed && |
| 193 | ic.compressionFormat != nil && |
| 194 | (ic.compressionFormat.Name() != detected.format.Name() && ic.compressionFormat.Name() != detected.format.BaseVariantName()) { |
| 195 | // When the blob is compressed, but the desired format is different, it first needs to be decompressed and finally |
| 196 | // re-compressed using the desired format. |
| 197 | logrus.Debugf("Blob will be converted") |
| 198 | |
| 199 | decompressed, err := detected.decompressor(stream.reader) |
| 200 | if err != nil { |
| 201 | return nil, err |
| 202 | } |
| 203 | succeeded := false |
| 204 | defer func() { |
| 205 | if !succeeded { |
| 206 | decompressed.Close() |
| 207 | } |
| 208 | }() |
| 209 | |
| 210 | recompressed, annotations := ic.compressedStream(decompressed, *ic.compressionFormat) |
| 211 | // Note: recompressed must be closed on all return paths. |
| 212 | stream.reader = recompressed |
| 213 | stream.info = types.BlobInfo{ // FIXME? Should we preserve more data in src.info? Notably the current approach correctly removes zstd:chunked metadata annotations. |
| 214 | Digest: "", |
| 215 | Size: -1, |
| 216 | } |
| 217 | specificVariantName := ic.compressionFormat.Name() |
| 218 | if specificVariantName == ic.compressionFormat.BaseVariantName() { |
| 219 | specificVariantName = internalblobinfocache.UnknownCompression |
| 220 | } |
| 221 | succeeded = true |
| 222 | return &bpCompressionStepData{ |
| 223 | operation: bpcOpRecompressCompressed, |
| 224 | uploadedOperation: types.PreserveOriginal, |
| 225 | uploadedAlgorithm: ic.compressionFormat, |
| 226 | uploadedAnnotations: annotations, |
| 227 | srcCompressorBaseVariantName: detected.srcCompressorBaseVariantName, |
| 228 | uploadedCompressorBaseVariantName: ic.compressionFormat.BaseVariantName(), |
| 229 | uploadedCompressorSpecificVariantName: specificVariantName, |
| 230 | closers: []io.Closer{decompressed, recompressed}, |
| 231 | }, nil |
| 232 | } |
| 233 | return nil, nil |
| 234 | } |
| 235 | |
| 236 | // bpcDecompressCompressed checks if we should be decompressing a compressed input, and returns a *bpCompressionStepData if so. |
| 237 | func (ic *imageCopier) bpcDecompressCompressed(stream *sourceStream, detected bpDetectCompressionStepData) (*bpCompressionStepData, error) { |
nothing calls this directly
no test coverage detected