@@ -69,7 +69,7 @@ func Write(ref name.Reference, img v1.Image, w io.Writer, opts ...WriteOption) e
6969 return MultiRefWrite (map [name.Reference ]v1.Image {ref : img }, w , opts ... )
7070}
7171
72- // MultiWrite writes the contents of each image to the provided reader , in the compressed format.
72+ // MultiWrite writes the contents of each image to the provided writer , in the compressed format.
7373// The contents are written in the following format:
7474// One manifest.json file at the top level containing information about several images.
7575// One file for each layer, named after the layer's SHA.
@@ -82,7 +82,7 @@ func MultiWrite(tagToImage map[name.Tag]v1.Image, w io.Writer, opts ...WriteOpti
8282 return MultiRefWrite (refToImage , w , opts ... )
8383}
8484
85- // MultiRefWrite writes the contents of each image to the provided reader , in the compressed format.
85+ // MultiRefWrite writes the contents of each image to the provided writer , in the compressed format.
8686// The contents are written in the following format:
8787// One manifest.json file at the top level containing information about several images.
8888// One file for each layer, named after the layer's SHA.
@@ -98,12 +98,13 @@ func MultiRefWrite(refToImage map[name.Reference]v1.Image, w io.Writer, opts ...
9898 }
9999 }
100100
101- size , mBytes , err := getSizeAndManifest (refToImage )
101+ imageToTags := dedupRefToImage (refToImage )
102+ size , mBytes , err := getSizeAndManifest (imageToTags )
102103 if err != nil {
103104 return sendUpdateReturn (o , err )
104105 }
105106
106- return writeImagesToTar (refToImage , mBytes , size , w , o )
107+ return writeImagesToTar (imageToTags , mBytes , size , w , o )
107108}
108109
109110// sendUpdateReturn return the passed in error message, also sending on update channel, if it exists
@@ -125,11 +126,10 @@ func sendProgressWriterReturn(pw *progressWriter, err error) error {
125126}
126127
127128// writeImagesToTar writes the images to the tarball
128- func writeImagesToTar (refToImage map [name. Reference ] v1.Image , m []byte , size int64 , w io.Writer , o * writeOptions ) (err error ) {
129+ func writeImagesToTar (imageToTags map [v1.Image ][] string , m []byte , size int64 , w io.Writer , o * writeOptions ) (err error ) {
129130 if w == nil {
130131 return sendUpdateReturn (o , errors .New ("must pass valid writer" ))
131132 }
132- imageToTags := dedupRefToImage (refToImage )
133133
134134 tw := w
135135 var pw * progressWriter
@@ -219,9 +219,7 @@ func writeImagesToTar(refToImage map[name.Reference]v1.Image, m []byte, size int
219219}
220220
221221// calculateManifest calculates the manifest and optionally the size of the tar file
222- func calculateManifest (refToImage map [name.Reference ]v1.Image ) (m Manifest , err error ) {
223- imageToTags := dedupRefToImage (refToImage )
224-
222+ func calculateManifest (imageToTags map [v1.Image ][]string ) (m Manifest , err error ) {
225223 if len (imageToTags ) == 0 {
226224 return nil , errors .New ("set of images is empty" )
227225 }
@@ -290,12 +288,13 @@ func calculateManifest(refToImage map[name.Reference]v1.Image) (m Manifest, err
290288
291289// CalculateSize calculates the expected complete size of the output tar file
292290func CalculateSize (refToImage map [name.Reference ]v1.Image ) (size int64 , err error ) {
293- size , _ , err = getSizeAndManifest (refToImage )
291+ imageToTags := dedupRefToImage (refToImage )
292+ size , _ , err = getSizeAndManifest (imageToTags )
294293 return size , err
295294}
296295
297- func getSizeAndManifest (refToImage map [name. Reference ] v1.Image ) (int64 , []byte , error ) {
298- m , err := calculateManifest (refToImage )
296+ func getSizeAndManifest (imageToTags map [v1.Image ][] string ) (int64 , []byte , error ) {
297+ m , err := calculateManifest (imageToTags )
299298 if err != nil {
300299 return 0 , nil , fmt .Errorf ("unable to calculate manifest: %w" , err )
301300 }
@@ -304,17 +303,15 @@ func getSizeAndManifest(refToImage map[name.Reference]v1.Image) (int64, []byte,
304303 return 0 , nil , fmt .Errorf ("could not marshall manifest to bytes: %w" , err )
305304 }
306305
307- size , err := calculateTarballSize (refToImage , mBytes )
306+ size , err := calculateTarballSize (imageToTags , mBytes )
308307 if err != nil {
309308 return 0 , nil , fmt .Errorf ("error calculating tarball size: %w" , err )
310309 }
311310 return size , mBytes , nil
312311}
313312
314313// calculateTarballSize calculates the size of the tar file
315- func calculateTarballSize (refToImage map [name.Reference ]v1.Image , mBytes []byte ) (size int64 , err error ) {
316- imageToTags := dedupRefToImage (refToImage )
317-
314+ func calculateTarballSize (imageToTags map [v1.Image ][]string , mBytes []byte ) (size int64 , err error ) {
318315 seenLayerDigests := make (map [string ]struct {})
319316 for img , name := range imageToTags {
320317 manifest , err := img .Manifest ()
@@ -386,7 +383,8 @@ func writeTarEntry(tf *tar.Writer, path string, r io.Reader, size int64) error {
386383// ComputeManifest get the manifest.json that will be written to the tarball
387384// for multiple references
388385func ComputeManifest (refToImage map [name.Reference ]v1.Image ) (Manifest , error ) {
389- return calculateManifest (refToImage )
386+ imageToTags := dedupRefToImage (refToImage )
387+ return calculateManifest (imageToTags )
390388}
391389
392390// WriteOption a function option to pass to Write()
0 commit comments