From d8ea9aed7adce0e82564f978268b777a9c091d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Fri, 31 May 2024 10:14:26 +0200 Subject: [PATCH] Use the updated p2 metadata once the project is packed Currently Tycho always uses the INITIAL dependency metadata to compute the preliminary target platform. As this metadata can change once the project is packed (e.g. headers added / removed) this can lead to problems in plugins that depend on the changed plugin because P2 sees the updated metadata afterwards and fails. This now distinguish both cases and used the SEED metadata if the project was already packed. Fix https://github.com/eclipse-tycho/tycho/issues/3824 --- .../eclipse/tycho/ReactorProjectIdentities.java | 6 ++++++ .../tycho/p2resolver/P2GeneratorImpl.java | 3 +-- .../p2resolver/TargetPlatformFactoryImpl.java | 17 +++++++++++++++-- .../tycho-ds-dependency/.mvn/maven.config | 1 + .../tycho/test/reactor/BomCreationTest.java | 5 ++++- 5 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 tycho-its/projects/tycho-ds-dependency/.mvn/maven.config diff --git a/tycho-api/src/main/java/org/eclipse/tycho/ReactorProjectIdentities.java b/tycho-api/src/main/java/org/eclipse/tycho/ReactorProjectIdentities.java index 6dbda78107..6d3df43a89 100644 --- a/tycho-api/src/main/java/org/eclipse/tycho/ReactorProjectIdentities.java +++ b/tycho-api/src/main/java/org/eclipse/tycho/ReactorProjectIdentities.java @@ -46,4 +46,10 @@ public final int hashCode() { return Objects.hash(getArtifactId(), getGroupId(), getVersion()); } + @Override + public String toString() { + return "ReactorProjectIdentities [GroupId=" + getGroupId() + ", ArtifactId=" + getArtifactId() + ", Version=" + + getVersion() + ", Basedir=" + getBasedir() + "]"; + } + } diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2GeneratorImpl.java b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2GeneratorImpl.java index 7ba3c924d0..23e0b706f1 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2GeneratorImpl.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2GeneratorImpl.java @@ -451,8 +451,7 @@ public Map generateMetadata(MavenProject project, boolean g PublisherOptions options = new PublisherOptions(); options.setGenerateDownloadStats(generateDownloadStatsProperty); options.setGenerateChecksums(generateChecksums); - Map generatedMetadata = generateMetadata(artifacts, options, targetDir); - return generatedMetadata; + return generateMetadata(artifacts, options, targetDir); } @Override diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/TargetPlatformFactoryImpl.java b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/TargetPlatformFactoryImpl.java index 8818eb0e24..51570d6cb3 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/TargetPlatformFactoryImpl.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/TargetPlatformFactoryImpl.java @@ -561,9 +561,9 @@ private Map getPreliminaryReactorPro Map> duplicateReactorUIs = new HashMap<>(); for (ReactorProject project : reactorProjects) { - Set projectIUs = project.getDependencyMetadata(DependencyMetadataType.INITIAL); - if (projectIUs == null) { + Set projectIUs = getPreliminaryReactorProjectUIs(project); + if (projectIUs == null || projectIUs.isEmpty()) { continue; } for (IInstallableUnit iu : projectIUs) { @@ -589,6 +589,19 @@ private Map getPreliminaryReactorPro return reactorUIs; } + private Set getPreliminaryReactorProjectUIs(ReactorProject project) { + String packaging = project.getPackaging(); + if (PackagingType.TYPE_ECLIPSE_PLUGIN.equals(packaging) || PackagingType.TYPE_ECLIPSE_FEATURE.equals(packaging) + || PackagingType.TYPE_ECLIPSE_TEST_PLUGIN.equals(packaging)) { + File artifact = project.getArtifact(); + if (artifact != null && artifact.isFile()) { + //the project was already build, use the seed units as they include anything maybe updated by p2-metadata mojo + return project.getDependencyMetadata(DependencyMetadataType.SEED); + } + } + return project.getDependencyMetadata(DependencyMetadataType.INITIAL); + } + private void applyFilters(TargetPlatformFilterEvaluator filter, Collection collectionToModify, Set reactorProjectUIs, ExecutionEnvironmentResolutionHints eeResolutionHints, Set shadowedIus) { diff --git a/tycho-its/projects/tycho-ds-dependency/.mvn/maven.config b/tycho-its/projects/tycho-ds-dependency/.mvn/maven.config new file mode 100644 index 0000000000..3e8679b48c --- /dev/null +++ b/tycho-its/projects/tycho-ds-dependency/.mvn/maven.config @@ -0,0 +1 @@ +-Dtycho.localArtifacts=ignore diff --git a/tycho-its/src/test/java/org/eclipse/tycho/test/reactor/BomCreationTest.java b/tycho-its/src/test/java/org/eclipse/tycho/test/reactor/BomCreationTest.java index 7ebd6df798..6ee02906bf 100644 --- a/tycho-its/src/test/java/org/eclipse/tycho/test/reactor/BomCreationTest.java +++ b/tycho-its/src/test/java/org/eclipse/tycho/test/reactor/BomCreationTest.java @@ -19,7 +19,9 @@ import java.io.File; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.util.Collection; import java.util.List; +import java.util.Optional; import org.apache.maven.it.Verifier; import org.cyclonedx.exception.ParseException; @@ -242,7 +244,8 @@ private void verifyDependency(Dependency parent, String ref) { } private void verifyDependency(List dependencies, String ref) { - if (dependencies.stream().noneMatch(dependency -> match(dependency, ref))) { + if (Optional.ofNullable(dependencies).stream().flatMap(Collection::stream) + .noneMatch(dependency -> match(dependency, ref))) { fail("No dependency found matching: " + ref); } }