Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/java/land/oras/ContainerRef.java
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,11 @@ public ContainerRef forTarget(String target) {
return forRegistry(target);
}

@Override
public ContainerRef forTarget(OCI<ContainerRef> target) {
return forRegistry((Registry) target);
}

@Override
public String getTarget(OCI<ContainerRef> target) {
return getEffectiveRegistry((Registry) target);
Expand Down
43 changes: 23 additions & 20 deletions src/main/java/land/oras/CopyUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,18 @@ void copy(
LOG.debug("Content type: {}", contentType);
LOG.debug("Manifest digest: {}", manifestDigest);

SourceRefType effectiveSourceRef = sourceRef.forTarget(source).forTarget(resolveSourceRegistry);
TargetRefType effectiveTargetRef = targetRef.forTarget(target).forTarget(effectiveTargetRegistry);

// Write all layer
for (Layer layer : source.collectLayers(sourceRef.forTarget(resolveSourceRegistry), contentType, true)) {
for (Layer layer : source.collectLayers(effectiveSourceRef, contentType, true)) {
Objects.requireNonNull(layer.getDigest(), "Layer digest is required for streaming copy");
Objects.requireNonNull(layer.getSize(), "Layer size is required for streaming copy");
LOG.debug("Copying layer {}", layer.getDigest());
target.pushBlob(
targetRef.forTarget(effectiveTargetRegistry).withDigest(layer.getDigest()),
effectiveTargetRef.withDigest(layer.getDigest()),
layer.getSize(),
() -> source.fetchBlob(
sourceRef.forTarget(resolveSourceRegistry).withDigest(layer.getDigest())),
() -> source.fetchBlob(effectiveSourceRef.withDigest(layer.getDigest())),
layer.getAnnotations());
LOG.debug("Copied layer {}", layer.getDigest());
}
Expand All @@ -94,25 +96,30 @@ void copy(
if (source.isManifestMediaType(contentType)) {

// Write manifest as any blob
Manifest manifest = source.getManifest(sourceRef);
String tag = sourceRef.getTag();
Manifest manifest = source.getManifest(effectiveSourceRef);
String tag = effectiveSourceRef.getTag();

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

// Push config
copyConfig(manifest, resolveSourceRegistry, effectiveTargetRegistry, source, sourceRef, target, targetRef);
copyConfig(manifest, source, effectiveSourceRef, target, effectiveTargetRef);

// Push the manifest
LOG.debug("Copying manifest {}", manifestDigest);
target.pushManifest(targetRef.withDigest(tag), manifest);
target.pushManifest(effectiveTargetRef.withDigest(tag), manifest);
LOG.debug("Copied manifest {}", manifestDigest);

if (recursive) {
LOG.debug("Recursively copy referrers");
Referrers referrers = source.getReferrers(sourceRef.withDigest(manifestDigest), null);
Referrers referrers = source.getReferrers(effectiveSourceRef.withDigest(manifestDigest), null);
for (ManifestDescriptor referer : referrers.getManifests()) {
LOG.info("Copy reference {}", referer.getDigest());
copy(source, sourceRef.withDigest(referer.getDigest()), target, targetRef, recursive);
copy(
source,
effectiveSourceRef.withDigest(referer.getDigest()),
target,
effectiveTargetRef,
recursive);
}
}

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

// Push config
copyConfig(
manifest, resolveSourceRegistry, effectiveTargetRegistry, source, sourceRef, target, targetRef);
copyConfig(manifest, source, effectiveSourceRef, target, effectiveTargetRef);

// Push the manifest
LOG.debug("Copying manifest {}", manifestDigest);
target.pushManifest(
targetRef.withDigest(manifest.getDigest()), manifest.withDescriptor(manifestDescriptor));
effectiveTargetRef.withDigest(manifest.getDigest()),
manifest.withDescriptor(manifestDescriptor));
LOG.debug("Copied manifest {}", manifestDigest);
}

LOG.debug("Copying index {}", manifestDigest);
target.pushIndex(targetRef.withDigest(tag), index);
target.pushIndex(effectiveTargetRef.withDigest(tag), index);
LOG.debug("Copied index {}", manifestDigest);

} else {
Expand All @@ -152,8 +159,6 @@ else if (source.isIndexMediaType(contentType)) {
TargetRefType extends Ref<@NonNull TargetRefType>>
void copyConfig(
Manifest manifest,
String resolvedSourceRegistry,
String effectiveTargetRegistry,
OCI<SourceRefType> source,
SourceRefType sourceRef,
OCI<TargetRefType> target,
Expand All @@ -164,11 +169,9 @@ void copyConfig(
Objects.requireNonNull(config.getDigest(), "Config digest is required for streaming copy");
Objects.requireNonNull(config.getSize(), "Config size is required for streaming copy");
target.pushBlob(
targetRef
.forTarget(effectiveTargetRegistry)
.withDigest(manifest.getConfig().getDigest()),
targetRef.forTarget(target).withDigest(manifest.getConfig().getDigest()),
config.getSize(),
() -> source.pullConfig(sourceRef.forTarget(resolvedSourceRegistry), manifest.getConfig()),
() -> source.pullConfig(sourceRef, manifest.getConfig()),
config.getAnnotations());
LOG.debug("Copied config {}", manifest.getConfig().getDigest());
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/land/oras/LayoutRef.java
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@ public LayoutRef forTarget(String target) {
return new LayoutRef(Path.of(target), tag);
}

@Override
public LayoutRef forTarget(OCI<LayoutRef> target) {
return forTarget(((OCILayout) target).getPath().toString());
}

@Override
public String getTarget(OCI<LayoutRef> target) {
return folder.toString();
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/land/oras/Ref.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ protected Ref(@Nullable String tag) {
*/
public abstract T forTarget(String target);

/**
* Return a container ref for the target repository
* @param target The target repository
* @return The container ref
*/
public abstract T forTarget(OCI<T> target);

/**
* Get the target repository for the ref
* @param target The target repository
Expand Down
2 changes: 0 additions & 2 deletions src/test/java/land/oras/RegistryTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import land.oras.utils.ZotUnsecureContainer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.api.parallel.Execution;
Expand Down Expand Up @@ -947,7 +946,6 @@ void testShouldArtifactWithAlias(@TempDir Path homeDir) throws Exception {

@Test
@Execution(ExecutionMode.SAME_THREAD)
@Disabled("#")
void testShouldCopyFromAliasToAlias(@TempDir Path homeDir) throws Exception {

try (RegistryContainer otherRegistryContainer = new RegistryContainer()) {
Expand Down