commit c658ed4f347e58515eba363d7faa7bb328d0a2f2
Author: Roland Grunberg <rgrunber(a)redhat.com>
Date: Mon Jun 11 13:14:37 2012 -0400
Implement automatic creation of a system p2 repository.
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.
copy-platform-all | 95 ++++++++++++++++++++++
tycho-use-custom-resolver.patch | 167 +++++++++++++++++++++++++++++----------
tycho.spec | 3 +
3 files changed, 223 insertions(+), 42 deletions(-)
---
diff --git a/copy-platform-all b/copy-platform-all
new file mode 100755
index 0000000..0adfd14
--- /dev/null
+++ b/copy-platform-all
@@ -0,0 +1,95 @@
+#! /bin/sh
+
+where=$1'-sdk'
+repo=$1; shift
+eclipse=$(rpm --eval '%{_eclipse_base}'); shift
+
+datadir=/usr/share/eclipse
+
+mkdir -p $where/plugins $where/features
+pushd $where
+
+ (cd $eclipse;
+ ls -d plugins/* features/* 2>/dev/null) |
+ while read f; do
+ [ ! -e $f ] && ln -s $eclipse/$f $f
+ done
+ (cd $eclipse/dropins; ls -d * 2>/dev/null) |
+ while read f; do
+ if [ -e $eclipse/dropins/$f/eclipse ]; then
+ (cd $eclipse/dropins/$f/eclipse;
+ ls -d plugins/* features/* 2>/dev/null) |
+ while read g; do
+ [ ! -e $g ] && \
+ ln -s $eclipse/dropins/$f/eclipse/$g $g
+ done
+ else
+ (cd $eclipse/dropins/$f;
+ ls -d plugins/* features/* 2>/dev/null) |
+ while read g; do
+ [ ! -e $g ] && \
+ ln -s $eclipse/dropins/$f/$g $g
+ done
+ fi
+ done
+ (cd $datadir/dropins; ls -d * 2>/dev/null) |
+ while read f; do
+ if [ -e $datadir/dropins/$f/eclipse ]; then
+ (cd $datadir/dropins/$f/eclipse;
+ ls -d plugins/* features/* 2>/dev/null) |
+ while read g; do
+ [ ! -e $g ] && \
+ ln -s $datadir/dropins/$f/eclipse/$g $g
+ done
+ else
+ (cd $datadir/dropins/$f;
+ ls -d plugins/* features/* 2>/dev/null) |
+ while read g; do
+ [ ! -e $g ] && \
+ ln -s $datadir/dropins/$g $g
+ done
+ fi
+ done
+
+for p in $(ls -d $eclipse/dropins/jdt/plugins/*); do
+ plugin=$(basename $p)
+ [ ! -e plugins/$plugin ] && ln -s $eclipse/dropins/jdt/plugins/$plugin
plugins/$plugin
+done
+for f in $(ls -d $eclipse/dropins/jdt/features/*); do
+ feature=$(basename $f)
+ [ ! -e features/$feature ] && ln -s $eclipse/dropins/jdt/features/$feature
features/$feature
+done
+for p in $(ls -d $eclipse/dropins/sdk/plugins/*); do
+ plugin=$(basename $p)
+ [ ! -e plugins/$plugin ] && ln -s $eclipse/dropins/sdk/plugins/$plugin
plugins/$plugin
+done
+for f in $(ls -d $eclipse/dropins/sdk/features/*); do
+ feature=$(basename $f)
+ [ ! -e features/$feature ] && ln -s $eclipse/dropins/sdk/features/$feature
features/$feature
+done
+for p in $(ls -d $eclipse/plugins/*); do
+ plugin=$(basename $p)
+ [ ! -e plugins/$plugin ] && ln -s $eclipse/plugins/$plugin plugins/$plugin
+done
+for f in $(ls -d $eclipse/features/*); do
+ feature=$(basename $f)
+ [ ! -e features/$feature ] && ln -s $eclipse/features/$feature
features/$feature
+done
+
+for p in $(find /usr/share/java -name "*.jar"); do
+ unzip -p $p 'META-INF/MANIFEST.MF' | grep -q
'Bundle-ManifestVersion'
+ if [ $? = 0 ]; then
+ plugin=$(basename $p)
+ [ ! -e plugins/$plugin ] && ln -s $p plugins/$plugin
+ fi
+done
+
+popd
+
+eclipse -nosplash -application
org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher \
+-metadataRepository file:$repo \
+-artifactRepository file:$repo \
+-source $where \
+-compress -append -publishArtifacts
+
+rm -rf $where
diff --git a/tycho-use-custom-resolver.patch b/tycho-use-custom-resolver.patch
index 5c6f8b3..1e3992d 100644
--- a/tycho-use-custom-resolver.patch
+++ b/tycho-use-custom-resolver.patch
@@ -1,5 +1,33 @@
+From 590e6eb40fb807c5b45c8360b80b7a12185b37a6 Mon Sep 17 00:00:00 2001
+From: Roland Grunberg <rgrunber(a)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..3084fff 100644
+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;
@@ -25,63 +53,52 @@ index 2d7d3b9..3084fff 100644
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..3d15c5e 100644
+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
-+ if (System.getProperty("maven.local.mode") != null &&
!URIUtil.isFileURI(location)) {
++ // 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/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;
+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;
- @Component(role = EquinoxRuntimeLocator.class)
- public class TychoP2RuntimeLocator implements EquinoxRuntimeLocator {
-@@ -158,6 +160,21 @@ public class TychoP2RuntimeLocator implements EquinoxRuntimeLocator
{
- }
+ import java.io.File;
++import java.io.IOException;
+ import java.util.List;
- 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;
-+ }
+ 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<ArtifactRepository> repositories = new
ArrayList<ArtifactRepository>();
- for (MavenProject project : session.getProjects()) {
- repositories.addAll(project.getPluginArtifactRepositories());
+ 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
@@ -138,3 +155,69 @@ index 8d18453..051913e 100644
} 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
+
diff --git a/tycho.spec b/tycho.spec
index 6030c6b..9621a35 100644
--- a/tycho.spec
+++ b/tycho.spec
@@ -25,6 +25,7 @@ Source0: %{name}-0.14.x.tar.bz2
Source1: EmptyMojo.java
# we need to make sure we are using maven 3 deps
Source2: depmap.xml
+Source3: copy-platform-all
Patch0: %{name}-fix-build.patch
Patch1: %{name}-fix-surefire.patch
@@ -176,6 +177,7 @@ install -pm 644 pom.xml
$RPM_BUILD_ROOT%{_mavenpomdir}/JPP.%{name}-main.pom
install -dm 755 %{buildroot}%{_javadocdir}/%{name}
cp -pr target/site/api*/* %{buildroot}%{_javadocdir}/%{name}
+install -pm 755 %{SOURCE3} %{buildroot}%{_javadir}/%{name}/copy-platform-all
%post
%update_maven_depmap
@@ -195,6 +197,7 @@ cp -pr target/site/api*/* %{buildroot}%{_javadocdir}/%{name}
%changelog
* Tue May 29 2012 Roland Grunberg <rgrunber(a)redhat.com> 0.14.1-4.1
- Fix Tycho Surfire to run Eclipse test bundles.
+- Implement automatic creation of a system p2 repository.
* Wed May 23 2012 Roland Grunberg <rgrunber(a)redhat.com> 0.14.1-4
- Non-bootstrap build.