From a758b4b33e472e2ff6179f16479ccdb687fa171e Mon Sep 17 00:00:00 2001 From: Andrzej Jarmoniuk Date: Sat, 17 Dec 2022 08:36:14 +0100 Subject: [PATCH] [MENFORCER-435] Scope TEST and Optional should only apply to DependencyConvergence --- .../enforcer/DependencyConvergence.java | 24 ++++++++++++++++- .../enforcer/utils/ArtifactMatcher.java | 5 +--- .../plugins/enforcer/utils/ArtifactUtils.java | 27 +++++-------------- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java index 159a2dc1..cc7e76ef 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DependencyConvergence.java @@ -21,13 +21,18 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.apache.maven.artifact.Artifact; import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugins.enforcer.utils.ArtifactUtils; import org.apache.maven.plugins.enforcer.utils.DependencyVersionMap; +import org.eclipse.aether.collection.DependencyCollectionContext; +import org.eclipse.aether.collection.DependencySelector; +import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; /** * @author Rex Hoffman @@ -53,7 +58,24 @@ public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException { log = helper.getLog(); } try { - DependencyNode node = ArtifactUtils.resolveTransitiveDependencies(helper); + DependencyNode node = ArtifactUtils.resolveTransitiveDependencies( + helper, + // TODO: use a modified version of ExclusionDependencySelector to process excludes and includes + new DependencySelector() { + @Override + public boolean selectDependency(Dependency dependency) { + // regular OptionalDependencySelector only discriminates optional dependencies at level 2+ + return !dependency.isOptional() + // regular ScopeDependencySelector is case-sensitive + && !dependency.getScope().equalsIgnoreCase(Artifact.SCOPE_TEST); + } + + @Override + public DependencySelector deriveChildSelector(DependencyCollectionContext context) { + return this; + } + }, + new ExclusionDependencySelector()); dependencyVersionMap = new DependencyVersionMap(log).setUniqueVersions(uniqueVersions); node.accept(dependencyVersionMap); diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java index 13b2b9ec..ced0d8ea 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactMatcher.java @@ -125,11 +125,8 @@ private boolean match( case 3: if (!matches(parts[2], version)) { - // CHECKSTYLE_OFF: LineLength if (!AbstractVersionEnforcer.containsVersion( - VersionRange.createFromVersionSpec(parts[2]), new DefaultArtifactVersion(version))) - // CHECKSTYLE_ON: LineLength - { + VersionRange.createFromVersionSpec(parts[2]), new DefaultArtifactVersion(version))) { return false; } } diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactUtils.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactUtils.java index d5b9fd23..c95c1e40 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactUtils.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ArtifactUtils.java @@ -42,15 +42,11 @@ import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.artifact.ArtifactTypeRegistry; import org.eclipse.aether.collection.CollectRequest; -import org.eclipse.aether.collection.DependencyCollectionContext; import org.eclipse.aether.collection.DependencyCollectionException; import org.eclipse.aether.collection.DependencySelector; -import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; import org.eclipse.aether.util.graph.selector.AndDependencySelector; -import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; -import org.eclipse.aether.util.graph.selector.OptionalDependencySelector; import org.eclipse.aether.util.graph.transformer.ConflictResolver; import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver; import org.eclipse.aether.util.graph.transformer.JavaScopeSelector; @@ -98,10 +94,13 @@ public static org.eclipse.aether.artifact.Artifact toArtifact(Artifact artifact) * Retrieves the {@link DependencyNode} instance containing the result of the transitive dependency * for the current {@link MavenProject}. * + * @param helper (may not be null) an instance of the {@link EnforcerRuleHelper} class + * @param selectors zero or more {@link DependencySelector} instances * @return a Dependency Node which is the root of the project's dependency tree * @throws EnforcerRuleException thrown if the lookup fails */ - public static DependencyNode resolveTransitiveDependencies(EnforcerRuleHelper helper) throws EnforcerRuleException { + public static DependencyNode resolveTransitiveDependencies( + EnforcerRuleHelper helper, DependencySelector... selectors) throws EnforcerRuleException { try { RepositorySystem repositorySystem = helper.getComponent(RepositorySystem.class); MavenSession session = (MavenSession) helper.evaluate("${session}"); @@ -116,23 +115,11 @@ public static DependencyNode resolveTransitiveDependencies(EnforcerRuleHelper he new JavaScopeSelector(), new SimpleOptionalitySelector(), new JavaScopeDeriver())); - repositorySystemSession.setDependencySelector(new AndDependencySelector( - new DependencySelector() { - @Override - public boolean selectDependency(Dependency dependency) { - return !dependency.isOptional() - && !dependency.getScope().equalsIgnoreCase(Artifact.SCOPE_TEST); - } - - @Override - public DependencySelector deriveChildSelector(DependencyCollectionContext context) { - return this; - } - }, - new OptionalDependencySelector(), - new ExclusionDependencySelector())); repositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true); repositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true); + if (selectors.length > 0) { + repositorySystemSession.setDependencySelector(new AndDependencySelector(selectors)); + } CollectRequest collectRequest = new CollectRequest( project.getDependencies().stream()