Skip to content

Commit 3624968

Browse files
authored
tarball: pass imageToTags (#1563)
* tarball: godocs typo * tarball: memoize imageToTags
1 parent 9f42e02 commit 3624968

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

pkg/v1/tarball/write.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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
292290
func 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
388385
func 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

Comments
 (0)