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 +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 locationUnits = new CompoundQueryable( 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 repositories = new ArrayList(); - for (MavenProject project : session.getProjects()) { - repositories.addAll(project.getPluginArtifactRepositories()); + List 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 repositories = new ArrayList(); + 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 df3181c..a1aacb3 100644 --- a/tycho.spec +++ b/tycho.spec @@ -24,6 +24,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 @@ -178,6 +179,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 @@ -197,6 +199,7 @@ cp -pr target/site/api*/* %{buildroot}%{_javadocdir}/%{name} %changelog * Tue May 29 2012 Roland Grunberg 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 0.14.1-4 - Non-bootstrap build.