From 78488535e0cfc37e26707c12d944ff8437b94fc4 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Fri, 24 Mar 2023 22:03:35 +0100 Subject: [PATCH] [MENFORCER-276] Allow ignoring dependency scopes in RequireUpperBoundDeps --- .../dependency/RequireUpperBoundDeps.java | 11 ++- .../src/site/apt/requireUpperBoundDeps.apt.vm | 17 ++++ .../dependency/RequireUpperBoundDepsTest.java | 4 + ...container-default-1.0-alpha-9-stable-1.pom | 2 +- .../repository/menforcer138_utils-1.0.4.pom | 4 +- .../invoker.properties | 18 ++++ .../pom.xml | 83 +++++++++++++++++++ .../verify.groovy | 26 ++++++ 8 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/invoker.properties create mode 100644 maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/pom.xml create mode 100644 maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/verify.groovy 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 8bc9a113..85abf2b2 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 @@ -73,6 +73,11 @@ public final class RequireUpperBoundDeps extends AbstractStandardEnforcerRule { */ private List includes = null; + /** + * Scope to exclude. + */ + private List excludedScopes = Arrays.asList(SCOPE_TEST, SCOPE_PROVIDED); + private RequireUpperBoundDepsVisitor upperBoundDepsVisitor; private final ResolverUtil resolverUtil; @@ -101,14 +106,14 @@ public void setIncludes(List includes) { @Override public void execute() throws EnforcerRuleException { - DependencyNode node = - resolverUtil.resolveTransitiveDependenciesVerbose(Arrays.asList(SCOPE_TEST, SCOPE_PROVIDED)); + DependencyNode node = resolverUtil.resolveTransitiveDependenciesVerbose(excludedScopes); upperBoundDepsVisitor = new RequireUpperBoundDepsVisitor() .setUniqueVersions(uniqueVersions) .setIncludes(includes); + getLog().debug(() -> resolverUtil.dumpTree(node)); node.accept(upperBoundDepsVisitor); List errorMessages = buildErrorMessages(upperBoundDepsVisitor.getConflicts()); - if (errorMessages.size() > 0) { + if (!errorMessages.isEmpty()) { throw new EnforcerRuleException( "Failed while enforcing RequireUpperBoundDeps. The error(s) are " + errorMessages); } diff --git a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm index cf53856f..802bdfe1 100644 --- a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm +++ b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm @@ -29,6 +29,18 @@ information about Maven dependency resolution, see {{{http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html}the Maven site}}. + The following parameters are supported by this rule: + + * <> - if SNAPSHOTs should be compared by their timestamped version or not. Default: <<>> + + * <> - specify the dependencies that will be ignored. The format is <<>> + + * <> - specify the dependencies that will be checked. If not empty only these will be checked. The format is <<>> + + * <> - a list of dependency scope which will be excluded. Default: <<>>, <<>> + + [] + Here is a concrete example. This will cause a build to fail: ----------------------------------------------------------------------------------- @@ -114,6 +126,11 @@ and com.google.guava:guava --> + 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 a4aa4744..a6d5f2c0 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 @@ -18,6 +18,7 @@ */ package org.apache.maven.enforcer.rules.dependency; +import org.apache.maven.enforcer.rule.api.EnforcerLogger; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rules.utils.DependencyNodeBuilder; import org.junit.jupiter.api.Test; @@ -28,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -42,6 +44,8 @@ class RequireUpperBoundDepsTest { @Test void testRule() throws Exception { + rule.setLog(mock(EnforcerLogger.class)); + when(resolverUtil.resolveTransitiveDependenciesVerbose(anyList())) .thenReturn(new DependencyNodeBuilder() .withType(DependencyNodeBuilder.Type.POM) diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_container-default-1.0-alpha-9-stable-1.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_container-default-1.0-alpha-9-stable-1.pom index de898f99..69121011 100644 --- a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_container-default-1.0-alpha-9-stable-1.pom +++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_container-default-1.0-alpha-9-stable-1.pom @@ -27,7 +27,7 @@ org.apache.maven.plugins.enforcer.its - menforcer1308_utils + menforcer138_utils 1.0.4 diff --git a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-1.0.4.pom b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-1.0.4.pom index 44a20975..f0c89e04 100644 --- a/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-1.0.4.pom +++ b/maven-enforcer-plugin/src/it/mrm/repository/menforcer138_utils-1.0.4.pom @@ -21,6 +21,6 @@ 4.0.0 org.apache.maven.plugins.enforcer.its - menforcer1308_utils + menforcer138_utils 1.0.4 - \ No newline at end of file + diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/invoker.properties new file mode 100644 index 00000000..66b78c06 --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/invoker.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +invoker.buildResult=failure diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/pom.xml new file mode 100644 index 00000000..08b385f4 --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/pom.xml @@ -0,0 +1,83 @@ + + + + 4.0.0 + org.apache.maven.enforcer.its + require-upper-bound-dependencies-scope-change + 1.0-SNAPSHOT + + + + + org.apache.maven.plugins + maven-enforcer-plugin + @project.version@ + + + enforce + + enforce + + + + + + + test + + + + + + + + + + + + + org.apache.maven.plugins.enforcer.its + menforcer128_api + 1.4.0 + provided + + + + org.apache.maven.plugins.enforcer.its + menforcer466_requires_api150 + 1.0 + + + + org.apache.maven.plugins.enforcer.its + menforcer138_utils + 1.0.4 + test + + + + org.apache.maven.plugins.enforcer.its + menforcer466_requires_utils30 + 1.0 + + + + diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/verify.groovy new file mode 100644 index 00000000..0df5839d --- /dev/null +++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-dependencies-scope-change/verify.groovy @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +def buildLog = new File( basedir, 'build.log' ).text + +assert buildLog.contains( 'Rule 0: org.apache.maven.enforcer.rules.dependency.RequireUpperBoundDeps failed with message:' ) + +assert buildLog.contains('[ERROR] Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 [provided] paths to dependency are:') + +assert !buildLog.contains('[ERROR] Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer138_utils:1.0.4')