This is an automated email from the ASF dual-hosted git repository. sjaranowski pushed a commit to branch MENFORCER-474 in repository https://gitbox.apache.org/repos/asf/maven-enforcer.git
commit dde70e50a0436655ed5f589985f9d0607949d9c3 Author: Slawomir Jaranowski <s.jaranow...@gmail.com> AuthorDate: Sun Mar 19 09:54:33 2023 +0100 [MENFORCER-474] Filter dependency by scope on project level We should filter dependencies scopes on project level, for transitive dependency tree we should not change defaults selectors. --- .../rules/dependency/BannedDependenciesBase.java | 3 +- .../rules/dependency/DependencyConvergence.java | 8 +-- .../rules/dependency/RequireUpperBoundDeps.java | 10 +-- .../enforcer/rules/dependency/ResolveUtil.java | 71 +++++++++++----------- .../rules/dependency/BannedDependenciesTest.java | 5 +- .../rules/dependency/RequireReleaseDepsTest.java | 19 +++--- .../dependency/RequireUpperBoundDepsTest.java | 4 +- 7 files changed, 60 insertions(+), 60 deletions(-) diff --git a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java index 90691c2..bed32d1 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java @@ -18,6 +18,7 @@ */ package org.apache.maven.enforcer.rules.dependency; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -102,7 +103,7 @@ abstract class BannedDependenciesBase extends AbstractStandardEnforcerRule { } } else { StringBuilder messageBuilder = new StringBuilder(); - DependencyNode rootNode = resolveUtil.resolveTransitiveDependenciesVerbose(); + DependencyNode rootNode = resolveUtil.resolveTransitiveDependenciesVerbose(Collections.emptyList()); if (!validate(rootNode, 0, messageBuilder)) { String message = ""; if (getMessage() != null) { diff --git a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java index 13e22c6..0c36df7 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java @@ -29,11 +29,8 @@ import java.util.Objects; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rules.AbstractStandardEnforcerRule; -import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsOptionalDependencySelector; -import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsScopeDependencySelector; import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.eclipse.aether.graph.DependencyNode; -import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; import static org.apache.maven.artifact.Artifact.SCOPE_PROVIDED; import static org.apache.maven.artifact.Artifact.SCOPE_TEST; @@ -68,10 +65,7 @@ public final class DependencyConvergence extends AbstractStandardEnforcerRule { @Override public void execute() throws EnforcerRuleException { - DependencyNode node = resolveUtil.resolveTransitiveDependenciesVerbose( - new AllLevelsOptionalDependencySelector(), - new AllLevelsScopeDependencySelector(excludedScopes), - new ExclusionDependencySelector()); + DependencyNode node = resolveUtil.resolveTransitiveDependenciesVerbose(excludedScopes); dependencyVersionMap = new DependencyVersionMap().setUniqueVersions(uniqueVersions); node.accept(dependencyVersionMap); diff --git a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java index 50e054b..04e35f0 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java @@ -22,6 +22,7 @@ import javax.inject.Inject; import javax.inject.Named; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -34,15 +35,12 @@ import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rules.AbstractStandardEnforcerRule; -import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsOptionalDependencySelector; -import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsScopeDependencySelector; import org.apache.maven.enforcer.rules.utils.ArtifactUtils; import org.apache.maven.enforcer.rules.utils.ParentNodeProvider; import org.apache.maven.enforcer.rules.utils.ParentsVisitor; import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.graph.DependencyVisitor; import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; -import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; import static org.apache.maven.artifact.Artifact.SCOPE_PROVIDED; import static org.apache.maven.artifact.Artifact.SCOPE_TEST; @@ -103,10 +101,8 @@ public final class RequireUpperBoundDeps extends AbstractStandardEnforcerRule { @Override public void execute() throws EnforcerRuleException { - DependencyNode node = resolveUtil.resolveTransitiveDependenciesVerbose( - new AllLevelsOptionalDependencySelector(), - new AllLevelsScopeDependencySelector(SCOPE_TEST, SCOPE_PROVIDED), - new ExclusionDependencySelector()); + DependencyNode node = + resolveUtil.resolveTransitiveDependenciesVerbose(Arrays.asList(SCOPE_TEST, SCOPE_PROVIDED)); upperBoundDepsVisitor = new RequireUpperBoundDepsVisitor() .setUniqueVersions(uniqueVersions) .setIncludes(includes); diff --git a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java index 19d4a20..bb0179f 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java +++ b/enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java @@ -21,27 +21,30 @@ package org.apache.maven.enforcer.rules.dependency; import javax.inject.Inject; import javax.inject.Named; +import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import org.apache.maven.RepositoryUtils; -import org.apache.maven.artifact.Artifact; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.DependencyManagement; import org.apache.maven.project.MavenProject; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.ArtifactTypeRegistry; import org.eclipse.aether.collection.CollectRequest; 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.transformer.ConflictResolver; import static java.util.Optional.ofNullable; +import static org.apache.maven.artifact.Artifact.SCOPE_PROVIDED; +import static org.apache.maven.artifact.Artifact.SCOPE_TEST; /** * Resolver helper class. @@ -72,59 +75,59 @@ class ResolveUtil { * Please consult {@link ConflictResolver} and {@link DependencyManagerUtils}> * </p> * - * @param selectors zero or more {@link DependencySelector} instances + * @param excludedScopes a project dependency scope to excluded * @return a Dependency Node which is the root of the project's dependency tree * @throws EnforcerRuleException thrown if the lookup fails */ - DependencyNode resolveTransitiveDependenciesVerbose(DependencySelector... selectors) throws EnforcerRuleException { - return resolveTransitiveDependencies(true, selectors); + DependencyNode resolveTransitiveDependenciesVerbose(List<String> excludedScopes) throws EnforcerRuleException { + return resolveTransitiveDependencies(true, true, excludedScopes); } /** * Retrieves the {@link DependencyNode} instance containing the result of the transitive dependency * for the current {@link MavenProject}. * - * @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 */ - DependencyNode resolveTransitiveDependencies(DependencySelector... selectors) throws EnforcerRuleException { - return resolveTransitiveDependencies(false, selectors); + DependencyNode resolveTransitiveDependencies() throws EnforcerRuleException { + return resolveTransitiveDependencies(false, true, Arrays.asList(SCOPE_TEST, SCOPE_PROVIDED)); } - private DependencyNode resolveTransitiveDependencies(boolean verbose, DependencySelector... selectors) - throws EnforcerRuleException { + private DependencyNode resolveTransitiveDependencies( + boolean verbose, boolean excludeOptional, List<String> excludedScopes) throws EnforcerRuleException { try { + RepositorySystemSession repositorySystemSession = session.getRepositorySession(); + + if (verbose) { + DefaultRepositorySystemSession defaultRepositorySystemSession = + new DefaultRepositorySystemSession(repositorySystemSession); + defaultRepositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true); + defaultRepositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true); + repositorySystemSession = defaultRepositorySystemSession; + } + MavenProject project = session.getCurrentProject(); ArtifactTypeRegistry artifactTypeRegistry = session.getRepositorySession().getArtifactTypeRegistry(); - DefaultRepositorySystemSession repositorySystemSession = - new DefaultRepositorySystemSession(session.getRepositorySession()); - - if (selectors.length > 0) { - repositorySystemSession.setDependencySelector(new AndDependencySelector(selectors)); - } + List<Dependency> dependencies = project.getDependencies().stream() + .filter(d -> !(excludeOptional && d.isOptional())) + .filter(d -> !excludedScopes.contains(d.getScope())) + .map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry)) + .collect(Collectors.toList()); - if (verbose) { - repositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true); - repositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true); - } - - CollectRequest collectRequest = new CollectRequest( - project.getDependencies().stream() + List<Dependency> managedDependencies = ofNullable(project.getDependencyManagement()) + .map(DependencyManagement::getDependencies) + .map(list -> list.stream() .map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry)) - .collect(Collectors.toList()), - ofNullable(project.getDependencyManagement()) - .map(DependencyManagement::getDependencies) - .map(list -> list.stream() - .map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry)) - .collect(Collectors.toList())) - .orElse(null), - project.getRemoteProjectRepositories()); - Artifact artifact = project.getArtifact(); - collectRequest.setRootArtifact(RepositoryUtils.toArtifact(artifact)); + .collect(Collectors.toList())) + .orElse(null); + + CollectRequest collectRequest = + new CollectRequest(dependencies, managedDependencies, project.getRemoteProjectRepositories()); + collectRequest.setRootArtifact(RepositoryUtils.toArtifact(project.getArtifact())); return repositorySystem .collectDependencies(repositorySystemSession, collectRequest) diff --git a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java index 1888357..b5d7c81 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java @@ -32,6 +32,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThatCode; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.when; /** @@ -94,7 +95,7 @@ class BannedDependenciesTest { @Test void excludesUseTransitiveDependencies() throws Exception { - when(resolveUtil.resolveTransitiveDependenciesVerbose()) + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) .thenReturn(new DependencyNodeBuilder() .withType(DependencyNodeBuilder.Type.POM) .withChildNode(new DependencyNodeBuilder() @@ -127,7 +128,7 @@ class BannedDependenciesTest { @Test void excludesAndIncludesUseTransitiveDependencies() throws Exception { - when(resolveUtil.resolveTransitiveDependenciesVerbose()) + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) .thenReturn(new DependencyNodeBuilder() .withType(DependencyNodeBuilder.Type.POM) .withChildNode(new DependencyNodeBuilder() diff --git a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java index 5a0b76f..b3377ed 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireReleaseDepsTest.java @@ -37,6 +37,7 @@ import static org.apache.maven.enforcer.rules.EnforcerTestUtils.getDependencyNod import static org.apache.maven.enforcer.rules.EnforcerTestUtils.getDependencyNodeWithMultipleTestSnapshots; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; @@ -80,7 +81,8 @@ class RequireReleaseDepsTest { @Test void testSearchTransitiveMultipleFailures() throws Exception { - when(resolveUtil.resolveTransitiveDependenciesVerbose()).thenReturn(getDependencyNodeWithMultipleSnapshots()); + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) + .thenReturn(getDependencyNodeWithMultipleSnapshots()); rule.setSearchTransitive(true); assertThatCode(rule::execute) @@ -94,7 +96,8 @@ class RequireReleaseDepsTest { @Test void testSearchTransitiveNoFailures() throws Exception { when(session.getCurrentProject()).thenReturn(project); - when(resolveUtil.resolveTransitiveDependenciesVerbose()).thenReturn(new DependencyNodeBuilder().build()); + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) + .thenReturn(new DependencyNodeBuilder().build()); rule.setSearchTransitive(true); assertThatCode(rule::execute).doesNotThrowAnyException(); @@ -114,7 +117,7 @@ class RequireReleaseDepsTest { @Test void testWildcardExcludeTests() throws Exception { when(session.getCurrentProject()).thenReturn(project); - when(resolveUtil.resolveTransitiveDependenciesVerbose()) + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) .thenReturn(getDependencyNodeWithMultipleTestSnapshots()); rule.setExcludes(Collections.singletonList("*:*:*:*:test")); @@ -126,7 +129,7 @@ class RequireReleaseDepsTest { @Test void testWildcardExcludeAll() throws Exception { when(session.getCurrentProject()).thenReturn(project); - when(resolveUtil.resolveTransitiveDependenciesVerbose()) + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) .thenReturn(getDependencyNodeWithMultipleTestSnapshots()); rule.setExcludes(Collections.singletonList("*")); @@ -137,7 +140,7 @@ class RequireReleaseDepsTest { @Test void testExcludesAndIncludes() throws Exception { - when(resolveUtil.resolveTransitiveDependenciesVerbose()) + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) .thenReturn(getDependencyNodeWithMultipleTestSnapshots()); rule.setExcludes(Collections.singletonList("*")); @@ -164,7 +167,8 @@ class RequireReleaseDepsTest { void testFailWhenParentIsSnapshot() throws Exception { when(session.getCurrentProject()).thenReturn(project); when(project.getParentArtifact()).thenReturn(ARTIFACT_STUB_FACTORY.getSnapshotArtifact()); - when(resolveUtil.resolveTransitiveDependenciesVerbose()).thenReturn(new DependencyNodeBuilder().build()); + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) + .thenReturn(new DependencyNodeBuilder().build()); rule.setFailWhenParentIsSnapshot(true); @@ -177,7 +181,8 @@ class RequireReleaseDepsTest { void parentShouldBeExcluded() throws Exception { when(session.getCurrentProject()).thenReturn(project); when(project.getParentArtifact()).thenReturn(ARTIFACT_STUB_FACTORY.getSnapshotArtifact()); - when(resolveUtil.resolveTransitiveDependenciesVerbose()).thenReturn(new DependencyNodeBuilder().build()); + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) + .thenReturn(new DependencyNodeBuilder().build()); rule.setFailWhenParentIsSnapshot(true); rule.setExcludes(Collections.singletonList("testGroupId:*")); diff --git a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java index ac66f0d..07a56df 100644 --- a/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java +++ b/enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDepsTest.java @@ -27,7 +27,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThatCode; -import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -42,7 +42,7 @@ class RequireUpperBoundDepsTest { @Test void testRule() throws Exception { - when(resolveUtil.resolveTransitiveDependenciesVerbose(any(), any(), any())) + when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList())) .thenReturn(new DependencyNodeBuilder() .withType(DependencyNodeBuilder.Type.POM) .withChildNode(new DependencyNodeBuilder()