[tycho] Implement automatic creation of a system p2 repository.

Roland Grunberg rgrunber at fedoraproject.org
Mon Jun 11 18:43:19 UTC 2012


commit 8a282a17294ab25a04cf0c4113a3a9fdbd52ee67
Author: Roland Grunberg <rgrunber at 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 at 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 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 <rgrunber at 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 at redhat.com> 0.14.1-4
 - Non-bootstrap build.


More information about the scm-commits mailing list