func()

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
}