From 44e4f583424ddb7a72293421a2361f68115ca89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Tue, 23 Jan 2024 15:52:02 +0100 Subject: [PATCH] Add repo2runnable as a mojo --- RELEASE_NOTES.md | 27 +- .../p2tools/MirrorApplicationServiceImpl.java | 2 +- .../tycho/p2tools/TychoMirrorApplication.java | 2 +- .../copiedfromp2/AbstractApplication.java | 1 - .../copiedfromp2/MirrorApplication.java | 1 - .../p2tools/copiedfromp2/Repo2Runnable.java | 19 +- .../copiedfromp2/RepositoryDescriptor.java | 230 +++++++++--------- .../p2/repository/Repo2RunnableMojo.java | 55 +++++ 8 files changed, 210 insertions(+), 127 deletions(-) create mode 100644 tycho-p2-repository-plugin/src/main/java/org/eclipse/tycho/plugins/p2/repository/Repo2RunnableMojo.java diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ea5ba733d6..f2a674df7e 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -6,6 +6,31 @@ If you are reading this in the browser, then you can quickly jump to specific ve ## 5.0.0 (under development) +### new `repo-to-runnable` mojo + +This is a replacement for the [Repo2Runnable ant task](https://wiki.eclipse.org/Equinox/p2/Ant_Tasks#Repo2Runnable), example: + +```xml + + org.eclipse.tycho + tycho-p2-repository-plugin + ${tycho-version} + + + repo-to-runnable + + repo-to-runnable + + pre-integration-test + + ... + ... + + + + +``` + ### support for embedded target locations You can already define target definition files in various ways, e.g. as maven artifact or file reference, @@ -56,7 +81,7 @@ You can now use `javac` as the compiler backend for Tycho by adding the followin ``` -### new `mirror-target-platform` +### new `mirror-target-platform` mojo There is a new `mirror-target-platform` that allows to mirror the current target platform of a project into a P2 update site, this can b enabled for a project like this: diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/MirrorApplicationServiceImpl.java b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/MirrorApplicationServiceImpl.java index 1644b9b832..3d12db47b3 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/MirrorApplicationServiceImpl.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/MirrorApplicationServiceImpl.java @@ -53,7 +53,6 @@ import org.eclipse.equinox.p2.internal.repository.mirroring.Mirroring; import org.eclipse.equinox.p2.internal.repository.tools.Activator; import org.eclipse.equinox.p2.internal.repository.tools.Messages; -import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor; import org.eclipse.equinox.p2.internal.repository.tools.SlicingOptions; import org.eclipse.equinox.p2.internal.repository.tools.XZCompressor; import org.eclipse.equinox.p2.metadata.IArtifactKey; @@ -82,6 +81,7 @@ import org.eclipse.tycho.p2.tools.mirroring.facade.MirrorApplicationService; import org.eclipse.tycho.p2.tools.mirroring.facade.MirrorOptions; import org.eclipse.tycho.p2tools.copiedfromp2.RecreateRepositoryApplication; +import org.eclipse.tycho.p2tools.copiedfromp2.RepositoryDescriptor; @Component(role = MirrorApplicationService.class) public class MirrorApplicationServiceImpl implements MirrorApplicationService { diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/TychoMirrorApplication.java b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/TychoMirrorApplication.java index 910f9242cc..950681489a 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/TychoMirrorApplication.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/TychoMirrorApplication.java @@ -38,7 +38,6 @@ import org.eclipse.equinox.internal.p2.metadata.RequiredCapability; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.core.ProvisionException; -import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor; import org.eclipse.equinox.p2.internal.repository.tools.SlicingOptions; import org.eclipse.equinox.p2.metadata.IArtifactKey; import org.eclipse.equinox.p2.metadata.IInstallableUnit; @@ -60,6 +59,7 @@ import org.eclipse.tycho.p2.tools.RepositoryReference; import org.eclipse.tycho.p2maven.ListCompositeArtifactRepository; import org.eclipse.tycho.p2tools.copiedfromp2.PermissiveSlicer; +import org.eclipse.tycho.p2tools.copiedfromp2.RepositoryDescriptor; import org.eclipse.tycho.p2tools.copiedfromp2.Slicer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/AbstractApplication.java b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/AbstractApplication.java index 52e22d35dc..23d790ce4c 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/AbstractApplication.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/AbstractApplication.java @@ -27,7 +27,6 @@ import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.internal.repository.tools.Messages; -import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.repository.ICompositeRepository; import org.eclipse.equinox.p2.repository.IRepository; diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/MirrorApplication.java b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/MirrorApplication.java index 66fd0b12c2..308d313817 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/MirrorApplication.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/MirrorApplication.java @@ -36,7 +36,6 @@ import org.eclipse.equinox.p2.internal.repository.mirroring.Mirroring; import org.eclipse.equinox.p2.internal.repository.mirroring.XMLMirrorLog; import org.eclipse.equinox.p2.internal.repository.tools.Messages; -import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor; import org.eclipse.equinox.p2.internal.repository.tools.SlicingOptions; import org.eclipse.equinox.p2.metadata.IArtifactKey; import org.eclipse.equinox.p2.metadata.IInstallableUnit; diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/Repo2Runnable.java b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/Repo2Runnable.java index 38a21b6cb3..caf7988c0d 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/Repo2Runnable.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/Repo2Runnable.java @@ -13,7 +13,7 @@ * Sonatype, Inc. - ongoing development * Red Hat, Inc. - fragment creation, Bug 460967 *******************************************************************************/ -package org.eclipse.equinox.p2.internal.repository.tools; +package org.eclipse.tycho.p2tools.copiedfromp2; import java.io.File; import java.io.FileNotFoundException; @@ -39,16 +39,15 @@ import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.equinox.frameworkadmin.BundleInfo; -import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; import org.eclipse.equinox.internal.p2.engine.DownloadManager; import org.eclipse.equinox.internal.p2.engine.InstallableUnitOperand; import org.eclipse.equinox.internal.p2.engine.InstallableUnitPhase; -import org.eclipse.equinox.internal.p2.engine.Messages; import org.eclipse.equinox.internal.p2.engine.Phase; import org.eclipse.equinox.internal.p2.engine.PhaseSet; import org.eclipse.equinox.internal.p2.engine.ProfileWriter; import org.eclipse.equinox.internal.p2.engine.ProfileXMLConstants; import org.eclipse.equinox.internal.p2.engine.phases.Collect; +import org.eclipse.equinox.internal.simpleconfigurator.manipulator.SimpleConfiguratorManipulatorImpl; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.engine.IEngine; @@ -57,7 +56,7 @@ import org.eclipse.equinox.p2.engine.IProvisioningPlan; import org.eclipse.equinox.p2.engine.ProvisioningContext; import org.eclipse.equinox.p2.engine.spi.ProvisioningAction; -import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor; +import org.eclipse.equinox.p2.internal.repository.tools.Messages; import org.eclipse.equinox.p2.metadata.IArtifactKey; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.IProvidedCapability; @@ -79,6 +78,11 @@ */ @SuppressWarnings("nls") public class Repo2Runnable extends AbstractApplication implements IApplication { + + public Repo2Runnable(IProvisioningAgent agent) { + super(agent); + } + private static final String NATIVE_ARTIFACTS = "nativeArtifacts"; //$NON-NLS-1$ private static final String NATIVE_TYPE = "org.eclipse.equinox.p2.native"; //$NON-NLS-1$ private static final String PARM_OPERAND = "operand"; //$NON-NLS-1$ @@ -226,8 +230,7 @@ public IStatus run(IProgressMonitor monitor) throws ProvisionException { } } } - SimpleConfiguratorManipulator simpleManipulator = ServiceHelper - .getService(Activator.getBundleContext(), SimpleConfiguratorManipulator.class); + SimpleConfiguratorManipulator simpleManipulator = new SimpleConfiguratorManipulatorImpl(); simpleManipulator.saveConfiguration(bundles.toArray(new BundleInfo[0]), fragmentInfo, parentDir.toURI()); } catch (FileNotFoundException e) { @@ -326,7 +329,7 @@ private IQueryResult getAllIUs(IMetadataRepository repository, * Remove the given profile from the profile registry. */ private void removeProfile(IProfile profile) throws ProvisionException { - IProfileRegistry registry = Activator.getProfileRegistry(); + IProfileRegistry registry = agent.getService(IProfileRegistry.class); registry.removeProfile(profile.getProfileId()); } @@ -339,7 +342,7 @@ private IProfile createProfile() throws ProvisionException { URIUtil.toFile(destinationArtifactRepository.getLocation()).getAbsolutePath()); properties.put(IProfile.PROP_INSTALL_FOLDER, URIUtil.toFile(destinationArtifactRepository.getLocation()).getAbsolutePath()); - IProfileRegistry registry = Activator.getProfileRegistry(); + IProfileRegistry registry = agent.getService(IProfileRegistry.class); return registry.addProfile(System.currentTimeMillis() + "-" + Math.random(), properties); //$NON-NLS-1$ } diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/RepositoryDescriptor.java b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/RepositoryDescriptor.java index 8ca70dd779..83619d33f9 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/RepositoryDescriptor.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2tools/copiedfromp2/RepositoryDescriptor.java @@ -11,126 +11,128 @@ * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ -package org.eclipse.equinox.p2.internal.repository.tools; +package org.eclipse.tycho.p2tools.copiedfromp2; import java.net.URI; + import org.eclipse.equinox.internal.p2.repository.helpers.RepositoryHelper; +import org.eclipse.equinox.p2.internal.repository.tools.Messages; import org.eclipse.equinox.p2.repository.IRepository; import org.eclipse.osgi.util.NLS; public class RepositoryDescriptor { - public static final int TYPE_BOTH = -1; - public static final String KIND_ARTIFACT = "A"; //$NON-NLS-1$ - public static final String KIND_METADATA = "M"; //$NON-NLS-1$ - - private boolean compressed = true; - private boolean append = true; - private String name = null; - private URI location = null; - private URI format = null; - private int kind = TYPE_BOTH; - private URI originalLocation = null; - private boolean optional = false; - private String atomic = null; - - public void setCompressed(boolean compress) { - compressed = compress; - } - - public void setName(String repoName) { - name = repoName; - } - - public void setOptional(boolean optional) { - this.optional = optional; - } - - public boolean isOptional() { - return optional; - } - - public void setLocation(URI repoLocation) { - originalLocation = repoLocation; - location = RepositoryHelper.localRepoURIHelper(repoLocation); - } - - public void setFormat(URI format) { - this.format = RepositoryHelper.localRepoURIHelper(format); - } - - public void setAppend(boolean appendMode) { - append = appendMode; - } - - public boolean isCompressed() { - return compressed; - } - - public boolean isAppend() { - return append; - } - - public String getName() { - return name; - } - - public URI getRepoLocation() { - return location; - } - - public URI getOriginalRepoLocation() { - return originalLocation; - } - - public URI getFormat() { - return format; - } - - public int getKind() { - return kind; - } - - public boolean isBoth() { - return kind == TYPE_BOTH; - } - - public boolean isArtifact() { - return kind == TYPE_BOTH || kind == IRepository.TYPE_ARTIFACT; - } - - public boolean isMetadata() { - return kind == TYPE_BOTH || kind == IRepository.TYPE_METADATA; - } - - public void setKind(String repoKind) { - kind = determineKind(repoKind); - } - - public void setAtomic(String booleanForAtomic) { - atomic = booleanForAtomic; - } - - public String getAtomic() { - return atomic; - } - - /* - * Determine the repository type - */ - public static int determineKind(String repoKind) { - if (kindMatches(repoKind, KIND_METADATA)) - return IRepository.TYPE_METADATA; - else if (kindMatches(repoKind, KIND_ARTIFACT)) - return IRepository.TYPE_ARTIFACT; - - throw new IllegalArgumentException(NLS.bind(Messages.unknown_repository_type, repoKind)); - } - - /* - * Determine if the repository kind matches the identifier kind - */ - public static boolean kindMatches(String repoKind, String kindIdentifier) { - return repoKind.startsWith(kindIdentifier) || repoKind.startsWith(kindIdentifier.toLowerCase()); - } + public static final int TYPE_BOTH = -1; + public static final String KIND_ARTIFACT = "A"; //$NON-NLS-1$ + public static final String KIND_METADATA = "M"; //$NON-NLS-1$ + + private boolean compressed = true; + private boolean append = true; + private String name = null; + private URI location = null; + private URI format = null; + private int kind = TYPE_BOTH; + private URI originalLocation = null; + private boolean optional = false; + private String atomic = null; + + public void setCompressed(boolean compress) { + compressed = compress; + } + + public void setName(String repoName) { + name = repoName; + } + + public void setOptional(boolean optional) { + this.optional = optional; + } + + public boolean isOptional() { + return optional; + } + + public void setLocation(URI repoLocation) { + originalLocation = repoLocation; + location = RepositoryHelper.localRepoURIHelper(repoLocation); + } + + public void setFormat(URI format) { + this.format = RepositoryHelper.localRepoURIHelper(format); + } + + public void setAppend(boolean appendMode) { + append = appendMode; + } + + public boolean isCompressed() { + return compressed; + } + + public boolean isAppend() { + return append; + } + + public String getName() { + return name; + } + + public URI getRepoLocation() { + return location; + } + + public URI getOriginalRepoLocation() { + return originalLocation; + } + + public URI getFormat() { + return format; + } + + public int getKind() { + return kind; + } + + public boolean isBoth() { + return kind == TYPE_BOTH; + } + + public boolean isArtifact() { + return kind == TYPE_BOTH || kind == IRepository.TYPE_ARTIFACT; + } + + public boolean isMetadata() { + return kind == TYPE_BOTH || kind == IRepository.TYPE_METADATA; + } + + public void setKind(String repoKind) { + kind = determineKind(repoKind); + } + + public void setAtomic(String booleanForAtomic) { + atomic = booleanForAtomic; + } + + public String getAtomic() { + return atomic; + } + + /* + * Determine the repository type + */ + public static int determineKind(String repoKind) { + if (kindMatches(repoKind, KIND_METADATA)) + return IRepository.TYPE_METADATA; + else if (kindMatches(repoKind, KIND_ARTIFACT)) + return IRepository.TYPE_ARTIFACT; + + throw new IllegalArgumentException(NLS.bind(Messages.unknown_repository_type, repoKind)); + } + + /* + * Determine if the repository kind matches the identifier kind + */ + public static boolean kindMatches(String repoKind, String kindIdentifier) { + return repoKind.startsWith(kindIdentifier) || repoKind.startsWith(kindIdentifier.toLowerCase()); + } } diff --git a/tycho-p2-repository-plugin/src/main/java/org/eclipse/tycho/plugins/p2/repository/Repo2RunnableMojo.java b/tycho-p2-repository-plugin/src/main/java/org/eclipse/tycho/plugins/p2/repository/Repo2RunnableMojo.java new file mode 100644 index 0000000000..f367e0c565 --- /dev/null +++ b/tycho-p2-repository-plugin/src/main/java/org/eclipse/tycho/plugins/p2/repository/Repo2RunnableMojo.java @@ -0,0 +1,55 @@ +package org.eclipse.tycho.plugins.p2.repository; + +import java.net.URISyntaxException; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.eclipse.core.runtime.URIUtil; +import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.tycho.p2tools.copiedfromp2.Repo2Runnable; +import org.eclipse.tycho.p2tools.copiedfromp2.RepositoryDescriptor; + +/** + * Mojo that provides the "repo2runnable" functionality described + * here. + */ +@Mojo(name = "repo-to-runnable") +public class Repo2RunnableMojo extends AbstractMojo { + + @Component + private IProvisioningAgent agent; + @Parameter + private boolean createFragments; + @Parameter + private boolean flagAsRunnable; + @Parameter + private String source; + @Parameter + private String destination; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + Repo2Runnable repo2Runnable = new Repo2Runnable(agent); + repo2Runnable.setCreateFragments(createFragments); + repo2Runnable.setFlagAsRunnable(flagAsRunnable); + RepositoryDescriptor source = new RepositoryDescriptor(); + try { + source.setLocation(URIUtil.fromString(this.source)); + } catch (URISyntaxException e) { + throw new MojoExecutionException("Invalid source: " + this.source, e); + } + repo2Runnable.addSource(source); + RepositoryDescriptor destination = new RepositoryDescriptor(); + try { + destination.setLocation(URIUtil.fromString(this.destination)); + } catch (URISyntaxException e) { + throw new MojoExecutionException("Invalid destination: " + this.destination, e); + } + repo2Runnable.addDestination(destination); + } + +}