Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[tycho-4.0.x] Consider Source-Unit version when adding sources to a P2-repo #2743

Merged
merged 1 commit into from
Sep 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.equinox.internal.p2.director.PermissiveSlicer;
Expand All @@ -36,6 +37,7 @@
import org.eclipse.equinox.p2.metadata.IRequirement;
import org.eclipse.equinox.p2.metadata.expression.IMatchExpression;
import org.eclipse.equinox.p2.query.CollectionResult;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.IQueryable;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.IRepository;
Expand All @@ -50,6 +52,7 @@
public class TychoMirrorApplication extends org.eclipse.tycho.p2tools.copiedfromp2.MirrorApplication {

private static final String SOURCE_SUFFIX = ".source";
private static final String FEATURE_GROUP = ".feature.group";
private final Map<String, String> extraArtifactRepositoryProperties;
private final List<RepositoryReference> repositoryReferences;
private boolean includeAllSource;
Expand Down Expand Up @@ -91,7 +94,7 @@ protected boolean isApplicable(IInstallableUnit iu, IRequirement req) {
if ((includeRequiredBundles || includeRequiredFeatures) && QueryUtil.isGroup(iu)) {
if (req instanceof IRequiredCapability capability) {
if (IInstallableUnit.NAMESPACE_IU_ID.equals(capability.getNamespace())) {
boolean isFeature = capability.getName().endsWith(".feature.group");
boolean isFeature = capability.getName().endsWith(FEATURE_GROUP);
if ((isFeature && includeRequiredFeatures) || (!isFeature && includeRequiredBundles)) {
if (!includeOptionalDependencies) {
if (req.getMin() == 0) {
Expand Down Expand Up @@ -130,19 +133,20 @@ public IQueryable<IInstallableUnit> slice(IInstallableUnit[] ius, IProgressMonit
if (includeAllSource && targetPlatform != null) {
Set<IInstallableUnit> collected = slice.query(QueryUtil.ALL_UNITS, null).toSet();
Set<IInstallableUnit> result = new HashSet<>(collected);
Map<String, IInstallableUnit> sourceIus = new HashMap<>();
targetPlatform.getMetadataRepository().query(QueryUtil.ALL_UNITS, null).forEach(iu -> {
if (iu.getId().endsWith(SOURCE_SUFFIX)) {
sourceIus.put(iu.getId(), iu);
}
});
IQueryResult<IInstallableUnit> query = targetPlatform.getMetadataRepository()
.query(QueryUtil.ALL_UNITS, null);
Map<String, List<IInstallableUnit>> sourceIus = StreamSupport.stream(query.spliterator(), false)
.filter(iu -> iu.getId().endsWith(SOURCE_SUFFIX))
.collect(Collectors.groupingBy(IInstallableUnit::getId));
for (IInstallableUnit iu : collected) {
String sourceId = iu.getId().endsWith(".feature.group")
? iu.getId().replaceAll(".feature.group", SOURCE_SUFFIX)
: iu.getId() + SOURCE_SUFFIX;
IInstallableUnit sourceUnit = sourceIus.get(sourceId);
if (sourceUnit != null) {
result.add(sourceUnit);
String id = iu.getId();
String sourceId = id.endsWith(FEATURE_GROUP)
? id.substring(id.length() - FEATURE_GROUP.length()) + SOURCE_SUFFIX
: id + SOURCE_SUFFIX;
List<IInstallableUnit> sourceUnits = sourceIus.get(sourceId);
if (sourceUnits != null) {
sourceUnits.stream().filter(su -> su.getVersion().equals(iu.getVersion())) //
.findFirst().ifPresent(result::add);
}
}
return new CollectionResult<>(result);
Expand Down
16 changes: 16 additions & 0 deletions tycho-its/projects/p2Repository.includeAllSources/Maven.target
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,21 @@
<repository location="https://download.eclipse.org/eclipse/updates/4.25/R-4.25-202208311800"/>
<unit id="org.apache.batik.css" version="0.0.0"/>
</location>
<location includeDependencyDepth="none" includeDependencyScopes="compile" includeSource="true" missingManifest="error" type="Maven">
<dependencies>
<dependency>
<groupId>org.opentest4j</groupId>
<artifactId>opentest4j</artifactId>
<version>1.3.0</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.opentest4j</groupId>
<artifactId>opentest4j</artifactId>
<version>1.2.0</version>
<type>jar</type>
</dependency>
</dependencies>
</location>
</locations>
</target>
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site>
<bundle id="org.apache.batik.css"/>
<bundle id="org.opentest4j" version="1.3.0"/>
<bundle id="org.opentest4j" version="1.2.0"/>
</site>
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*******************************************************************************/
package org.eclipse.tycho.test.p2Repository;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThrows;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
Expand All @@ -29,7 +31,7 @@ public class IncludeAllSourcesTest extends AbstractTychoIntegrationTest {

@Test
public void testSourceInclusion() throws Exception {
Verifier verifier = new IncludeAllSourcesTest().getVerifier("p2Repository.includeAllSources", false);
Verifier verifier = getVerifier("p2Repository.includeAllSources", false);
verifier.executeGoal("verify");
// Missing source should never trigger an error
verifier.verifyErrorFreeLog();
Expand All @@ -42,11 +44,13 @@ public void testSourceInclusion() throws Exception {
assertThrows(AssertionError.class, () -> {
p2Repo.getUniqueIU("org.apache.commons.commons-io.source");
});
// test inclusion of sources for multiple version of the main/source artifact
assertThat(p2Repo.getUnitVersions("org.opentest4j.source"), containsInAnyOrder("1.2.0", "1.3.0"));
}

@Test
public void testIncludeAllSourcesFromOldOrbit() throws Exception {
Verifier verifier = new IncludeAllSourcesTest().getVerifier("p2Repository.includeAllSources.oldOrbit", false);
Verifier verifier = getVerifier("p2Repository.includeAllSources.oldOrbit", false);
File localRepository = new File(verifier.getLocalRepository());
File indexFile = new File(localRepository, FileBasedTychoRepositoryIndex.ARTIFACTS_INDEX_RELPATH);
if (indexFile.exists()) {
Expand Down