in pkg/bundle/v2_processor.go [28:72]
func (b *bundleProcessorV2) extract(inputStream io.ReadSeeker, bundleStore Cache) (Bundle, error) {
// obtain the metadata from the bundle bytes
metadataTarReader, metadataErr := getMetadataTarReader(inputStream)
if metadataErr != nil {
return nil, metadataErr
}
// get the list of overlays from the metadata
overlays, overalysErr := getOverlays(metadataTarReader)
if overalysErr != nil {
return nil, overalysErr
}
var itemKeys []string
// for every overlay, Extract them into the bundle store
for _, overlay := range overlays.Overlays {
fmt.Printf("Processing overlay: %+v\n", overlay)
overlayReader, overlayErr := getReaderForOverlay(overlay, inputStream)
if overlayErr != nil {
return nil, overlayErr
}
tarGzExtractor := extractorFromFileName(overlayReader, overlay.FileName)
if tarGzExtractor == nil {
return nil, fmt.Errorf("cannot create extractor for overlay: %s", overlay.FileName)
}
// now, put into the bundle store, the store will take care of not extracting if it already exists
_, putError := bundleStore.Put(overlay.Sha256, tarGzExtractor)
if putError != nil {
return nil, putError
}
itemKeys = append(itemKeys, overlay.Sha256)
}
//Seek to the end of the stream to expose completion to clients monitoring progress (we might not read everything)
_, _ = inputStream.Seek(0, io.SeekEnd)
// create a new bundle with item paths
return newBundle(bundleStore, itemKeys), nil
}