From 79e312ce83088819dfe0f02922329efe9910fe1a Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Wed, 13 Nov 2024 21:44:07 +0100 Subject: [PATCH] Fixes #1140 for reports Added an integration test + showVersionless for dependency-updates-report --- .../versions/utils/DependencyComparator.java | 21 +++++----- .../versions/utils/MavenProjectUtils.java | 10 +++++ .../child/pom.xml | 40 +++++++++++++++++++ .../invoker.properties | 2 + .../pom.xml | 37 +++++++++++++++++ .../verify.groovy | 2 + .../verify.groovy | 4 ++ .../AbstractDependencyUpdatesReport.java | 37 ++++++++++++----- .../DependencyUpdatesAggregateReport.java | 4 +- .../versions/DependencyUpdatesReport.java | 4 +- .../DisplayDependencyUpdatesMojo.java | 14 ++----- 11 files changed, 136 insertions(+), 39 deletions(-) create mode 100644 versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/child/pom.xml create mode 100644 versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/invoker.properties create mode 100644 versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/pom.xml create mode 100644 versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/verify.groovy create mode 100644 versions-maven-plugin/src/it/it-display-dependency-updates-009-processDependencyManagementTransitive-true/verify.groovy diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyComparator.java b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyComparator.java index 641c27ef69..75001c96dd 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyComparator.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/DependencyComparator.java @@ -21,9 +21,10 @@ import java.util.Comparator; -import org.apache.commons.lang3.StringUtils; import org.apache.maven.model.Dependency; +import static java.util.Optional.ofNullable; + /** * A comparator used to sort dependencies by group id, artifact id and finally version. * @@ -41,17 +42,15 @@ public enum DependencyComparator implements Comparator { */ @SuppressWarnings("checkstyle:InnerAssignment") public int compare(Dependency d1, Dependency d2) { - int r; return d1 == d2 ? 0 - : d1 == null - ? 1 - : d2 == null - ? -1 - : (r = StringUtils.compare(d1.getGroupId(), d2.getGroupId())) != 0 - ? r - : (r = StringUtils.compare(d1.getArtifactId(), d2.getArtifactId())) != 0 - ? r - : StringUtils.compare(d1.getVersion(), d2.getVersion()); + : Comparator.nullsLast(Comparator.comparing(Dependency::getGroupId) + .thenComparing( + dep -> ofNullable(dep.getArtifactId()).orElse("")) + .thenComparing( + dep -> ofNullable(dep.getClassifier()).orElse("")) + .thenComparing( + dep -> ofNullable(dep.getVersion()).orElse(""))) + .compare(d1, d2); } } diff --git a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/MavenProjectUtils.java b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/MavenProjectUtils.java index 8cef7d27d0..81d7519a43 100644 --- a/versions-common/src/main/java/org/codehaus/mojo/versions/utils/MavenProjectUtils.java +++ b/versions-common/src/main/java/org/codehaus/mojo/versions/utils/MavenProjectUtils.java @@ -33,6 +33,8 @@ import static java.util.Collections.emptyList; import static java.util.Optional.ofNullable; import static org.apache.commons.lang3.StringUtils.startsWith; +import static org.codehaus.mojo.versions.utils.DependencyBuilder.Location.ARTIFACT_ID; +import static org.codehaus.mojo.versions.utils.DependencyBuilder.Location.VERSION; /** * Utility methods for extracting dependencies from a {@link org.apache.maven.project.MavenProject} @@ -156,4 +158,12 @@ public static Dependency interpolateVersion(final Dependency dependency, final M } return dependency; } + + /** + * @return {@code true} if the version of the dependency is definned locally in the same project + */ + public static boolean dependencyVersionLocalToReactor(Dependency dependency) { + return dependency.getLocation(VERSION.toString()).getSource() + == dependency.getLocation(ARTIFACT_ID.toString()).getSource(); + } } diff --git a/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/child/pom.xml b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/child/pom.xml new file mode 100644 index 0000000000..ec887b48b0 --- /dev/null +++ b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/child/pom.xml @@ -0,0 +1,40 @@ + + + + 4.0.0 + + + localhost + parent-artifact + 1.0.0-SNAPSHOT + + + child-artifact + 1.0.0-SNAPSHOT + + + + localhost + dummy-api + + + + diff --git a/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/invoker.properties b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/invoker.properties new file mode 100644 index 0000000000..65b23c85f6 --- /dev/null +++ b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/invoker.properties @@ -0,0 +1,2 @@ +invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-updates-report -f child/pom.xml +invoker.mavenOpts = -DdependencyUpdatesReportFormats=xml -DprocessDependencyManagement=false -DprocessDependencyManagementTransitive=false -DonlyProjectDependencies=true -DonlyUpgradable=true -DshowVersionless=false diff --git a/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/pom.xml b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/pom.xml new file mode 100644 index 0000000000..9b96d98537 --- /dev/null +++ b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/pom.xml @@ -0,0 +1,37 @@ + + + + 4.0.0 + localhost + parent-artifact + 1.0.0-SNAPSHOT + pom + + + + + localhost + dummy-api + 1.0 + + + + diff --git a/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/verify.groovy b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/verify.groovy new file mode 100644 index 0000000000..6a7f59fad8 --- /dev/null +++ b/versions-maven-plugin/src/it/it-dependency-updates-report-issue-1140/verify.groovy @@ -0,0 +1,2 @@ +def output = new File(basedir, "child/target/dependency-updates-report.xml").text +assert !output.contains("dummy-api") diff --git a/versions-maven-plugin/src/it/it-display-dependency-updates-009-processDependencyManagementTransitive-true/verify.groovy b/versions-maven-plugin/src/it/it-display-dependency-updates-009-processDependencyManagementTransitive-true/verify.groovy new file mode 100644 index 0000000000..8db417fbf0 --- /dev/null +++ b/versions-maven-plugin/src/it/it-display-dependency-updates-009-processDependencyManagementTransitive-true/verify.groovy @@ -0,0 +1,4 @@ +def buildLog = new File( basedir, "build.log").text +assert buildLog =~ /\Qlocalhost:dummy-api\E\s*\.*\s*1\.1\s+->\s+3\.0/ +assert buildLog =~ /\Qlocalhost:dummy-impl\E\s*\.*\s*1\.2\s+->\s+2\.2/ +assert !(buildLog =~ /\Qlocalhost:dummy-api-impl-bom-pom\E\s*\.*\s*1\.0\s+->\s+2\.0/) diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java index 6fcf886e66..f6361ae960 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractDependencyUpdatesReport.java @@ -43,6 +43,7 @@ import org.codehaus.mojo.versions.reporting.ReportRendererFactory; import org.codehaus.mojo.versions.reporting.model.DependencyUpdatesModel; import org.codehaus.mojo.versions.utils.DependencyComparator; +import org.codehaus.mojo.versions.utils.MavenProjectUtils; import org.codehaus.mojo.versions.xml.DependencyUpdatesXmlReportRenderer; import org.codehaus.plexus.i18n.I18N; import org.eclipse.aether.RepositorySystem; @@ -80,6 +81,17 @@ public abstract class AbstractDependencyUpdatesReport extends AbstractVersionsRe @Parameter(property = "processDependencyManagementTransitive", defaultValue = "true") protected boolean processDependencyManagementTransitive; + /** + *

Include dependencies with version set in a parent or in a BOM.

+ *

This is similar to {@code processDependencyManagementTransitive}, but will + * report updates on dependencies.

+ *

Default is {@code false}.

+ * + * @since 2.18.1 + */ + @Parameter(property = "showVersionless", defaultValue = "true") + protected boolean showVersionless = true; + /** * Report formats (html and/or xml). HTML by default. */ @@ -142,17 +154,21 @@ protected void doGenerateReport(Locale locale, Sink sink) throws MavenReportExce Set dependencyManagement; if (processDependencyManagement) { - dependencyManagement = getDependencyManagement(dependencies); + dependencyManagement = getDependencyManagement(); handleOnlyProjectDependencies(dependencyManagement, dependencies); } else { dependencyManagement = Collections.emptySet(); } try { - Map dependencyUpdates = getHelper() .lookupDependenciesUpdates( - dependencies.stream().filter(d -> d.getVersion() != null), false, allowSnapshots); + dependencies.stream() + .filter(d -> d.getVersion() != null) + .filter(d -> + showVersionless || MavenProjectUtils.dependencyVersionLocalToReactor(d)), + false, + allowSnapshots); Map dependencyManagementUpdates = processDependencyManagement ? getHelper() @@ -245,7 +261,7 @@ private Set getDependencies() { /** * Implementations of {@link AbstractDependencyUpdatesReport} may use this to supply the main processing logic - * (see {@link #getDependencyManagement(Set)}) with desired dependency data, which will be used + * (see {@link #getDependencyManagement()}) with desired dependency data, which will be used * in the creation of the report. * * @param dependenciesCollector, a Set, initialized with a DependencyComparator @@ -259,27 +275,26 @@ private Set getDependencies() { * in projects dependencyManagement section. * * @return a {@link Set} that can be additionally populated by - * {@link #populateDependencyManagement(Set, Set)}. If not, an empty set is returned + * {@link #populateDependencyManagement(Set)}. If not, an empty set is returned * */ - private Set getDependencyManagement(Set dependencies) throws MavenReportException { + private Set getDependencyManagement() throws MavenReportException { final Set dependencyManagementCollector = new TreeSet<>(DEPENDENCY_COMPARATOR); - populateDependencyManagement(dependencyManagementCollector, dependencies); + populateDependencyManagement(dependencyManagementCollector); return dependencyManagementCollector; } /** * Implementations of {@link AbstractDependencyUpdatesReport} may use this to supply the main processing logic - * (see {@link #getDependencyManagement(Set)}) with desired managed dependencies data, which will be used + * (see {@link #getDependencyManagement()}) with desired managed dependencies data, which will be used * in the creation of the report. * * @param dependencyManagementCollector, a Set initialized with a DependencyComparator - * @param dependencies an already populated set of dependencies(non-managed) * comparator. * * @throws MavenReportException when things go wrong. * */ - protected abstract void populateDependencyManagement( - Set dependencyManagementCollector, Set dependencies) throws MavenReportException; + protected abstract void populateDependencyManagement(Set dependencyManagementCollector) + throws MavenReportException; private void renderReport(Locale locale, Sink sink, DependencyUpdatesModel model) throws MavenReportException { for (String format : formats) { diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java index efc92e5665..ab794ffa38 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesAggregateReport.java @@ -27,7 +27,6 @@ import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; -import org.apache.maven.reporting.MavenReportException; import org.apache.maven.wagon.Wagon; import org.codehaus.mojo.versions.reporting.ReportRendererFactory; import org.codehaus.mojo.versions.reporting.util.AggregateReportUtils; @@ -71,8 +70,7 @@ protected void populateDependencies(Set dependenciesCollector) { * {@inheritDoc} * */ @Override - protected void populateDependencyManagement( - Set dependencyManagementCollector, Set dependencies) throws MavenReportException { + protected void populateDependencyManagement(Set dependencyManagementCollector) { for (MavenProject project : AggregateReportUtils.getProjectsToProcess(getProject())) { getLog().debug(String.format("Collecting managed dependencies for project %s", project.getName())); handleDependencyManagementTransitive(project, dependencyManagementCollector); diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java index 7427ee5d28..bcd4208f95 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReport.java @@ -28,7 +28,6 @@ import org.apache.maven.model.Dependency; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.reporting.MavenReportException; import org.apache.maven.wagon.Wagon; import org.codehaus.mojo.versions.reporting.ReportRendererFactory; import org.codehaus.plexus.i18n.I18N; @@ -67,8 +66,7 @@ protected void populateDependencies(Set dependenciesCollector) { * {@inheritDoc} * */ @Override - protected void populateDependencyManagement( - Set dependencyManagementCollector, Set dependencies) throws MavenReportException { + protected void populateDependencyManagement(Set dependencyManagementCollector) { if (hasDependencyManagement(getProject())) { getLog().debug(String.format( "Collecting managed dependencies for project %s", diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java index ecf370aa56..94ef2c837b 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java @@ -45,13 +45,12 @@ import org.codehaus.mojo.versions.internal.DependencyUpdatesLoggingHelper.DependencyUpdatesResult; import org.codehaus.mojo.versions.rewriting.MutableXMLStreamReader; import org.codehaus.mojo.versions.utils.DependencyComparator; +import org.codehaus.mojo.versions.utils.MavenProjectUtils; import org.codehaus.mojo.versions.utils.SegmentUtils; import org.eclipse.aether.RepositorySystem; import static java.util.Collections.emptySet; import static org.codehaus.mojo.versions.filtering.DependencyFilter.filterDependencies; -import static org.codehaus.mojo.versions.utils.DependencyBuilder.Location.ARTIFACT_ID; -import static org.codehaus.mojo.versions.utils.DependencyBuilder.Location.VERSION; import static org.codehaus.mojo.versions.utils.MavenProjectUtils.extractDependenciesFromDependencyManagement; import static org.codehaus.mojo.versions.utils.MavenProjectUtils.extractDependenciesFromPlugins; import static org.codehaus.mojo.versions.utils.MavenProjectUtils.extractPluginDependenciesFromPluginsInPluginManagement; @@ -371,14 +370,6 @@ public boolean isVerbose() { // --------------------- Interface Mojo --------------------- - /** - * @return {@code true} if the version of the dependency is definned locally in the same project - */ - private static boolean dependencyVersionLocalToReactor(Dependency dependency) { - return dependency.getLocation(VERSION.toString()).getSource() - == dependency.getLocation(ARTIFACT_ID.toString()).getSource(); - } - /** * @throws org.apache.maven.plugin.MojoExecutionException when things go wrong * @throws org.apache.maven.plugin.MojoFailureException when things go wrong in a very bad way @@ -421,7 +412,8 @@ public void execute() throws MojoExecutionException, MojoFailureException { .noneMatch(depMan -> dependenciesMatch(dep, depMan))) .filter(dep -> showVersionless - || dependencyVersionLocalToReactor(dep)) + || MavenProjectUtils + .dependencyVersionLocalToReactor(dep)) .collect( () -> new TreeSet<>( DependencyComparator.INSTANCE),