tycho/0002-Implement-a-custom-res...

717 lines
41 KiB
Diff

From 983244b6e973369675d72c1c4097437fa96ba2c1 Mon Sep 17 00:00:00 2001
From: Roland Grunberg <rgrunber@redhat.com>
Date: Tue, 12 Jun 2012 10:38:51 -0400
Subject: [PATCH 2/2] 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.
Use fedoraproject-p2 to resolve bundles from their system location.
Relax constraints for bundles used in Tycho's Equinox runtime.
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).
Use the defined target environments in local mode when the property
tycho.local.keepTarget is set.
In situations where Tycho must resolve maven artifacts, upstream's
implementation only looks in the reactor cache. In Fedora, maven
artifacts may be located on the system using repository layouts
understood by XMvn. Therefore, when an artifact is not found in the
reactor cache, resolution should be attempted using the XMvn Resolver.
Upstream/Fedora Tycho differ in the kind of OSGi Runtime used
(org.eclipse.tycho:tycho-bundles-external:zip) so use separate location
for our runtime (fedora-eclipse) to avoid collisions.
Change-Id: Ia1ece07ece2412bc4a88901631f3f651ad2b634b
---
.../internal/DefaultEquinoxEmbedder.java | 19 ++++++--
.../remote/RemoteRepositoryCacheManager.java | 11 +++++
.../p2/target/TargetDefinitionResolver.java | 11 ++++-
.../target/TargetPlatformBundlePublisher.java | 20 +++------
.../p2/target/TargetPlatformFactoryImpl.java | 45 +++++++++++++++++--
.../p2/repository/LocalRepositoryReader.java | 41 ++++++++++++++++-
.../TargetPlatformConfigurationStub.java | 6 ++-
.../tycho-bundles-external.product | 1 +
.../tycho/core/locking/FileLockerImpl.java | 26 ++++++++---
.../maven/TychoMavenLifecycleParticipant.java | 21 +++++++--
.../core/osgitools/AbstractTychoProject.java | 37 +++++++++++++++
.../core/osgitools/OsgiBundleProject.java | 9 +++-
...aultTargetPlatformConfigurationReader.java | 6 ++-
.../osgi/runtime/TychoOsgiRuntimeLocator.java | 33 +++++++++-----
tycho-p2/tycho-p2-facade/pom.xml | 5 +++
.../p2/resolver/P2DependencyResolver.java | 9 ++++
16 files changed, 251 insertions(+), 49 deletions(-)
diff --git a/sisu-equinox/sisu-equinox-embedder/src/main/java/org/eclipse/sisu/equinox/embedder/internal/DefaultEquinoxEmbedder.java b/sisu-equinox/sisu-equinox-embedder/src/main/java/org/eclipse/sisu/equinox/embedder/internal/DefaultEquinoxEmbedder.java
index f3d3819..04b4577 100644
--- a/sisu-equinox/sisu-equinox-embedder/src/main/java/org/eclipse/sisu/equinox/embedder/internal/DefaultEquinoxEmbedder.java
+++ b/sisu-equinox/sisu-equinox-embedder/src/main/java/org/eclipse/sisu/equinox/embedder/internal/DefaultEquinoxEmbedder.java
@@ -95,14 +95,18 @@ public class DefaultEquinoxEmbedder extends AbstractLogEnabled
@Override
public void addInstallation(File location) {
- if (location == null || !location.isDirectory() || !new File(location, "plugins").isDirectory()) {
+ if (location == null || !location.isDirectory() || (!new File(location, "plugins").isDirectory() && !new File(location, "eclipse/plugins").isDirectory())) {
throw new IllegalArgumentException();
}
if (!installationLocations.isEmpty()) {
// allow only one installation for now
throw new IllegalStateException();
}
- installationLocations.add(location);
+ if (new File(location, "plugins").isDirectory()) {
+ installationLocations.add(location);
+ } else {
+ installationLocations.add(new File(location, "eclipse"));
+ }
}
@Override
@@ -239,7 +243,14 @@ public class DefaultEquinoxEmbedder extends AbstractLogEnabled
if (verIdx > 0) {
bundles.append(name.substring(0, verIdx));
} else {
- throw new EquinoxEmbedderException("File name doesn't match expected pattern: " + file);
+ // In Fedora, NAME_VERSION.QUALIFIER.jar is too fragile.
+ // Let's also accept NAME.jar
+ verIdx = name.lastIndexOf(".jar");
+ if (verIdx > 0) {
+ bundles.append(name.substring(0, verIdx));
+ } else {
+ throw new EquinoxEmbedderException("File name doesn't match expected pattern: " + file);
+ }
}
}
}
@@ -247,7 +258,7 @@ public class DefaultEquinoxEmbedder extends AbstractLogEnabled
}
protected boolean isFrameworkBundle(File file) {
- return file.getName().startsWith("org.eclipse.osgi_");
+ return file.getName().startsWith("org.eclipse.osgi_") || file.getName().equals("org.eclipse.osgi.jar");
}
String getReferenceUrl(File file) {
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/remote/RemoteRepositoryCacheManager.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/remote/RemoteRepositoryCacheManager.java
index 1f233e1..744e7dd 100644
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/remote/RemoteRepositoryCacheManager.java
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/remote/RemoteRepositoryCacheManager.java
@@ -12,14 +12,18 @@ package org.eclipse.tycho.p2.remote;
import java.io.File;
import java.io.IOException;
+import java.net.MalformedURLException;
import java.net.URI;
+import java.net.URL;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.repository.CacheManager;
+import org.eclipse.equinox.internal.p2.repository.Messages;
import org.eclipse.equinox.internal.p2.repository.Transport;
import org.eclipse.equinox.p2.core.ProvisionException;
+import org.eclipse.osgi.util.NLS;
import org.eclipse.tycho.core.shared.MavenContext;
import org.eclipse.tycho.core.shared.MavenLogger;
import org.eclipse.tycho.p2.impl.Activator;
@@ -51,6 +55,13 @@ class RemoteRepositoryCacheManager extends CacheManager {
@Override
public File createCache(URI repositoryLocation, String prefix, IProgressMonitor monitor)
throws IOException, ProvisionException {
+ try {
+ new URL(repositoryLocation.toASCIIString());
+ } catch (MalformedURLException e) {
+ throw new ProvisionException(new Status(IStatus.ERROR,
+ org.eclipse.equinox.internal.p2.repository.Activator.ID, ProvisionException.REPOSITORY_NOT_FOUND,
+ NLS.bind(Messages.CacheManager_CannotLoadNonUrlLocation, repositoryLocation), null));
+ }
File cacheFile = getCache(repositoryLocation, prefix);
if (offline) {
if (cacheFile != null) {
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 23b9e64..9d16466 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 java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
@@ -136,8 +137,14 @@ public final class TargetDefinitionResolver {
} else {
key = location.normalize().toASCIIString();
}
- locations.add(uriRepositories.computeIfAbsent(key,
- s -> new URITargetDefinitionContent(provisioningAgent, location, id)));
+ // We cannot resolve a non-file URI in local mode
+ if ((System.getProperty("TYCHO_MVN_LOCAL") == null
+ && System.getProperty("TYCHO_MVN_RPMBUILD") == null)
+ || URIUtil.isFileURI(repository.getLocation())
+ || "fedora".equals(repository.getLocation().getScheme())) {
+ locations.add(uriRepositories.computeIfAbsent(key,
+ s -> new URITargetDefinitionContent(provisioningAgent, location, id)));
+ }
}
IQueryable<IInstallableUnit> locationUnits = QueryUtil.compoundQueryable(locations);
installableUnitResolver.addLocation((InstallableUnitLocation) locationDefinition, locationUnits);
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBundlePublisher.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBundlePublisher.java
index 2c2f29a..63794ca 100644
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBundlePublisher.java
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBundlePublisher.java
@@ -38,6 +38,7 @@ import org.eclipse.tycho.core.shared.MavenLogger;
import org.eclipse.tycho.p2.impl.publisher.MavenPropertiesAdvice;
import org.eclipse.tycho.p2.impl.publisher.repo.TransientArtifactRepository;
import org.eclipse.tycho.p2.metadata.IArtifactFacade;
+import org.eclipse.tycho.p2.repository.LocalRepositoryReader;
import org.eclipse.tycho.p2.repository.MavenRepositoryCoordinates;
import org.eclipse.tycho.repository.local.GAVArtifactDescriptor;
import org.eclipse.tycho.repository.p2base.artifact.provider.IRawArtifactFileProvider;
@@ -385,22 +386,9 @@ public class TargetPlatformBundlePublisher {
GAVArtifactDescriptor descriptorForRepository = new GAVArtifactDescriptor(baseDescriptor,
repositoryCoordinates);
- File requiredArtifactLocation = new File(getBaseDir(),
- descriptorForRepository.getMavenCoordinates().getLocalRepositoryPath());
- File actualArtifactLocation = mavenArtifact.getLocation();
- if (!equivalentPaths(requiredArtifactLocation, actualArtifactLocation)) {
- throw new AssertionFailedException(
- "The Maven artifact to be added to the target platform is not stored at the required location on disk: required \""
- + requiredArtifactLocation + "\" but was \"" + actualArtifactLocation + "\"");
- }
-
internalAddInternalDescriptor(descriptorForRepository);
}
- private boolean equivalentPaths(File path, File otherPath) {
- return path.equals(otherPath);
- }
-
@Override
protected GAVArtifactDescriptor getInternalDescriptorForAdding(IArtifactDescriptor descriptor) {
// artifacts are only added via the dedicated method
@@ -426,8 +414,10 @@ public class TargetPlatformBundlePublisher {
@Override
protected File internalGetArtifactStorageLocation(IArtifactDescriptor descriptor) {
- String relativePath = toInternalDescriptor(descriptor).getMavenCoordinates().getLocalRepositoryPath();
- return new File(getBaseDir(), relativePath);
+ MavenRepositoryCoordinates coord = toInternalDescriptor(descriptor).getMavenCoordinates();
+ LocalRepositoryReader reader = new LocalRepositoryReader(getBaseDir());
+ return reader.getLocalArtifactLocation(coord.getGav(), coord.getClassifier(),
+ coord.getExtensionOrDefault());
}
private File getBaseDir() {
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java
index a909caf..fed1944 100644
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java
@@ -35,6 +35,9 @@ 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;
+import org.eclipse.equinox.p2.metadata.expression.ExpressionUtil;
+import org.eclipse.equinox.p2.metadata.expression.IExpression;
+import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
@@ -277,9 +280,43 @@ public class TargetPlatformFactoryImpl implements TargetPlatformFactory {
metadataRepositories.add(localMetadataRepository);
}
- for (IMetadataRepository repository : metadataRepositories) {
- IQueryResult<IInstallableUnit> matches = repository.query(QueryUtil.ALL_UNITS, monitor);
- result.addAll(matches.toUnmodifiableSet());
+ if (System.getProperty("TYCHO_MVN_LOCAL") != null) {
+ final IExpression notmatchIU_ID = ExpressionUtil.parse("id != $0");
+ Set<IMetadataRepository> fedoraRepos = new HashSet<IMetadataRepository>();
+
+ // Sanity check even though the repo we want should be at index 1
+ for (IMetadataRepository repository : metadataRepositories) {
+ if ("fedora".equals(repository.getLocation().getScheme())) {
+ fedoraRepos.add(repository);
+ }
+ }
+
+ IQuery<IInstallableUnit> noLocalIUs = QueryUtil.createIUAnyQuery();
+
+ // Create a conjunction query that negates all IUs on the local system
+ for (IMetadataRepository repo : fedoraRepos) {
+ for (IInstallableUnit unit : repo.query(QueryUtil.ALL_UNITS, null).toUnmodifiableSet()) {
+ noLocalIUs = QueryUtil.createCompoundQuery(noLocalIUs,
+ QueryUtil.createMatchQuery(notmatchIU_ID, unit.getId()), true);
+ }
+ }
+
+ for (IMetadataRepository repository : metadataRepositories) {
+ IQueryResult<IInstallableUnit> matches;
+ if ("fedora".equals(repository.getLocation().getScheme())) {
+ matches = repository.query(QueryUtil.ALL_UNITS, monitor);
+ } else {
+ // Don't collect any remote IUs that can be found on the system
+ // This will favour IUs in the system local p2 repository
+ matches = repository.query(noLocalIUs, monitor);
+ }
+ result.addAll(matches.toUnmodifiableSet());
+ }
+ } else {
+ for (IMetadataRepository repository : metadataRepositories) {
+ IQueryResult<IInstallableUnit> matches = repository.query(QueryUtil.ALL_UNITS, monitor);
+ result.addAll(matches.toUnmodifiableSet());
+ }
}
result.addAll(pomDependenciesContent.gatherMavenInstallableUnits());
@@ -333,7 +370,7 @@ public class TargetPlatformFactoryImpl implements TargetPlatformFactory {
List<IArtifactRepository> artifactRepositories = new ArrayList<>();
for (MavenRepositoryLocation location : mavenRepositories) {
- if (!offline || URIUtil.isFileURI(location.getURL())) {
+ if (!offline || URIUtil.isFileURI(location.getURL()) || "fedora".equals(location.getURL().getScheme())) {
artifactRepositories.add(new LazyArtifactRepository(remoteAgent, location.getURL(),
RepositoryArtifactProvider::loadRepository));
}
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/repository/LocalRepositoryReader.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/repository/LocalRepositoryReader.java
index e05f871..03900e2 100644
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/repository/LocalRepositoryReader.java
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/repository/LocalRepositoryReader.java
@@ -11,6 +11,8 @@
package org.eclipse.tycho.p2.repository;
import java.io.File;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
public class LocalRepositoryReader implements RepositoryReader {
@@ -22,7 +24,44 @@ public class LocalRepositoryReader implements RepositoryReader {
@Override
public File getLocalArtifactLocation(GAV gav, String classifier, String extension) {
- return new File(localMavenRepositoryRoot, RepositoryLayoutHelper.getRelativePath(gav, classifier, extension));
+ File file = new File(localMavenRepositoryRoot,
+ RepositoryLayoutHelper.getRelativePath(gav, classifier, extension));
+ // In Fedora the artifact may be in an XMvn-defined repository location (not in reactor cache)
+ if (!file.exists()) {
+ try {
+ // Create Plexus config
+ Class<?> pcclazz = Class.forName("org.codehaus.plexus.ContainerConfiguration");
+ Object conf = Class.forName("org.codehaus.plexus.DefaultContainerConfiguration").newInstance();
+ pcclazz.getMethod("setAutoWiring", boolean.class).invoke(conf, true);
+ pcclazz.getMethod("setClassPathScanning", String.class).invoke(conf, "index");
+
+ // Use plexus container to lookup the reader
+ Class<?> pclazz = Class.forName("org.codehaus.plexus.DefaultPlexusContainer");
+ Object plexus = pclazz.getConstructor(pcclazz).newInstance(conf);
+
+ // Retrieve the workspace reader from the plexus container
+ Method mLookup = pclazz.getMethod("lookup", String.class, String.class);
+ Object reader = mLookup.invoke(plexus, "org.eclipse.aether.repository.WorkspaceReader", "ide");
+
+ // Create an Aether Artifact based on GAV, classifier, and extension
+ Class<?> iartclazz = Class.forName("org.eclipse.aether.artifact.Artifact");
+ Class<?> artclazz = Class.forName("org.eclipse.aether.artifact.DefaultArtifact");
+ Constructor<?> cNew = artclazz.getConstructor(String.class, String.class, String.class, String.class,
+ String.class);
+ Object artifact = cNew.newInstance(gav.getGroupId(), gav.getArtifactId(), classifier, extension,
+ gav.getVersion());
+
+ // Invoke "findArtifact" method of the workspace reader on the artifact
+ Method mfindArtifact = reader.getClass().getMethod("findArtifact", iartclazz);
+ File newFile = (File) mfindArtifact.invoke(reader, artifact);
+ if (newFile != null) {
+ file = newFile;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return file;
}
}
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformConfigurationStub.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformConfigurationStub.java
index 272db57..70897e4 100644
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformConfigurationStub.java
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformConfigurationStub.java
@@ -59,7 +59,11 @@ public class TargetPlatformConfigurationStub {
}
public void addP2Repository(MavenRepositoryLocation location) {
- this.repositories.add(location);
+ // We cannot resolve a non-file URI in local mode while offline
+ if (System.getProperty("TYCHO_MVN_RPMBUILD") == null || "file".equalsIgnoreCase(location.getURL().getScheme())
+ || "fedora".equalsIgnoreCase(location.getURL().getScheme())) {
+ this.repositories.add(location);
+ }
}
// convenience method for tests
diff --git a/tycho-bundles/tycho-bundles-external/tycho-bundles-external.product b/tycho-bundles/tycho-bundles-external/tycho-bundles-external.product
index 7e3d5fb..b146c08 100644
--- a/tycho-bundles/tycho-bundles-external/tycho-bundles-external.product
+++ b/tycho-bundles/tycho-bundles-external/tycho-bundles-external.product
@@ -77,6 +77,7 @@
<plugin id="org.sat4j.pb"/>
<plugin id="org.slf4j.api"/>
<plugin id="org.tukaani.xz"/>
+ <plugin id="org.fedoraproject.p2"/>
</plugins>
<configurations>
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/locking/FileLockerImpl.java b/tycho-core/src/main/java/org/eclipse/tycho/core/locking/FileLockerImpl.java
index 9940561..9a98a40 100644
--- a/tycho-core/src/main/java/org/eclipse/tycho/core/locking/FileLockerImpl.java
+++ b/tycho-core/src/main/java/org/eclipse/tycho/core/locking/FileLockerImpl.java
@@ -27,20 +27,34 @@ public class FileLockerImpl implements FileLocker {
final File lockMarkerFile;
public FileLockerImpl(File file, Location anyLocation) {
+ File lockFileCandidate = null;
try {
if (file.isDirectory()) {
- this.lockMarkerFile = new File(file, LOCKFILE_SUFFIX).getCanonicalFile();
+ lockFileCandidate = new File(file, LOCKFILE_SUFFIX).getCanonicalFile();
} else {
- this.lockMarkerFile = new File(file.getParentFile(), file.getName() + LOCKFILE_SUFFIX)
- .getCanonicalFile();
+ lockFileCandidate = new File(file.getParentFile(), file.getName() + LOCKFILE_SUFFIX).getCanonicalFile();
}
- if (lockMarkerFile.isDirectory()) {
- throw new RuntimeException("Lock marker file " + lockMarkerFile + " already exists and is a directory");
+ if (lockFileCandidate.isDirectory()) {
+ throw new RuntimeException(
+ "Lock marker file " + lockFileCandidate + " already exists and is a directory");
}
- File parentDir = lockMarkerFile.getParentFile();
+ File parentDir = lockFileCandidate.getParentFile();
if (!parentDir.isDirectory() && !parentDir.mkdirs()) {
throw new RuntimeException("Could not create parent directory " + parentDir + " of lock marker file");
}
+
+ String baseDir = System.getProperty("user.dir");
+ String reactorCache = baseDir + "/.m2/";
+ // In Fedora we can only assume reactor cache is safe for read/write.
+ if (!lockFileCandidate.getAbsolutePath().startsWith(reactorCache)) {
+ String lockFileDir = reactorCache + LOCKFILE_SUFFIX;
+ // If the file is located within baseDir, no need to repeat
+ String lockFileName = file.getAbsolutePath().replace(baseDir, "").replace("/", "-").replaceFirst("-",
+ "/") + LOCKFILE_SUFFIX;
+ lockFileCandidate = new File(lockFileDir, lockFileName);
+ }
+
+ this.lockMarkerFile = lockFileCandidate;
this.lockFileLocation = anyLocation.createLocation(null, null, false);
this.lockFileLocation.set(lockMarkerFile.toURL(), false, lockMarkerFile.getAbsolutePath());
} catch (MalformedURLException e) {
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 f733774..8ca51b1 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
@@ -30,6 +30,7 @@ import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.Logger;
import org.eclipse.tycho.ReactorProject;
import org.eclipse.tycho.core.osgitools.BundleReader;
@@ -86,6 +87,18 @@ public class TychoMavenLifecycleParticipant extends AbstractMavenLifecyclePartic
configureComponents(session);
+ try {
+ if (plexus.lookup("org.fedoraproject.xmvn.resolver.Resolver") != null) {
+ if (session.isOffline()) {
+ System.setProperty("TYCHO_MVN_RPMBUILD", "");
+ } else {
+ System.setProperty("TYCHO_MVN_LOCAL", "");
+ }
+ }
+ } catch (ComponentLookupException e) {
+ // No XMvn (Upstream Maven in use)
+ }
+
for (MavenProject project : projects) {
resolver.setupProject(session, project, DefaultReactorProject.adapt(project));
}
@@ -118,8 +131,8 @@ public class TychoMavenLifecycleParticipant extends AbstractMavenLifecyclePartic
if (version == null) {
continue;
}
- log.debug(TYCHO_GROUPID + ":" + plugin.getArtifactId() + ":" + version + " configured in "
- + project);
+ log.debug(
+ TYCHO_GROUPID + ":" + plugin.getArtifactId() + ":" + version + " configured in " + project);
Set<MavenProject> projectSet = versionToProjectsMap.get(version);
if (projectSet == null) {
projectSet = new LinkedHashSet<>();
@@ -152,8 +165,8 @@ public class TychoMavenLifecycleParticipant extends AbstractMavenLifecyclePartic
for (MavenProject project : projects) {
File basedir = project.getBasedir();
if (baseDirs.contains(basedir)) {
- throw new MavenExecutionException("Multiple modules within the same basedir are not supported: "
- + basedir, project.getFile());
+ throw new MavenExecutionException(
+ "Multiple modules within the same basedir are not supported: " + basedir, project.getFile());
} else {
baseDirs.add(basedir);
}
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java
index b53a889..7ea2177 100644
--- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java
+++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java
@@ -15,12 +15,18 @@ import java.util.Objects;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.project.MavenProject;
+import org.apache.maven.toolchain.ToolchainManager;
+import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.logging.Logger;
import org.eclipse.tycho.artifacts.DependencyArtifacts;
import org.eclipse.tycho.core.TargetPlatformConfiguration;
import org.eclipse.tycho.core.TychoConstants;
import org.eclipse.tycho.core.TychoProject;
+import org.eclipse.tycho.core.ee.ExecutionEnvironmentUtils;
import org.eclipse.tycho.core.ee.TargetDefinitionFile;
+import org.eclipse.tycho.core.ee.UnknownEnvironmentException;
+import org.eclipse.tycho.core.ee.shared.ExecutionEnvironment;
import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfiguration;
import org.eclipse.tycho.core.osgitools.targetplatform.LocalDependencyResolver;
import org.eclipse.tycho.core.osgitools.targetplatform.MultiEnvironmentDependencyArtifacts;
@@ -30,6 +36,12 @@ import org.eclipse.tycho.p2.target.facade.TargetDefinition;
public abstract class AbstractTychoProject extends AbstractLogEnabled implements TychoProject {
+ @Requirement
+ private Logger logger;
+
+ @Requirement
+ private ToolchainManager toolchainManager;
+
@Override
public DependencyArtifacts getDependencyArtifacts(MavenProject project) {
return TychoProjectUtils.getDependencyArtifacts(project);
@@ -98,6 +110,8 @@ public abstract class AbstractTychoProject extends AbstractLogEnabled implements
String configuredForcedProfile = tpConfiguration.getExecutionEnvironment();
if (configuredForcedProfile != null) {
+ configuredForcedProfile = overrideToAtLeastJavaSE16(configuredForcedProfile, toolchainManager, mavenSession,
+ logger);
sink.overrideProfileConfiguration(configuredForcedProfile,
"target-platform-configuration <executionEnvironment>");
} else {
@@ -112,9 +126,32 @@ public abstract class AbstractTychoProject extends AbstractLogEnabled implements
String configuredDefaultProfile = tpConfiguration.getExecutionEnvironmentDefault();
if (configuredDefaultProfile != null) {
+ configuredDefaultProfile = overrideToAtLeastJavaSE16(configuredDefaultProfile, toolchainManager,
+ mavenSession, logger);
sink.setProfileConfiguration(configuredDefaultProfile,
"target-platform-configuration <executionEnvironmentDefault>");
}
}
+ public String overrideToAtLeastJavaSE16(String profile, ToolchainManager toolchainManager, MavenSession session,
+ Logger logger) {
+ try {
+ ExecutionEnvironment ee = ExecutionEnvironmentUtils.getExecutionEnvironment(profile, toolchainManager,
+ session, logger);
+
+ if (System.getProperty("TYCHO_MVN_LOCAL") != null || System.getProperty("TYCHO_MVN_RPMBUILD") != null) {
+ // EE must be at least JavaSE-1.6
+ final ExecutionEnvironment javaSE16 = ExecutionEnvironmentUtils.getExecutionEnvironment("JavaSE-1.6",
+ toolchainManager, session, logger);
+ if (!ee.isCompatibleCompilerTargetLevel(javaSE16.getCompilerTargetLevelDefault())) {
+ ee = javaSE16;
+ }
+ }
+
+ return ee.getProfileName();
+ } catch (UnknownEnvironmentException e) {
+ // can't happen, ee is validated during configuration parsing
+ return null;
+ }
+ }
}
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 4ec4166..d57245d 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
@@ -516,6 +516,7 @@ public class OsgiBundleProject extends AbstractTychoProject implements BundlePro
String pdeProfileName = getEclipsePluginProject(DefaultReactorProject.adapt(project)).getBuildProperties()
.getJreCompilationProfile();
if (pdeProfileName != null) {
+ pdeProfileName = overrideToAtLeastJavaSE16(pdeProfileName, toolchainManager, mavenSession, logger);
sink.setProfileConfiguration(pdeProfileName.trim(), "build.properties");
} else {
// ... derived from BREE in bundle manifest
@@ -548,16 +549,22 @@ public class OsgiBundleProject extends AbstractTychoProject implements BundlePro
StandardExecutionEnvironment configuredProfile = ExecutionEnvironmentUtils
.getExecutionEnvironment(configuredProfileName, toolchainManager, mavenSession, logger);
if (configuredProfile != null) {
+ configuredProfileName = overrideToAtLeastJavaSE16(configuredProfileName, toolchainManager, mavenSession,
+ logger);
// non standard profile, stick to it
sink.setProfileConfiguration(configuredProfileName, reason);
}
StandardExecutionEnvironment currentProfile = ExecutionEnvironmentUtils.getExecutionEnvironment(
"JavaSE-" + Runtime.version().feature(), toolchainManager, mavenSession, logger);
if (currentProfile.compareTo(configuredProfile) > 0) {
- sink.setProfileConfiguration(currentProfile.getProfileName(),
+ String configuredProfile1 = overrideToAtLeastJavaSE16(currentProfile.getProfileName(), toolchainManager,
+ mavenSession, logger);
+ sink.setProfileConfiguration(configuredProfile1,
"Currently running profile, newer than configured profile (" + configuredProfileName + ") from ["
+ reason + "]");
} else {
+ configuredProfileName = overrideToAtLeastJavaSE16(configuredProfileName, toolchainManager, mavenSession,
+ logger);
sink.setProfileConfiguration(configuredProfileName, reason);
}
}
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java b/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java
index 87042d2..85d52aa 100644
--- a/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java
+++ b/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTargetPlatformConfigurationReader.java
@@ -87,7 +87,11 @@ public class DefaultTargetPlatformConfigurationReader {
+ configuration.toString());
}
- addTargetEnvironments(result, project, configuration);
+ // Use the defined environments only in local mode with tycho.local.keepTarget
+ if ((System.getProperty("TYCHO_MVN_LOCAL") == null && System.getProperty("TYCHO_MVN_RPMBUILD") == null)
+ || System.getProperty("tycho.local.keepTarget") != null) {
+ addTargetEnvironments(result, project, configuration);
+ }
setTargetPlatformResolver(result, configuration);
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoOsgiRuntimeLocator.java b/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoOsgiRuntimeLocator.java
index ea817a9..c71fc93 100644
--- a/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoOsgiRuntimeLocator.java
+++ b/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoOsgiRuntimeLocator.java
@@ -160,40 +160,53 @@ public class TychoOsgiRuntimeLocator implements EquinoxRuntimeLocator {
Artifact artifact = resolveDependency(session, dependency);
if ("zip".equals(dependency.getType())) {
- File artifactFile = new File(session.getLocalRepository().getBasedir(), session.getLocalRepository()
- .pathOf(artifact));
+ File artifactFile = new File(session.getLocalRepository().getBasedir(),
+ session.getLocalRepository().pathOf(artifact));
File eclipseDir = new File(artifactFile.getParentFile(), "eclipse");
+ File eclipseSaveDir = new File(artifactFile.getParentFile(), "eclipse-save");
+ File fedoraDir = new File(artifactFile.getParentFile(), "fedora-eclipse");
FileLocker locker = fileLockService.getFileLocker(artifactFile);
locker.lock();
try {
- if (!eclipseDir.exists() || artifact.isSnapshot()) {
+ if (!fedoraDir.exists() || artifact.isSnapshot()) {
logger.debug("Extracting Tycho's OSGi runtime");
- if (artifact.getFile().lastModified() > eclipseDir.lastModified()) {
+ if (artifact.getFile().lastModified() > fedoraDir.lastModified()) {
logger.debug("Unpacking Tycho's OSGi runtime to " + eclipseDir);
try {
- FileUtils.deleteDirectory(eclipseDir);
+ FileUtils.deleteDirectory(fedoraDir);
+ if (eclipseDir.exists()) {
+ FileUtils.rename(eclipseDir, eclipseSaveDir);
+ }
} catch (IOException e) {
- logger.warn("Failed to delete Tycho's OSGi runtime " + eclipseDir + ": " + e.getMessage());
+ logger.warn("Failed to delete Tycho's OSGi runtime " + fedoraDir + ": " + e.getMessage());
}
eclipseDir.mkdirs();
unArchiver.setSourceFile(artifact.getFile());
unArchiver.setDestDirectory(eclipseDir);
try {
unArchiver.extract();
+ logger.debug("Moving Tycho's OSGi runtime to " + fedoraDir);
+ FileUtils.rename(eclipseDir, fedoraDir);
+ if (eclipseSaveDir.exists()) {
+ FileUtils.rename(eclipseSaveDir, eclipseDir);
+ }
} catch (ArchiverException e) {
- throw new MavenExecutionException("Failed to unpack Tycho's OSGi runtime: "
- + e.getMessage(), e);
+ throw new MavenExecutionException(
+ "Failed to unpack Tycho's OSGi runtime: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new MavenExecutionException("Failed to move Tycho's OSGi runtime: " + e.getMessage(),
+ e);
}
- eclipseDir.setLastModified(artifact.getFile().lastModified());
+ fedoraDir.setLastModified(artifact.getFile().lastModified());
}
}
} finally {
locker.release();
}
- description.addInstallation(eclipseDir);
+ description.addInstallation(fedoraDir);
} else {
description.addBundle(artifact.getFile());
}
diff --git a/tycho-p2/tycho-p2-facade/pom.xml b/tycho-p2/tycho-p2-facade/pom.xml
index a5cbdb6..c609993 100644
--- a/tycho-p2/tycho-p2-facade/pom.xml
+++ b/tycho-p2/tycho-p2-facade/pom.xml
@@ -57,6 +57,11 @@
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.fedoraproject.p2</groupId>
+ <artifactId>org.fedoraproject.p2</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
</dependencies>
<build>
diff --git a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java
index c911d45..26df4a6 100644
--- a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java
+++ b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java
@@ -92,6 +92,7 @@ import org.eclipse.tycho.p2.resolver.facade.P2ResolverFactory;
import org.eclipse.tycho.p2.target.facade.PomDependencyCollector;
import org.eclipse.tycho.p2.target.facade.TargetPlatformConfigurationStub;
import org.eclipse.tycho.repository.registry.facade.ReactorRepositoryManagerFacade;
+import org.fedoraproject.p2.EclipseSystemLayout;
@Component(role = DependencyResolver.class, hint = P2DependencyResolver.ROLE_HINT, instantiationStrategy = "per-lookup")
public class P2DependencyResolver extends AbstractLogEnabled implements DependencyResolver, Initializable {
@@ -200,6 +201,14 @@ public class P2DependencyResolver extends AbstractLogEnabled implements Dependen
PomDependencyCollector pomDependencies = collectPomDependencies(project, reactorProjects, session,
configuration.getPomDependencies());
+
+ // Add Fedora Local P2 Repository when running in local mode
+ if (System.getProperty("TYCHO_MVN_LOCAL") != null || System.getProperty("TYCHO_MVN_RPMBUILD") != null) {
+ for (URI uri : EclipseSystemLayout.getRepositories()) {
+ tpConfiguration.addP2Repository(new MavenRepositoryLocation(uri.getPath(), uri));
+ }
+ }
+
for (ArtifactRepository repository : project.getRemoteArtifactRepositories()) {
addEntireP2RepositoryToTargetPlatform(repository, tpConfiguration);
}
--
2.28.0