Skip to content

Commit

Permalink
[MENFORCER-435] Scope TEST and Optional should only apply to Dependen…
Browse files Browse the repository at this point in the history
…cyConvergence
  • Loading branch information
jarmoniuk committed Dec 17, 2022
1 parent 68d0a84 commit a758b4b
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 <a href="mailto:rex@e-hoffman.org">Rex Hoffman</a>
Expand All @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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}");
Expand All @@ -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()
Expand Down

0 comments on commit a758b4b

Please sign in to comment.