Skip to content

Commit 39f7309

Browse files
committed
Fix copy with alias
Signed-off-by: Valentin Delaye <jonesbusy@users.noreply.github.com>
1 parent 87afaa3 commit 39f7309

5 files changed

Lines changed: 40 additions & 22 deletions

File tree

src/main/java/land/oras/ContainerRef.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,11 @@ public ContainerRef forTarget(String target) {
482482
return forRegistry(target);
483483
}
484484

485+
@Override
486+
public ContainerRef forTarget(OCI<ContainerRef> target) {
487+
return forRegistry((Registry) target);
488+
}
489+
485490
@Override
486491
public String getTarget(OCI<ContainerRef> target) {
487492
return getEffectiveRegistry((Registry) target);

src/main/java/land/oras/CopyUtils.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,18 @@ void copy(
7676
LOG.debug("Content type: {}", contentType);
7777
LOG.debug("Manifest digest: {}", manifestDigest);
7878

79+
SourceRefType effectiveSourceRef = sourceRef.forTarget(source).forTarget(resolveSourceRegistry);
80+
TargetRefType effectiveTargetRef = targetRef.forTarget(target).forTarget(effectiveTargetRegistry);
81+
7982
// Write all layer
80-
for (Layer layer : source.collectLayers(sourceRef.forTarget(resolveSourceRegistry), contentType, true)) {
83+
for (Layer layer : source.collectLayers(effectiveSourceRef, contentType, true)) {
8184
Objects.requireNonNull(layer.getDigest(), "Layer digest is required for streaming copy");
8285
Objects.requireNonNull(layer.getSize(), "Layer size is required for streaming copy");
8386
LOG.debug("Copying layer {}", layer.getDigest());
8487
target.pushBlob(
85-
targetRef.forTarget(effectiveTargetRegistry).withDigest(layer.getDigest()),
88+
effectiveTargetRef.withDigest(layer.getDigest()),
8689
layer.getSize(),
87-
() -> source.fetchBlob(
88-
sourceRef.forTarget(resolveSourceRegistry).withDigest(layer.getDigest())),
90+
() -> source.fetchBlob(effectiveSourceRef.withDigest(layer.getDigest())),
8991
layer.getAnnotations());
9092
LOG.debug("Copied layer {}", layer.getDigest());
9193
}
@@ -94,25 +96,30 @@ void copy(
9496
if (source.isManifestMediaType(contentType)) {
9597

9698
// Write manifest as any blob
97-
Manifest manifest = source.getManifest(sourceRef);
98-
String tag = sourceRef.getTag();
99+
Manifest manifest = source.getManifest(effectiveSourceRef);
100+
String tag = effectiveSourceRef.getTag();
99101

100102
Objects.requireNonNull(manifest.getDigest(), "Manifest digest is required for streaming copy");
101103

102104
// Push config
103-
copyConfig(manifest, resolveSourceRegistry, effectiveTargetRegistry, source, sourceRef, target, targetRef);
105+
copyConfig(manifest, source, effectiveSourceRef, target, effectiveTargetRef);
104106

105107
// Push the manifest
106108
LOG.debug("Copying manifest {}", manifestDigest);
107-
target.pushManifest(targetRef.withDigest(tag), manifest);
109+
target.pushManifest(effectiveTargetRef.withDigest(tag), manifest);
108110
LOG.debug("Copied manifest {}", manifestDigest);
109111

110112
if (recursive) {
111113
LOG.debug("Recursively copy referrers");
112-
Referrers referrers = source.getReferrers(sourceRef.withDigest(manifestDigest), null);
114+
Referrers referrers = source.getReferrers(effectiveSourceRef.withDigest(manifestDigest), null);
113115
for (ManifestDescriptor referer : referrers.getManifests()) {
114116
LOG.info("Copy reference {}", referer.getDigest());
115-
copy(source, sourceRef.withDigest(referer.getDigest()), target, targetRef, recursive);
117+
copy(
118+
source,
119+
effectiveSourceRef.withDigest(referer.getDigest()),
120+
target,
121+
effectiveTargetRef,
122+
recursive);
116123
}
117124
}
118125

@@ -128,18 +135,18 @@ else if (source.isIndexMediaType(contentType)) {
128135
Manifest manifest = source.getManifest(sourceRef.withDigest(manifestDescriptor.getDigest()));
129136

130137
// Push config
131-
copyConfig(
132-
manifest, resolveSourceRegistry, effectiveTargetRegistry, source, sourceRef, target, targetRef);
138+
copyConfig(manifest, source, effectiveSourceRef, target, effectiveTargetRef);
133139

134140
// Push the manifest
135141
LOG.debug("Copying manifest {}", manifestDigest);
136142
target.pushManifest(
137-
targetRef.withDigest(manifest.getDigest()), manifest.withDescriptor(manifestDescriptor));
143+
effectiveTargetRef.withDigest(manifest.getDigest()),
144+
manifest.withDescriptor(manifestDescriptor));
138145
LOG.debug("Copied manifest {}", manifestDigest);
139146
}
140147

141148
LOG.debug("Copying index {}", manifestDigest);
142-
target.pushIndex(targetRef.withDigest(tag), index);
149+
target.pushIndex(effectiveTargetRef.withDigest(tag), index);
143150
LOG.debug("Copied index {}", manifestDigest);
144151

145152
} else {
@@ -152,8 +159,6 @@ else if (source.isIndexMediaType(contentType)) {
152159
TargetRefType extends Ref<@NonNull TargetRefType>>
153160
void copyConfig(
154161
Manifest manifest,
155-
String resolvedSourceRegistry,
156-
String effectiveTargetRegistry,
157162
OCI<SourceRefType> source,
158163
SourceRefType sourceRef,
159164
OCI<TargetRefType> target,
@@ -164,11 +169,9 @@ void copyConfig(
164169
Objects.requireNonNull(config.getDigest(), "Config digest is required for streaming copy");
165170
Objects.requireNonNull(config.getSize(), "Config size is required for streaming copy");
166171
target.pushBlob(
167-
targetRef
168-
.forTarget(effectiveTargetRegistry)
169-
.withDigest(manifest.getConfig().getDigest()),
172+
targetRef.forTarget(target).withDigest(manifest.getConfig().getDigest()),
170173
config.getSize(),
171-
() -> source.pullConfig(sourceRef.forTarget(resolvedSourceRegistry), manifest.getConfig()),
174+
() -> source.pullConfig(sourceRef, manifest.getConfig()),
172175
config.getAnnotations());
173176
LOG.debug("Copied config {}", manifest.getConfig().getDigest());
174177
}

src/main/java/land/oras/LayoutRef.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ public LayoutRef forTarget(String target) {
159159
return new LayoutRef(Path.of(target), tag);
160160
}
161161

162+
@Override
163+
public LayoutRef forTarget(OCI<LayoutRef> target) {
164+
return forTarget(((OCILayout) target).getPath().toString());
165+
}
166+
162167
@Override
163168
public String getTarget(OCI<LayoutRef> target) {
164169
return folder.toString();

src/main/java/land/oras/Ref.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ protected Ref(@Nullable String tag) {
7878
*/
7979
public abstract T forTarget(String target);
8080

81+
/**
82+
* Return a container ref for the target repository
83+
* @param target The target repository
84+
* @return The container ref
85+
*/
86+
public abstract T forTarget(OCI<T> target);
87+
8188
/**
8289
* Get the target repository for the ref
8390
* @param target The target repository

src/test/java/land/oras/RegistryTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import land.oras.utils.ZotUnsecureContainer;
4141
import org.junit.jupiter.api.Assertions;
4242
import org.junit.jupiter.api.BeforeEach;
43-
import org.junit.jupiter.api.Disabled;
4443
import org.junit.jupiter.api.Test;
4544
import org.junit.jupiter.api.io.TempDir;
4645
import org.junit.jupiter.api.parallel.Execution;
@@ -947,7 +946,6 @@ void testShouldArtifactWithAlias(@TempDir Path homeDir) throws Exception {
947946

948947
@Test
949948
@Execution(ExecutionMode.SAME_THREAD)
950-
@Disabled("#")
951949
void testShouldCopyFromAliasToAlias(@TempDir Path homeDir) throws Exception {
952950

953951
try (RegistryContainer otherRegistryContainer = new RegistryContainer()) {

0 commit comments

Comments
 (0)