@@ -2,6 +2,7 @@ package storage
22
33import (
44 "fmt"
5+ "maps"
56 "os"
67 "path/filepath"
78 "slices"
@@ -182,18 +183,18 @@ func copyImage(i *Image) *Image {
182183 return & Image {
183184 ID : i .ID ,
184185 Digest : i .Digest ,
185- Digests : copyDigestSlice (i .Digests ),
186- Names : copyStringSlice (i .Names ),
187- NamesHistory : copyStringSlice (i .NamesHistory ),
186+ Digests : slices . Clone (i .Digests ),
187+ Names : slices . Clone (i .Names ),
188+ NamesHistory : slices . Clone (i .NamesHistory ),
188189 TopLayer : i .TopLayer ,
189- MappedTopLayers : copyStringSlice (i .MappedTopLayers ),
190+ MappedTopLayers : slices . Clone (i .MappedTopLayers ),
190191 Metadata : i .Metadata ,
191- BigDataNames : copyStringSlice (i .BigDataNames ),
192- BigDataSizes : copyStringInt64Map (i .BigDataSizes ),
193- BigDataDigests : copyStringDigestMap (i .BigDataDigests ),
192+ BigDataNames : slices . Clone (i .BigDataNames ),
193+ BigDataSizes : maps . Clone (i .BigDataSizes ),
194+ BigDataDigests : maps . Clone (i .BigDataDigests ),
194195 Created : i .Created ,
195196 ReadOnly : i .ReadOnly ,
196- Flags : copyStringInterfaceMap (i .Flags ),
197+ Flags : maps . Clone (i .Flags ),
197198 }
198199}
199200
@@ -872,7 +873,9 @@ func (r *imageStore) Delete(id string) error {
872873 delete (r .byname , name )
873874 }
874875 for _ , digest := range image .Digests {
875- prunedList := imageSliceWithoutValue (r .bydigest [digest ], image )
876+ prunedList := slices .DeleteFunc (r .bydigest [digest ], func (i * Image ) bool {
877+ return i == image
878+ })
876879 if len (prunedList ) == 0 {
877880 delete (r .bydigest , digest )
878881 } else {
@@ -967,17 +970,6 @@ func (r *imageStore) BigDataNames(id string) ([]string, error) {
967970 return copyStringSlice (image .BigDataNames ), nil
968971}
969972
970- func imageSliceWithoutValue (slice []* Image , value * Image ) []* Image {
971- modified := make ([]* Image , 0 , len (slice ))
972- for _ , v := range slice {
973- if v == value {
974- continue
975- }
976- modified = append (modified , v )
977- }
978- return modified
979- }
980-
981973// Requires startWriting.
982974func (r * imageStore ) SetBigData (id , key string , data []byte , digestManifest func ([]byte ) (digest.Digest , error )) error {
983975 if ! r .lockfile .IsReadWrite () {
@@ -1027,21 +1019,16 @@ func (r *imageStore) setBigData(image *Image, key string, data []byte, newDigest
10271019 if ! sizeOk || oldSize != image .BigDataSizes [key ] || ! digestOk || oldDigest != newDigest {
10281020 save = true
10291021 }
1030- addName := true
1031- for _ , name := range image .BigDataNames {
1032- if name == key {
1033- addName = false
1034- break
1035- }
1036- }
1037- if addName {
1022+ if ! slices .Contains (image .BigDataNames , key ) {
10381023 image .BigDataNames = append (image .BigDataNames , key )
10391024 save = true
10401025 }
10411026 for _ , oldDigest := range image .Digests {
10421027 // remove the image from the list of images in the digest-based index
10431028 if list , ok := r .bydigest [oldDigest ]; ok {
1044- prunedList := imageSliceWithoutValue (list , image )
1029+ prunedList := slices .DeleteFunc (list , func (i * Image ) bool {
1030+ return i == image
1031+ })
10451032 if len (prunedList ) == 0 {
10461033 delete (r .bydigest , oldDigest )
10471034 } else {
@@ -1056,9 +1043,7 @@ func (r *imageStore) setBigData(image *Image, key string, data []byte, newDigest
10561043 // add the image to the list of images in the digest-based index which
10571044 // corresponds to the new digest for this item, unless it's already there
10581045 list := r .bydigest [newDigest ]
1059- if len (list ) == len (imageSliceWithoutValue (list , image )) {
1060- // the list isn't shortened by trying to prune this image from it,
1061- // so it's not in there yet
1046+ if ! slices .Contains (list , image ) {
10621047 r .bydigest [newDigest ] = append (list , image )
10631048 }
10641049 }
0 commit comments