8a282a1729
Automatically create a local p2 repository of all bundles on the system so that they may be used for local dependency resolution. This is done using a modified version of Eclipse's copy-platform script.
224 lines
12 KiB
Diff
224 lines
12 KiB
Diff
From 590e6eb40fb807c5b45c8360b80b7a12185b37a6 Mon Sep 17 00:00:00 2001
|
|
From: Roland Grunberg <rgrunber@redhat.com>
|
|
Date: Thu, 7 Jun 2012 16:41:33 -0400
|
|
Subject: [PATCH] Implement a custom resolver for Tycho in local mode.
|
|
|
|
When running in local mode, dependencies should be resolved by looking
|
|
on the local system. Remote repositories should be ignored unless
|
|
offline mode is disabled.
|
|
|
|
Automatically create a local p2 repository of all bundles on the system
|
|
so that they may be used for local dependency resolution. This is done
|
|
using a modified version of Eclipse's copy-platform script.
|
|
|
|
Since Fedora 17, we need an Execution Environment of at least JavaSE-1.6
|
|
for Eclipse bundles. Eclipse Juno platform bundles depend on
|
|
javax.annotation. In Fedora this is provided by geronimo-annotation, but
|
|
has a dependency on javax.lang.model (since 1.6).
|
|
|
|
Change-Id: I0609a1caecad753d811c5a93183547b33737657f
|
|
---
|
|
.../tycho/p2/target/TargetDefinitionResolver.java | 8 +++-
|
|
.../tycho/p2/target/TargetPlatformBuilderImpl.java | 5 +++
|
|
.../core/maven/TychoMavenLifecycleParticipant.java | 13 +++++++
|
|
.../tycho/core/osgitools/OsgiBundleProject.java | 38 +++++++++++++++++++-
|
|
.../tycho/osgi/runtime/TychoP2RuntimeLocator.java | 17 +++++++++
|
|
.../p2/resolver/P2TargetPlatformResolver.java | 10 +++++
|
|
6 files changed, 88 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java
|
|
index 2d7d3b9..c628e6e 100644
|
|
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java
|
|
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java
|
|
@@ -24,6 +24,7 @@ import org.eclipse.core.runtime.CoreException;
|
|
import org.eclipse.core.runtime.IProgressMonitor;
|
|
import org.eclipse.core.runtime.IStatus;
|
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
|
+import org.eclipse.core.runtime.URIUtil;
|
|
import org.eclipse.equinox.p2.core.IProvisioningAgent;
|
|
import org.eclipse.equinox.p2.core.ProvisionException;
|
|
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
|
|
@@ -100,8 +101,11 @@ public class TargetDefinitionResolver {
|
|
|
|
List<IMetadataRepository> metadataRepositories = new ArrayList<IMetadataRepository>();
|
|
for (Repository repository : iuLocationDefinition.getRepositories()) {
|
|
- artifactRepositories.add(repository.getLocation());
|
|
- metadataRepositories.add(loadRepository(repository));
|
|
+ // We cannot resolve a non-file URI in local mode
|
|
+ if (System.getProperty("maven.local.mode") == null || URIUtil.isFileURI(repository.getLocation())) {
|
|
+ artifactRepositories.add(repository.getLocation());
|
|
+ metadataRepositories.add(loadRepository(repository));
|
|
+ }
|
|
}
|
|
|
|
IQueryable<IInstallableUnit> locationUnits = new CompoundQueryable<IInstallableUnit>(
|
|
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java
|
|
index 9da87bb..5785029 100644
|
|
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java
|
|
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java
|
|
@@ -255,6 +255,11 @@ public class TargetPlatformBuilderImpl implements TargetPlatformBuilder {
|
|
return;
|
|
}
|
|
|
|
+ // We cannot resolve a non-file URI in local mode while offline
|
|
+ if (System.getProperty("maven.local.mode") != null && offline && !URIUtil.isFileURI(location)) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
try {
|
|
metadataRepository = metadataRepositoryManager.loadRepository(location, monitor);
|
|
metadataRepositories.add(metadataRepository);
|
|
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java
|
|
index 80810d6..e3c6732 100644
|
|
--- a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java
|
|
+++ b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java
|
|
@@ -11,6 +11,7 @@
|
|
package org.eclipse.tycho.core.maven;
|
|
|
|
import java.io.File;
|
|
+import java.io.IOException;
|
|
import java.util.List;
|
|
|
|
import org.apache.maven.AbstractMavenLifecycleParticipant;
|
|
@@ -51,6 +52,18 @@ public class TychoMavenLifecycleParticipant extends AbstractMavenLifecyclePartic
|
|
registerExecutionListener(session);
|
|
configureComponents(session);
|
|
|
|
+ // Create a system p2 repository for local dependency resolution
|
|
+ try {
|
|
+ String[] cmd = new String[] { "/usr/share/java/tycho/copy-platform-all",
|
|
+ System.getProperty("user.dir") + "/.m2/p2/repo" };
|
|
+ Process p = Runtime.getRuntime().exec(cmd);
|
|
+ p.waitFor();
|
|
+ } catch (IOException e) {
|
|
+ // Continue
|
|
+ } catch (InterruptedException e) {
|
|
+ // Continue
|
|
+ }
|
|
+
|
|
List<MavenProject> projects = session.getProjects();
|
|
for (MavenProject project : projects) {
|
|
resolver.setupProject(session, project, DefaultReactorProject.adapt(project));
|
|
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java
|
|
index 8d18453..051913e 100644
|
|
--- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java
|
|
+++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java
|
|
@@ -505,6 +505,28 @@ public class OsgiBundleProject extends AbstractTychoProject implements BundlePro
|
|
}
|
|
|
|
ExecutionEnvironment manifestMinimalEE = Collections.min(envs);
|
|
+ ExecutionEnvironment tmp;
|
|
+
|
|
+ if (System.getProperty("maven.local.mode") != null) {
|
|
+ try {
|
|
+ // EE must be at least JavaSE-1.6
|
|
+ final ExecutionEnvironment javaSE16 = ExecutionEnvironmentUtils.getExecutionEnvironment("JavaSE-1.6");
|
|
+ while (!envs.isEmpty()) {
|
|
+ tmp = Collections.min(envs);
|
|
+ if (tmp.compareTo(javaSE16) >= 0) {
|
|
+ manifestMinimalEE = tmp;
|
|
+ break;
|
|
+ }
|
|
+ envs.remove(tmp);
|
|
+ }
|
|
+
|
|
+ if (envs.isEmpty()) {
|
|
+ return javaSE16;
|
|
+ }
|
|
+ } catch (UnknownEnvironmentException e) {
|
|
+ // Continue
|
|
+ }
|
|
+ }
|
|
|
|
if (buildMinimalEE == null) {
|
|
return manifestMinimalEE;
|
|
@@ -515,7 +537,21 @@ public class OsgiBundleProject extends AbstractTychoProject implements BundlePro
|
|
|
|
protected ExecutionEnvironment getExecutionEnvironment(MavenProject project, String profile) {
|
|
try {
|
|
- return ExecutionEnvironmentUtils.getExecutionEnvironment(profile);
|
|
+ ExecutionEnvironment ee = ExecutionEnvironmentUtils.getExecutionEnvironment(profile);
|
|
+
|
|
+ if (System.getProperty("maven.local.mode") != null && ee != null) {
|
|
+ try {
|
|
+ // EE must be at least JavaSE-1.6
|
|
+ final ExecutionEnvironment javaSE16 = ExecutionEnvironmentUtils.getExecutionEnvironment("JavaSE-1.6");
|
|
+ if (ee.compareTo(javaSE16) < 0) {
|
|
+ ee = javaSE16;
|
|
+ }
|
|
+ } catch (UnknownEnvironmentException e) {
|
|
+ // Continue
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return ee;
|
|
} catch (UnknownEnvironmentException e) {
|
|
throw new RuntimeException("Unknown execution environment specified in build.properties of project "
|
|
+ project, e);
|
|
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java b/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java
|
|
index 15b3fff..c8f14df 100644
|
|
--- a/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java
|
|
+++ b/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java
|
|
@@ -23,6 +23,7 @@ import org.apache.maven.artifact.repository.ArtifactRepository;
|
|
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
|
|
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
|
|
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
|
|
+import org.apache.maven.artifact.resolver.JavadirWorkspaceReader;
|
|
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
|
|
import org.apache.maven.execution.MavenSession;
|
|
import org.apache.maven.model.Dependency;
|
|
@@ -38,6 +39,7 @@ import org.codehaus.plexus.util.FileUtils;
|
|
import org.eclipse.sisu.equinox.embedder.EquinoxRuntimeLocator;
|
|
import org.eclipse.tycho.locking.facade.FileLockService;
|
|
import org.eclipse.tycho.locking.facade.FileLocker;
|
|
+import org.sonatype.aether.util.artifact.DefaultArtifact;
|
|
|
|
@Component(role = EquinoxRuntimeLocator.class)
|
|
public class TychoP2RuntimeLocator implements EquinoxRuntimeLocator {
|
|
@@ -158,6 +160,21 @@ public class TychoP2RuntimeLocator implements EquinoxRuntimeLocator {
|
|
}
|
|
|
|
private File resolveArtifact(MavenSession session, Artifact artifact) throws MavenExecutionException {
|
|
+
|
|
+ // If we are in local mode, find the artifact on the system
|
|
+ if (System.getProperty("maven.local.mode") != null) {
|
|
+ JavadirWorkspaceReader wReader = new JavadirWorkspaceReader();
|
|
+ DefaultArtifact newArtifact = new DefaultArtifact(artifact.getGroupId()
|
|
+ + ":" + artifact.getArtifactId()
|
|
+ + ":" + artifact.getType()
|
|
+ + ":" + artifact.getVersion());
|
|
+ File file = wReader.findArtifact(newArtifact);
|
|
+ if (file != null) {
|
|
+ artifact.setFile(file);
|
|
+ return file;
|
|
+ }
|
|
+ }
|
|
+
|
|
List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
|
|
for (MavenProject project : session.getProjects()) {
|
|
repositories.addAll(project.getPluginArtifactRepositories());
|
|
diff --git a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java
|
|
index d4bcc9a..57ae997 100644
|
|
--- a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java
|
|
+++ b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java
|
|
@@ -204,6 +204,16 @@ public class P2TargetPlatformResolver extends AbstractTargetPlatformResolver imp
|
|
ee != null ? ee.getProfileName() : null, configuration.isDisableP2Mirrors());
|
|
tpBuilder.setProjectLocation(project.getBasedir());
|
|
|
|
+ // Add Fedora Local P2 Repository when running in local mode
|
|
+ if (System.getProperty("maven.local.mode") != null) {
|
|
+ String uri = "file:" + System.getProperty("user.dir") + "/.m2/p2/repo";
|
|
+ try {
|
|
+ tpBuilder.addP2Repository(new URI(uri));
|
|
+ } catch (URISyntaxException e) {
|
|
+ getLogger().warn("Unable to resolve repository URI : " + uri, e);
|
|
+ }
|
|
+ }
|
|
+
|
|
addThisReactorProjectToTargetPlatform(session, project, configuration, tpBuilder);
|
|
|
|
addOtherReactorProjectsToTargetPlatform(project, reactorProjects, tpBuilder);
|
|
--
|
|
1.7.7.6
|
|
|