From 41b1b4f2e85b384afaaeecb1c42d078a3f948526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Sun, 17 Dec 2023 12:26:00 +0100 Subject: [PATCH] Add support for resolving target platform projects Currently target-platform projects do not have any resolved dependencies, this has a few disadvantages: - if one want to see the dependency tree it is empty - if one wants to mirror a target platform this can't be performed This adds support for target platform projects to resolve and have their dependencies injected to support such advanced use-cases. --- .../core/osgitools/TargetPlatformProject.java | 79 +++++++++++++++++++ .../p2resolver/P2DependencyResolver.java | 35 ++++---- 2 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/TargetPlatformProject.java diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/TargetPlatformProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/TargetPlatformProject.java new file mode 100644 index 0000000000..fee5ab1934 --- /dev/null +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/TargetPlatformProject.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2023 Christoph Läubrich and others. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Christoph Läubrich - initial API and implementation + *******************************************************************************/ +package org.eclipse.tycho.core.osgitools; + +import java.io.File; + +import org.codehaus.plexus.component.annotations.Component; +import org.eclipse.tycho.ArtifactKey; +import org.eclipse.tycho.DefaultArtifactKey; +import org.eclipse.tycho.DependencyArtifacts; +import org.eclipse.tycho.PackagingType; +import org.eclipse.tycho.ReactorProject; +import org.eclipse.tycho.TychoConstants; +import org.eclipse.tycho.core.ArtifactDependencyVisitor; +import org.eclipse.tycho.core.ArtifactDependencyWalker; +import org.eclipse.tycho.core.TychoProject; +import org.eclipse.tycho.core.osgitools.targetplatform.DefaultDependencyArtifacts; +import org.eclipse.tycho.model.Feature; +import org.eclipse.tycho.model.ProductConfiguration; +import org.eclipse.tycho.model.UpdateSite; + +@Component(role = TychoProject.class, hint = PackagingType.TYPE_ECLIPSE_TARGET_DEFINITION) +public class TargetPlatformProject extends AbstractTychoProject { + + @Override + public ArtifactDependencyWalker getDependencyWalker(ReactorProject project) { + return new ArtifactDependencyWalker() { + + @Override + public void walk(ArtifactDependencyVisitor visitor) { + + } + + @Override + public void traverseUpdateSite(UpdateSite site, ArtifactDependencyVisitor visitor) { + + } + + @Override + public void traverseProduct(ProductConfiguration productConfiguration, ArtifactDependencyVisitor visitor) { + + } + + @Override + public void traverseFeature(File location, Feature feature, ArtifactDependencyVisitor visitor) { + + } + }; + } + + @Override + public ArtifactKey getArtifactKey(ReactorProject project) { + return new DefaultArtifactKey("target", project.getArtifactId(), project.getVersion()); + } + + @Override + public DependencyArtifacts getDependencyArtifacts(ReactorProject project) { + synchronized (project) { + DependencyArtifacts resolvedDependencies = (DependencyArtifacts) project + .getContextValue(TychoConstants.CTX_DEPENDENCY_ARTIFACTS); + if (resolvedDependencies != null) { + return resolvedDependencies; + } + DefaultDependencyArtifacts artifacts = new DefaultDependencyArtifacts(project); + return artifacts; + } + } + +} diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java index 87b6c64097..e7cf104323 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java @@ -62,6 +62,7 @@ import org.eclipse.tycho.MavenDependencyDescriptor; import org.eclipse.tycho.MavenRepositoryLocation; import org.eclipse.tycho.OptionalResolutionAction; +import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.TargetEnvironment; import org.eclipse.tycho.TargetPlatform; @@ -149,22 +150,26 @@ public class P2DependencyResolver implements DependencyResolver, Initializable { @Override public void setupProjects(final MavenSession session, final MavenProject project, final ReactorProject reactorProject) { - TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(project); - List environments = configuration.getEnvironments(); - Collection metadataMap = getDependencyMetadata(session, project, environments, - OptionalResolutionAction.OPTIONAL); - Map> typeMap = new TreeMap<>(); - for (DependencyMetadataType type : DependencyMetadataType.values()) { - typeMap.put(type, new LinkedHashSet<>()); - } - for (IDependencyMetadata metadata : metadataMap) { - typeMap.forEach((key, value) -> value.addAll(metadata.getDependencyMetadata(key))); - } Set initial = new HashSet<>(); - typeMap.forEach((key, value) -> { - reactorProject.setDependencyMetadata(key, value); - initial.addAll(value); - }); + if (PackagingType.TYPE_ECLIPSE_TARGET_DEFINITION.equals(project.getPackaging())) { + //Target projects do not have any (initial) dependency metadata + } else { + TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(project); + List environments = configuration.getEnvironments(); + Collection metadataMap = getDependencyMetadata(session, project, environments, + OptionalResolutionAction.OPTIONAL); + Map> typeMap = new TreeMap<>(); + for (DependencyMetadataType type : DependencyMetadataType.values()) { + typeMap.put(type, new LinkedHashSet<>()); + } + for (IDependencyMetadata metadata : metadataMap) { + typeMap.forEach((key, value) -> value.addAll(metadata.getDependencyMetadata(key))); + } + typeMap.forEach((key, value) -> { + reactorProject.setDependencyMetadata(key, value); + initial.addAll(value); + }); + } reactorProject.setDependencyMetadata(DependencyMetadataType.INITIAL, initial); }