Browse code

c8d/push: Extract shared push logic

Just a refactor of the previous commit to reduce duplication.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>

Paweł Gronowski authored on 2025/06/13 21:04:54
Showing 1 changed files
... ...
@@ -143,21 +143,6 @@ func (i *ImageService) pushRef(ctx context.Context, targetRef reference.Named, p
143 143
 	realStore := store
144 144
 	wrapped := wrapWithFakeMountableBlobs(store, mountableBlobs)
145 145
 	store = wrapped
146
-
147
-	// Annotate ref with digest to push only push tag for single digest
148
-	ref := targetRef
149
-	if _, digested := ref.(reference.Digested); !digested {
150
-		ref, err = reference.WithDigest(ref, target.Digest)
151
-		if err != nil {
152
-			return err
153
-		}
154
-	}
155
-
156
-	pusher, err := resolver.Pusher(ctx, ref.String())
157
-	if err != nil {
158
-		return err
159
-	}
160
-
161 146
 	addLayerJobs := c8dimages.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
162 147
 		if showBlobProgress(desc) {
163 148
 			jobsQueue.Add(desc)
... ...
@@ -170,7 +155,25 @@ func (i *ImageService) pushRef(ctx context.Context, targetRef reference.Named, p
170 170
 		return c8dimages.Handlers(addLayerJobs, h)
171 171
 	}
172 172
 
173
-	err = remotes.PushContent(ctx, pusher, target, store, limiter, platforms.All, handlerWrapper)
173
+	push := func(ctx context.Context, desc ocispec.Descriptor) error {
174
+		ref := targetRef
175
+
176
+		if _, digested := ref.(reference.Digested); !digested {
177
+			// Annotate ref with digest to push only push tag for single digest
178
+			ref, err = reference.WithDigest(ref, target.Digest)
179
+			if err != nil {
180
+				return err
181
+			}
182
+		}
183
+		pusher, err := resolver.Pusher(ctx, ref.String())
184
+		if err != nil {
185
+			return err
186
+		}
187
+
188
+		return remotes.PushContent(ctx, pusher, desc, store, limiter, platforms.All, handlerWrapper)
189
+	}
190
+
191
+	err = push(ctx, target)
174 192
 	if err != nil {
175 193
 		// If push failed because of a missing content, no specific platform was requested
176 194
 		// and the target is an index, select a platform-specific manifest to push instead.
... ...
@@ -186,20 +189,7 @@ func (i *ImageService) pushRef(ctx context.Context, targetRef reference.Named, p
186 186
 				orgTarget := target
187 187
 				target = newTarget
188 188
 				pp.TurnNotStartedIntoUnavailable()
189
-
190
-				// Annotate ref with digest to push only push tag for single digest
191
-				ref := targetRef
192
-				if _, digested := ref.(reference.Digested); !digested {
193
-					ref, err = reference.WithDigest(ref, target.Digest)
194
-					if err != nil {
195
-						return err
196
-					}
197
-				}
198
-				pusher, err := resolver.Pusher(ctx, ref.String())
199
-				if err != nil {
200
-					return err
201
-				}
202
-				err = remotes.PushContent(ctx, pusher, target, store, limiter, platforms.All, handlerWrapper)
189
+				err = push(ctx, target)
203 190
 
204 191
 				if err == nil {
205 192
 					progress.Aux(out, auxprogress.ManifestPushedInsteadOfIndex{