You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ponymail.apache.org by se...@apache.org on 2020/09/02 13:43:10 UTC
[incubator-ponymail-unit-tests] branch master updated: Add some
more tests
This is an automated email from the ASF dual-hosted git repository.
sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-ponymail-unit-tests.git
The following commit(s) were added to refs/heads/master by this push:
new 669dbb3 Add some more tests
669dbb3 is described below
commit 669dbb371a395ee61e1d43a359baec997362c437
Author: Sebb <se...@apache.org>
AuthorDate: Wed Sep 2 14:39:02 2020 +0100
Add some more tests
4 versions of the same messages
cluster, dkim and medium seem to be stable
---
corpus/maven_duplicates_2017_listsao_1.mbox | 2128 +++++++++++++++++++++
corpus/maven_duplicates_2017_listsao_2.mbox | 2188 ++++++++++++++++++++++
corpus/maven_duplicates_2017_mailarchivesao.mbox | 2138 +++++++++++++++++++++
corpus/maven_duplicates_2017_mboxvm.mbox | 2118 +++++++++++++++++++++
yaml/gens-maven_duplicates_2017.yaml | 98 +
yaml/pars-maven_duplicates_2017.yaml | 47 +
6 files changed, 8717 insertions(+)
diff --git a/corpus/maven_duplicates_2017_listsao_1.mbox b/corpus/maven_duplicates_2017_listsao_1.mbox
new file mode 100644
index 0000000..35780b2
--- /dev/null
+++ b/corpus/maven_duplicates_2017_listsao_1.mbox
@@ -0,0 +1,2128 @@
+From dev-return-124335-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:40:08 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 202941609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:40:08 +0200 (CEST)
+Received: (qmail 16272 invoked by uid 500); 26 Oct 2017 07:40:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 15739 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:40:09 -0000
+
+asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+URL: https://github.com/apache/maven-enforcer/pull/20
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+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 7c21bd6..75d9842 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
+@@ -24,10 +24,6 @@
+ import java.util.List;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.enforcer.rule.api.EnforcerRule;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+@@ -35,9 +31,9 @@
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.plugins.enforcer.utils.DependencyVersionMap;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -63,7 +59,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -78,17 +74,11 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ try
+ {
+ MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class );
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node = dependencyTreeBuilder.buildDependencyTree( project, repository, factory,
+- metadataSource, filter, collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph( project, filter );
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -98,7 +88,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 71210e2..426c32d 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -26,10 +26,6 @@
+ import java.util.Map;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.artifact.versioning.ArtifactVersion;
+ import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+@@ -38,10 +34,10 @@
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -78,7 +74,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -87,24 +83,17 @@ public void setUniqueVersions( boolean uniqueVersions )
+ * @throws EnforcerRuleException when the build should fail
+ */
+ // CHECKSTYLE_ON: LineLength
+- private DependencyNode getNode( EnforcerRuleHelper helper )
++ private DependencyNode getNode(EnforcerRuleHelper helper )
+ throws EnforcerRuleException
+ {
+ try
+ {
+- MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ MavenProject project = (MavenProject) helper.evaluate("${project}");
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent(DependencyGraphBuilder.class);
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node =
+- dependencyTreeBuilder.buildDependencyTree( project, repository, factory, metadataSource, filter,
+- collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph(project, filter);
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -114,7 +103,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+index 2ec4ac2..ece772b 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+@@ -26,8 +26,8 @@
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.plugin.logging.Log;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+
+ /**
+ * @author Brian Fox
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124337-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:40:09 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 19A401609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:40:09 +0200 (CEST)
+Received: (qmail 16848 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16129 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:40:10 -0000
+
+asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+URL: https://github.com/apache/maven-enforcer/pull/28
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+new file mode 100644
+index 0000000..a07d2f1
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+@@ -0,0 +1,17 @@
++# 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.goals = install -Drevision=0.10.0-SNAPSHOT
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+new file mode 100644
+index 0000000..a6807af
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+@@ -0,0 +1,36 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ </parent>
++
++ <artifactId>menforcer281-module</artifactId>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+new file mode 100644
+index 0000000..e9d613b
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+@@ -0,0 +1,115 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++ <properties>
++ <revision>0.0.1-SNAPSHOT</revision>
++ </properties>
++
++ <build>
++ <pluginManagement>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-clean-plugin</artifactId>
++ <version>2.5</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-resources-plugin</artifactId>
++ <version>2.6</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-compiler-plugin</artifactId>
++ <version>2.5.1</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-surefire-plugin</artifactId>
++ <version>2.12.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-jar-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-install-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-deploy-plugin</artifactId>
++ <version>2.7</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-site-plugin</artifactId>
++ <version>3.2</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>test</id>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ <configuration>
++ <rules>
++ <requirePluginVersions>
++ <banSnapshots>false</banSnapshots>
++ </requirePluginVersions>
++ </rules>
++ </configuration>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </pluginManagement>
++
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ </plugin>
++ </plugins>
++ </build>
++
++ <modules>
++ <module>menforcer281-module</module>
++ </modules>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124338-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:40:10 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 7F2E7160BF2
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:40:10 +0200 (CEST)
+Received: (qmail 16859 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16131 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:40:11 -0000
+
+asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+URL: https://github.com/apache/maven-enforcer/pull/25
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 2600b36..4c0ccde 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -21,9 +21,11 @@
+
+ import java.util.ArrayList;
+ import java.util.Collections;
++import java.util.HashSet;
+ import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
++import java.util.Set;
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.artifact.factory.ArtifactFactory;
+@@ -67,6 +69,13 @@
+ * @since TBD
+ */
+ private List<String> excludes = null;
++
++ /**
++ * Dependency scopes to ignore.
++ *
++ * @since TBD
++ */
++ private List<String> ignoredDependencyScopes;
+
+ /**
+ * Set to {@code true} if timestamped snapshots should be used.
+@@ -88,6 +97,17 @@ public void setExcludes( List<String> excludes )
+ this.excludes = excludes;
+ }
+
++ /**
++ * Ignores particular dependency scopes.
++ *
++ * @param scopes a list of ignored scopes
++ * @since TBD
++ */
++ public void setIgnoreDependencyScopes( List<String> scopes )
++ {
++ this.ignoredDependencyScopes = scopes;
++ }
++
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+@@ -143,8 +163,8 @@ public void execute( EnforcerRuleHelper helper )
+ try
+ {
+ DependencyNode node = getNode( helper );
+- RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor();
+- visitor.setUniqueVersions( uniqueVersions );
++ RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor
++ ( uniqueVersions, ignoredDependencyScopes, log );
+ node.accept( visitor );
+ List<String> errorMessages = buildErrorMessages( visitor.getConflicts() );
+ if ( errorMessages.size() > 0 )
+@@ -242,11 +262,16 @@ private String getFullArtifactName( DependencyNode node, boolean usePremanaged )
+ implements DependencyNodeVisitor
+ {
+
+- private boolean uniqueVersions;
++ private final boolean uniqueVersions;
++ private final Set<String> ignoredDependencyScopes;
++ private final Log log;
+
+- public void setUniqueVersions( boolean uniqueVersions )
++ public RequireUpperBoundDepsVisitor( boolean uniqueVersions, List<String> ignoredDependencyScopes, Log log )
+ {
+ this.uniqueVersions = uniqueVersions;
++ this.ignoredDependencyScopes = ignoredDependencyScopes != null
++ ? new HashSet<String>( ignoredDependencyScopes ) : null;
++ this.log = log;
+ }
+
+ private Map<String, List<DependencyNodeHopCountPair>> keyToPairsMap =
+@@ -254,6 +279,16 @@ public void setUniqueVersions( boolean uniqueVersions )
+
+ public boolean visit( DependencyNode node )
+ {
++ Artifact artifact = node.getArtifact();
++ String artifactScope = artifact.getScope();
++ if ( ignoredDependencyScopes != null && ignoredDependencyScopes.contains( artifactScope ) )
++ {
++ // If the scope is ignored, skip the artifact and its children
++ String groupArt = artifact.getGroupId() + ":" + artifact.getArtifactId();
++ log.warn( "Skipping dependency " + groupArt + ". Its scope is ignored: " + artifactScope );
++ return false;
++ }
++
+ DependencyNodeHopCountPair pair = new DependencyNodeHopCountPair( node );
+ String key = pair.constructKey();
+ List<DependencyNodeHopCountPair> pairs = keyToPairsMap.get( key );
+diff --git a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+index b34a6f4..1c136f7 100644
+--- a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
++++ b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+@@ -109,6 +109,11 @@ and
+ <exclude>com.google.guava:guava</exclude>
+ </excludes>
+ -->
++ <!-- If you wish to ignore certain dependency scopes:
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ -->
+ </requireUpperBoundDeps>
+ </rules>
+ </configuration>
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+index f1bd2c3..03bd847 100644
+--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+@@ -121,7 +121,19 @@ public static EnforcerRuleHelper getHelper( MavenProject project )
+ * @param mockExpression the mock expression
+ * @return the helper
+ */
+- public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression )
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression ) {
++ return getHelper(project, mockExpression, null);
++ }
++
++ /**
++ * Gets the helper.
++ *
++ * @param project the project
++ * @param mockExpression the mock expression
++ * @param container Plexus container to be used. If {@code null}, a default Maven Session one will be used.
++ * @return the helper
++ */
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression, PlexusContainer container)
+ {
+ MavenSession session = getMavenSession();
+ ExpressionEvaluator eval;
+@@ -136,7 +148,7 @@ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockEx
+ session.setCurrentProject( project );
+ eval = new PluginParameterExpressionEvaluator( session, mockExecution );
+ }
+- return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), null );
++ return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), container );
+ }
+
+ /**
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+new file mode 100644
+index 0000000..08aa92e
+--- /dev/null
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+@@ -0,0 +1,187 @@
++package org.apache.maven.plugins.enforcer;
++
++import java.util.ArrayList;
++import java.util.Arrays;
++import java.util.List;
++import org.apache.maven.artifact.Artifact;
++import org.apache.maven.artifact.factory.ArtifactFactory;
++import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
++import org.apache.maven.artifact.repository.ArtifactRepository;
++import org.apache.maven.artifact.resolver.ArtifactCollector;
++import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
++import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
++import org.apache.maven.plugin.testing.ArtifactStubFactory;
++import org.apache.maven.plugins.enforcer.utils.TestEnforcerRuleUtils;
++import org.apache.maven.project.MavenProject;
++import org.apache.maven.shared.dependency.tree.DependencyNode;
++import org.apache.maven.shared.dependency.tree.DependencyTree;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.codehaus.plexus.DefaultPlexusContainer;
++import org.codehaus.plexus.PlexusContainer;
++import org.junit.Before;
++import org.junit.Test;
++
++/*
++ * 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.
++ */
++
++/**
++ * Tests for {@link RequireUpperBoundDeps}.
++ * @author Oleg Nenashev
++ */
++public class TestRequireUpperBoundDeps {
++
++ private MavenProject project;
++
++ private EnforcerRuleHelper helper;
++
++ private ArtifactStubFactory factory;
++
++ private RequireUpperBoundDeps rule;
++ private MockDependencyTreeBuilder dependencyTree;
++
++ Artifact library1_10, library1_20, library2_10;
++
++ @Before
++ public void before() throws Exception
++ {
++ PlexusContainer c = new DefaultPlexusContainer();
++ dependencyTree = new MockDependencyTreeBuilder();
++ factory = new ArtifactStubFactory();
++
++ project = new MockProject();
++ project.setArtifact(factory.createArtifact("my", "project", "1.0"));
++ library1_10 = factory.createArtifact("my", "library1", "1.0");
++ library1_20 = factory.createArtifact("my", "library1", "2.0");
++ library2_10 = factory.createArtifact("my", "library2", "1.0");
++
++ helper = EnforcerTestUtils.getHelper(project, false, c);
++ helper.getContainer().addComponent(dependencyTree, DependencyTreeBuilder.class.getName());
++
++ rule = new RequireUpperBoundDeps();
++ }
++
++ @Test
++ public void testShouldPassForSameDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ @Test
++ public void testShouldFailForNewerDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ @Test
++ public void testShouldPassForOlderDependencies() throws Exception {
++ dependencyTree.addDependency(library1_20);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-273
++ @Test
++ public void testShouldPassForOlderDependencyIfExcluded() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setExcludes(Arrays.asList("my:library1"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldPassIfTestArtifactsAreIgnored() throws Exception {
++ dependencyTree.addDependency(library1_10);
++
++ library2_10.setScope("test");
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setIgnoreDependencyScopes(Arrays.asList("test"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldFailIfWrongScopeIsIgnored() throws Exception {
++ testShouldPassIfTestArtifactsAreIgnored();
++ rule.setIgnoreDependencyScopes(Arrays.asList("provided"));
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ // TODO: make it a generic class
++ private static final class MockDependencyTreeBuilder implements DependencyTreeBuilder {
++
++ List<DependencyNode> dependencies = new ArrayList<DependencyNode>();
++
++ public void addDependency(DependencyNode node) {
++ dependencies.add(node);
++ }
++
++ public void addDependency(Artifact artifact) {
++ dependencies.add(new DependencyNode(artifact));
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource, ArtifactFilter filter,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ DependencyNode root = new DependencyNode(project.getArtifact());
++ for (DependencyNode child : dependencies) {
++ root.addChild(child);
++ }
++ return root;
++ }
++
++ @Override
++ public DependencyTree buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject arg0, ArtifactRepository arg1, ArtifactFilter arg2) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ }
++}
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties
+new file mode 100644
+index 0000000..c98ac4c
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/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
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+new file mode 100644
+index 0000000..307987a
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+@@ -0,0 +1,63 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276/artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <RequireUpperBoundDeps/>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+new file mode 100644
+index 0000000..38bb648
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+@@ -0,0 +1,32 @@
++/*
++ * 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 LS = System.getProperty( "line.separator" )
++File buildLog = new File( basedir, 'build.log' )
++
++assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:' )
++def message =
++'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 paths to dependency are:'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0'+LS+
++'and'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_classic:0.9.9'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0'+LS
++assert buildLog.text.contains( message )
++
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+new file mode 100644
+index 0000000..dc0aa79
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+@@ -0,0 +1,67 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <requireUpperBoundDeps>
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ </requireUpperBoundDeps>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124340-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:41:43 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 1EAD31609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:41:43 +0200 (CEST)
+Received: (qmail 26537 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 26524 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #4: Update to ASM5 opscode.
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:41:44 -0000
+
+asfgit closed pull request #4: Update to ASM5 opscode.
+URL: https://github.com/apache/maven-plugin-tools/pull/4
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+index 2993553d..e241987e 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+@@ -41,7 +41,7 @@
+
+ MojoAnnotationVisitor( Logger logger, String annotationClassName )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.annotationClassName = annotationClassName;
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+index f2333d4b..cbedfecd 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+@@ -53,7 +53,7 @@
+
+ public MojoClassVisitor( Logger logger )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ }
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+index 4a61a01e..783cbcbf 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+@@ -44,7 +44,7 @@
+
+ MojoFieldVisitor( Logger logger, String fieldName, String className )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.fieldName = fieldName;
+ this.className = className;
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124342-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:41:44 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id F1E871609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:41:44 +0200 (CEST)
+Received: (qmail 27357 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 27288 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:41:45 -0000
+
+asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+URL: https://github.com/apache/maven-plugin-tools/pull/6
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+index e442310f..5a5d8d8c 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+@@ -117,4 +117,44 @@
+ * @return is thread safe
+ */
+ boolean threadSafe() default false;
++
++ /**
++ * Description for this Mojo. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this Mojo was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this Mojo is deprecated.
++ *
++ * <p>If this is given, then the Mojo should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Mojo(..., deprecated = "this Mojo is no longer used")
++public class ExampleMojo extends AbstractMojo { ... }</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+index ec9dbcf6..f364e945 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+@@ -85,4 +85,44 @@
+ * @return <code>true</code> if the user should not be allowed to configure the parameter directly
+ */
+ boolean readonly() default false;
++
++ /**
++ * Description for this parameter. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this parameter was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this parameter is deprecated.
++ *
++ * <p>If this is given, then the parameter should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Parameter(..., deprecated = "this parameter is no longer used")
++private String oldParameterThatNowDoesNothing;</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+index 33104cb8..663435ff 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+@@ -207,6 +207,36 @@ public void name( String name )
+ this.name = name;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ @Override
+ public String toString()
+ {
+@@ -226,6 +256,9 @@ public String toString()
+ sb.append( ", inheritByDefault=" ).append( inheritByDefault );
+ sb.append( ", configurator='" ).append( configurator ).append( '\'' );
+ sb.append( ", threadSafe=" ).append( threadSafe );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+index 919aaa4b..ca8a49fc 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+@@ -63,6 +63,16 @@ public ParameterAnnotationContent( String fieldName, String alias, String proper
+ this.readonly = readonly;
+ }
+
++ public ParameterAnnotationContent( String fieldName, String alias, String property, String defaultValue,
++ boolean required, boolean readonly, String className,
++ String deprecated, String description, String since )
++ {
++ this( fieldName, alias, property, defaultValue, required, readonly, className );
++ deprecated( deprecated );
++ description( description );
++ since( since );
++ }
++
+ public String name()
+ {
+ return name;
+@@ -123,6 +133,36 @@ public void readonly( boolean readonly )
+ this.readonly = readonly;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ public Class<? extends Annotation> annotationType()
+ {
+ return null;
+@@ -150,6 +190,9 @@ public String toString()
+ sb.append( ", defaultValue='" ).append( defaultValue ).append( '\'' );
+ sb.append( ", required=" ).append( required );
+ sb.append( ", readonly=" ).append( readonly );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+@@ -194,6 +237,18 @@ public boolean equals( Object o )
+ {
+ return false;
+ }
++ if ( deprecated() != null ? !deprecated().equals( that.deprecated() ) : that.deprecated() != null )
++ {
++ return false;
++ }
++ if ( description() != null ? !description().equals( that.description() ) : that.description() != null )
++ {
++ return false;
++ }
++ if ( since() != null ? !since().equals( that.since() ) : that.since() != null )
++ {
++ return false;
++ }
+
+ return true;
+ }
+@@ -207,6 +262,9 @@ public int hashCode()
+ result = 31 * result + ( defaultValue != null ? defaultValue.hashCode() : 0 );
+ result = 31 * result + ( required ? 1 : 0 );
+ result = 31 * result + ( readonly ? 1 : 0 );
++ result = 31 * result + ( deprecated() != null ? deprecated().hashCode() : 0 );
++ result = 31 * result + ( description() != null ? description().hashCode() : 0 );
++ result = 31 * result + ( since() != null ? since().hashCode() : 0 );
+ return result;
+ }
+ }
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+index 673f8b1a..ee8527b2 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+@@ -33,7 +33,7 @@
+ /**
+ * @author Olivier Lamy
+ */
+-@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true )
++@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true, description = "This is a description.", since = "3.5", deprecated = "because I said so" )
+ @Execute( goal = "compiler", lifecycle = "my-lifecycle", phase = LifecyclePhase.PACKAGE )
+ public class FooMojo
+ extends AbstractMojo
+@@ -52,6 +52,10 @@
+ @Parameter( property = "thebeer", defaultValue = "coolbeer" )
+ protected String beer;
+
++ @Parameter( description = "wine for french folks", since = "forever ago", deprecated = "beer is better" )
++ @Deprecated
++ protected String wine;
++
+ /**
+ * Plexus compiler manager.
+ */
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+index 17a24bfd..12359bee 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+@@ -71,6 +71,9 @@ public void testReadMojoClass()
+ assertEquals( true, mojo.threadSafe() );
+ assertEquals( false, mojo.aggregator() );
+ assertEquals( LifecyclePhase.COMPILE, mojo.defaultPhase() );
++ assertEquals( "This is a description.", mojo.description() );
++ assertEquals( "3.5", mojo.since() );
++ assertEquals( "because I said so", mojo.deprecated() );
+
+ Execute execute = mojoAnnotatedClass.getExecute();
+
+@@ -82,9 +85,12 @@ public void testReadMojoClass()
+ Assertions.assertThat( components ).isNotNull().isNotEmpty().hasSize( 2 );
+
+ Collection<ParameterAnnotationContent> parameters = mojoAnnotatedClass.getParameters().values();
+- Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 2 ).contains(
++ Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 3 ).contains(
+ new ParameterAnnotationContent( "bar", null, "thebar", "coolbar", true, false, String.class.getName() ),
+ new ParameterAnnotationContent( "beer", null, "thebeer", "coolbeer", false, false,
+- String.class.getName() ) );
++ String.class.getName() ),
++ new ParameterAnnotationContent( "wine", null, null, null, false, false,
++ String.class.getName(), "beer is better", "wine for french folks",
++ "forever ago" ) );
+ }
+ }
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124353-archive-asf-public=cust-asf.ponee.io@maven.apache.org Fri Oct 27 02:33:38 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 1B8BA1609E5
+ for <ar...@cust-asf.ponee.io>; Fri, 27 Oct 2017 04:33:38 +0200 (CEST)
+Received: (qmail 37730 invoked by uid 500); 27 Oct 2017 02:33:38 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 37719 invoked by uid 99); 27 Oct 2017 02:33:38 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 27 Oct 2017 02:33:38 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Fri, 27 Oct 2017 02:33:39 -0000
+
+olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+URL: https://github.com/apache/maven-release/pull/19#issuecomment-339855892
+
+
+ @theit I'm happy with this changes. Except the lack of test. Is there anything you can do? A plugin IT test?
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124404-archive-asf-public=cust-asf.ponee.io@maven.apache.org Sat Nov 04 14:33:08 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 28AFF160BD5
+ for <ar...@cust-asf.ponee.io>; Sat, 4 Nov 2017 15:33:08 +0100 (CET)
+Received: (qmail 82314 invoked by uid 500); 4 Nov 2017 14:33:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 82303 invoked by uid 99); 4 Nov 2017 14:33:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:33:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Sat, 04 Nov 2017 14:33:08 -0000
+
+hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27#issuecomment-341901250
+
+
+ sorry, this was automatically closed when migrating to Git and deleting old trunk branch
+ reopening
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124407-archive-asf-public=cust-asf.ponee.io@maven.apache.org Sat Nov 04 14:41:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 29C60160BE7
+ for <ar...@cust-asf.ponee.io>; Sat, 4 Nov 2017 15:41:36 +0100 (CET)
+Received: (qmail 92040 invoked by uid 500); 4 Nov 2017 14:41:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 91799 invoked by uid 99); 4 Nov 2017 14:41:34 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:41:34 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Sat, 04 Nov 2017 14:41:36 -0000
+
+hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+index 890814a..bc7dcf9 100644
+--- a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
++++ b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+@@ -16,7 +16,7 @@
+ ~~ under the License.
+
+ -----
+- Comparing against a specific artifact
++ Dependency Convergence
+ -----
+ -----
+ 2008-09-13
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124501-archive-asf-public=cust-asf.ponee.io@maven.apache.org Fri Nov 17 08:40:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 544B0160BF8
+ for <ar...@cust-asf.ponee.io>; Fri, 17 Nov 2017 09:40:36 +0100 (CET)
+Received: (qmail 13228 invoked by uid 500); 17 Nov 2017 08:40:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 13217 invoked by uid 99); 17 Nov 2017 08:40:35 -0000
+Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 17 Nov 2017 08:40:35 +0000
+Received: from localhost (localhost [127.0.0.1])
+ by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 0478C18088F
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:33 +0000 (UTC)
+X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org
+X-Spam-Flag: NO
+X-Spam-Score: -1
+X-Spam-Level:
+X-Spam-Status: No, score=-1 tagged_above=-999 required=6.31
+ tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1,
+ RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-2.8] autolearn=disabled
+Received: from mx1-lw-us.apache.org ([10.40.0.8])
+ by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024)
+ with ESMTP id QNrCLGJBrxBw for <de...@maven.apache.org>;
+ Fri, 17 Nov 2017 08:40:31 +0000 (UTC)
+Received: from smtp.smtpout.orange.fr (smtp03.smtpout.orange.fr [80.12.242.125])
+ by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTPS id 796F95F569
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:29 +0000 (UTC)
+Received: from giga.localnet ([86.238.16.93])
+ by mwinf5d50 with ME
+ id awgN1w00K20Ufdy03wgNhg; Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-Helo: giga.localnet
+X-ME-Date: Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-IP: 86.238.16.93
+From: =?ISO-8859-1?Q?Herv=E9?= BOUTEMY <he...@free.fr>
+To: Maven Developers List <de...@maven.apache.org>
+Subject: Re: Maven resolver branch consolidation
+Date: Fri, 17 Nov 2017 09:40:22 +0100
+Message-ID: <25...@giga>
+In-Reply-To: <20...@dd17332.kasserver.com>
+References: <20...@dd17332.kasserver.com> <16...@giga> <20...@dd17332.kasserver.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="nextPart23989684.4Xbeelhfra"
+Content-Transfer-Encoding: 7Bit
+archived-at: Fri, 17 Nov 2017 08:40:37 -0000
+
+--nextPart23989684.4Xbeelhfra
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain; charset="iso-8859-1"
+
+on the second option, I was ready to just answer "not possible", but decide=
+d I=20
+could try at high level before answering...
+
+I took Maven core dependency tree [1], picked green color as the definition=
+ of=20
+Maven Artifact Resolver, put maven-resolver-provider in green + settings=20
+builder (since used by resolver ant tasks: that's a detail I didn't put in=
+=20
+latest resolver dependency tree)
+Then I extended green to every transitive dependency to have an independent=
+=20
+releasable reactor
+
+You'll find as a result the attached image.
+
+Analysis:
+=2D this splits Maven core in 2 parts: lower part on dependency resolution,=
+=20
+higher part on build
+=2D settings.xml and pom.xml are in dependency resolution
+
+Reaction: it could be for Maven 5 or 6, when consumer pom is strictly separ=
+ate=20
+from build pom...
+
+Regards,
+
+Herv=E9
+
+[1] http://maven.apache.org/ref/3.5.2/
+
+Le jeudi 16 novembre 2017, 18:13:15 CET Manfred Moser a =E9crit :
+> Thanks for the explanation and details Herve. Seems to be that to do this
+> cleanly we have to break the circle. From my limited knowledge there are
+> two ways to do that.
+>=20
+> 1. As stephen suggested.. get the resolver into maven core tree. That mak=
+es
+> core bigger again and ties the two projects into one release cycle.
+> Feasible but I am not a fan.
+>=20
+> 2. I am not sure if possible but .. could we get the maven resolver provi=
+der
+> out of maven core and into the resolver project and have it all together =
+in
+> there?
+>=20
+> In either case .. both of those seem rather large tasks so I will definit=
+ely
+> go ahead with demo branch merge first. I just have to redo the work I did
+> without the ant tasks in the tree. Stay tuned on that..
+>=20
+> Manfred
+>=20
+> Herv=E9 BOUTEMY wrote on 2017-11-16 05:49:
+> > feasible, but I really don't like it: separation is good.
+> >=20
+> > seriously, just merge demos and let ant-tasks separate, and we have a
+> > pretty good compromise on every aspect
+> > (or even drop ant tasks if really this is causing us too much headache.=
+=2E.)
+> >=20
+> > Regards,
+> >=20
+> > Herv=E9
+> >=20
+> > Le jeudi 16 novembre 2017, 10:03:07 CET Stephen Connolly a =E9crit :
+> >> On Thu 16 Nov 2017 at 07:51, Herv=E9 BOUTEMY <he...@free.fr> w=
+rote:
+> >> > I just pushed an update of dependencies image that shows the external
+> >> > maven-
+> >> > resolver-provider (in yellow) inside the reactor dependency graph (in
+> >> > blue)
+> >> >=20
+> >> > That shows the chicken and egg issue on releasing we'll have on API
+> >> > breaking
+> >> > change. People always building from source (like Debian) will have t=
+he
+> >> > issue
+> >> > also.
+> >> >=20
+> >> > For demos, which are not really published during the release (just as
+> >> > documentation), disabling the module in the build when necessary is
+> >> > sufficient,
+> >> > won't change many things. For ant tasks, disabling the module will n=
+ot
+> >> > publish
+> >> > the artifact: this will have a visible impact.
+> >>=20
+> >> Should we just bite the bullet and bring resolver in-tree as modules in
+> >> maven core... leaving demos and ant tasks here?
+> >>=20
+> >> > Regards,
+> >> >=20
+> >> > Herv=E9
+> >> >=20
+> >> > Le mercredi 15 novembre 2017, 23:05:14 CET Herv=E9 BOUTEMY a =E9crit=
+ :
+> >> > > it seems I have not been clear: I'll try to explain better
+> >> > >=20
+> >> > > 1. maven-resolver-ant-tasks depends on maven-resolver-provider (fr=
+om
+> >> >=20
+> >> > Maven
+> >> >=20
+> >> > > core)
+> >> > > 2. maven-resolver-provider (then Maven core) depends on
+> >> > > maven-resolver
+> >> > >=20
+> >> > > if we put maven-resolver-ant-tasks in the same reactor than
+> >> >=20
+> >> > maven-resolver,
+> >> >=20
+> >> > > we can't release any maven-resolver API change that breaks
+> >> >=20
+> >> > maven-resolver-
+> >> >=20
+> >> > > provider
+> >> > >=20
+> >> > > example: if we move maven-resolver code to org.apache.maven java
+> >> > > package
+> >> >=20
+> >> > in
+> >> >=20
+> >> > > maven-resolver 2.0.0-SNAPSHOT, we need maven-resolver-provider
+> >> > > 4.0.0-SNAPSHOT that uses maven-resolver 2.0.0-SNAPSHOT with this n=
+ew
+> >> > > java
+> >> > > package. Then try to release anything: you can't, unless you don't
+> >> > > try
+> >> > > to
+> >> > > release maven- resolver-ant-tasks
+> >> > >=20
+> >> > > (the consequence on version consistency is another way to describe
+> >> > > the
+> >> > > issue, but that is more subtle, then I chose to describe the most
+> >> > > visible
+> >> > > issue, with API breaking change)
+> >> > >=20
+> >> > > IMHO, another consequence could be: maven-resolver-ant-tasks would
+> >> >=20
+> >> > perhaps
+> >> >=20
+> >> > > better be versionned like maven-resolver-provider
+> >> > >=20
+> >> > >=20
+> >> > > Merging resolver-demos is really the great big idea: with that mer=
+ge,
+> >> > > modifying maven-rresolver can immediately be tested with demos:
+> >> > > that'll
+> >> >=20
+> >> > be
+> >> >=20
+> >> > > so much easier to make changes to maven-resolver code!
+> >> > >=20
+> >> > > Regards,
+> >> > >=20
+> >> > > Herv=E9
+> >> > >=20
+> >> > > Le mercredi 15 novembre 2017, 09:02:12 CET Michael Osipov a =E9cri=
+t :
+> >> > > > Why -1 on the Ant tasks?
+> >> > > >=20
+> >> > > > Am 2017-11-15 um 00:50 schrieb Herv=E9 BOUTEMY:
+> >> > > > > I answered on the mailing list and on the 2 Jira issues
+> >> > > > > In summary, +1 to merge demos, -1 to merge ant-tasks
+> >> > > > >=20
+> >> > > > > Regards,
+> >> > > > >=20
+> >> > > > > Herv=E9
+> >> > > > >=20
+> >> > > > > Le mardi 14 novembre 2017, 18:19:40 CET Manfred Moser a =E9cri=
+t :
+> >> > > > >> Any feedback or should I just go ahead with the cleanup?
+> >> > > > >>=20
+> >> > > > >> Manfred
+> >> > > > >>=20
+> >> > > > >> Manfred Moser wrote on 2017-11-08 21:35:
+> >> > > > >>> Hi all,
+> >> > > > >>>=20
+> >> > > > >>> I have started and made good progress on getting Maven resol=
+ver
+> >> > > > >>> all
+> >> > > > >>> into
+> >> > > > >>> the master branch instead of having master, demos and ant-ta=
+sks
+> >> > > > >>> in
+> >> > > > >>> separate branches.
+> >> > > > >>>=20
+> >> > > > >>> Details are tracked in
+> >> > > > >>> https://issues.apache.org/jira/browse/MRESOLVER-28
+> >> > > > >>>=20
+> >> > > > >>> All of it is now in a new branch called master-all for you to
+> >> > > > >>> see.
+> >> > > > >>>=20
+> >> > > > >>> I am now wondering what the next steps are. I added what I
+> >> > > > >>> think
+> >> > > > >>> should
+> >> > > > >>> happen next in the issue in a comment and would appreciate a=
+ny
+> >> >=20
+> >> > input
+> >> >=20
+> >> > > > >>> on
+> >> > > > >>> the current setup and next steps.
+> >> > > > >>>=20
+> >> > > > >>> Any help would be appreciated.
+> >> > > > >>>=20
+> >> > > > >>> manfred
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> >=20
+> >> > > > >> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > >> For additional commands, e-mail: dev-help@maven.apache.org
+> >> > > > >=20
+> >> > > > > --------------------------------------------------------------=
+=2D--
+> >> > > > > ---
+> >> > > > > -
+> >> > > > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> > >=20
+> >> > > ------------------------------------------------------------------=
+=2D--
+> >> > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > --
+> >>=20
+> >> Sent from my phone
+> >=20
+> > ---------------------------------------------------------------------
+> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> > For additional commands, e-mail: dev-help@maven.apache.org
+>=20
+> ---------------------------------------------------------------------
+> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> For additional commands, e-mail: dev-help@maven.apache.org
+
+
+
+--nextPart23989684.4Xbeelhfra
+Content-Type: text/plain; charset=us-ascii
+
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+--nextPart23989684.4Xbeelhfra--
+
+
+From dev-return-124732-archive-asf-public=cust-asf.ponee.io@maven.apache.org Mon Dec 04 11:39:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public@cust-asf.ponee.io
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 358C9160BF9
+ for <ar...@cust-asf.ponee.io>; Mon, 4 Dec 2017 12:39:36 +0100 (CET)
+Received: (qmail 14334 invoked by uid 500); 4 Dec 2017 11:39:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 14323 invoked by uid 99); 4 Dec 2017 11:39:35 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Dec 2017 11:39:35 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Mon, 04 Dec 2017 11:39:36 -0000
+
+slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+URL: https://github.com/apache/maven-doxia/pull/6#issuecomment-348937905
+
+
+ ok, plugin updates removed
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
diff --git a/corpus/maven_duplicates_2017_listsao_2.mbox b/corpus/maven_duplicates_2017_listsao_2.mbox
new file mode 100644
index 0000000..272da63
--- /dev/null
+++ b/corpus/maven_duplicates_2017_listsao_2.mbox
@@ -0,0 +1,2188 @@
+From dev-return-124335-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:40:10 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id 00B08200D29
+ for <ar...@cust-asf2.ponee.io>; Thu, 26 Oct 2017 09:40:10 +0200 (CEST)
+Received: by cust-asf.ponee.io (Postfix)
+ id F34A3160BF3; Thu, 26 Oct 2017 07:40:09 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 202941609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:40:08 +0200 (CEST)
+Received: (qmail 16272 invoked by uid 500); 26 Oct 2017 07:40:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 15739 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:40:10 -0000
+
+asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+URL: https://github.com/apache/maven-enforcer/pull/20
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+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 7c21bd6..75d9842 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
+@@ -24,10 +24,6 @@
+ import java.util.List;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.enforcer.rule.api.EnforcerRule;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+@@ -35,9 +31,9 @@
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.plugins.enforcer.utils.DependencyVersionMap;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -63,7 +59,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -78,17 +74,11 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ try
+ {
+ MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class );
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node = dependencyTreeBuilder.buildDependencyTree( project, repository, factory,
+- metadataSource, filter, collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph( project, filter );
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -98,7 +88,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 71210e2..426c32d 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -26,10 +26,6 @@
+ import java.util.Map;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.artifact.versioning.ArtifactVersion;
+ import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+@@ -38,10 +34,10 @@
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -78,7 +74,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -87,24 +83,17 @@ public void setUniqueVersions( boolean uniqueVersions )
+ * @throws EnforcerRuleException when the build should fail
+ */
+ // CHECKSTYLE_ON: LineLength
+- private DependencyNode getNode( EnforcerRuleHelper helper )
++ private DependencyNode getNode(EnforcerRuleHelper helper )
+ throws EnforcerRuleException
+ {
+ try
+ {
+- MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ MavenProject project = (MavenProject) helper.evaluate("${project}");
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent(DependencyGraphBuilder.class);
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node =
+- dependencyTreeBuilder.buildDependencyTree( project, repository, factory, metadataSource, filter,
+- collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph(project, filter);
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -114,7 +103,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+index 2ec4ac2..ece772b 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+@@ -26,8 +26,8 @@
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.plugin.logging.Log;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+
+ /**
+ * @author Brian Fox
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124337-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:40:10 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id E67EE200D29
+ for <ar...@cust-asf2.ponee.io>; Thu, 26 Oct 2017 09:40:10 +0200 (CEST)
+Received: by cust-asf.ponee.io (Postfix)
+ id E4F08160BF3; Thu, 26 Oct 2017 07:40:10 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 19A401609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:40:09 +0200 (CEST)
+Received: (qmail 16848 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16129 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:40:11 -0000
+
+asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+URL: https://github.com/apache/maven-enforcer/pull/28
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+new file mode 100644
+index 0000000..a07d2f1
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+@@ -0,0 +1,17 @@
++# 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.goals = install -Drevision=0.10.0-SNAPSHOT
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+new file mode 100644
+index 0000000..a6807af
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+@@ -0,0 +1,36 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ </parent>
++
++ <artifactId>menforcer281-module</artifactId>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+new file mode 100644
+index 0000000..e9d613b
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+@@ -0,0 +1,115 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++ <properties>
++ <revision>0.0.1-SNAPSHOT</revision>
++ </properties>
++
++ <build>
++ <pluginManagement>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-clean-plugin</artifactId>
++ <version>2.5</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-resources-plugin</artifactId>
++ <version>2.6</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-compiler-plugin</artifactId>
++ <version>2.5.1</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-surefire-plugin</artifactId>
++ <version>2.12.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-jar-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-install-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-deploy-plugin</artifactId>
++ <version>2.7</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-site-plugin</artifactId>
++ <version>3.2</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>test</id>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ <configuration>
++ <rules>
++ <requirePluginVersions>
++ <banSnapshots>false</banSnapshots>
++ </requirePluginVersions>
++ </rules>
++ </configuration>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </pluginManagement>
++
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ </plugin>
++ </plugins>
++ </build>
++
++ <modules>
++ <module>menforcer281-module</module>
++ </modules>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124338-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:40:11 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id D0805200D3B
+ for <ar...@cust-asf2.ponee.io>; Thu, 26 Oct 2017 09:40:11 +0200 (CEST)
+Received: by cust-asf.ponee.io (Postfix)
+ id CEFF61609E8; Thu, 26 Oct 2017 07:40:11 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 7F2E7160BF2
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:40:10 +0200 (CEST)
+Received: (qmail 16859 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16131 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:40:12 -0000
+
+asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+URL: https://github.com/apache/maven-enforcer/pull/25
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 2600b36..4c0ccde 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -21,9 +21,11 @@
+
+ import java.util.ArrayList;
+ import java.util.Collections;
++import java.util.HashSet;
+ import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
++import java.util.Set;
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.artifact.factory.ArtifactFactory;
+@@ -67,6 +69,13 @@
+ * @since TBD
+ */
+ private List<String> excludes = null;
++
++ /**
++ * Dependency scopes to ignore.
++ *
++ * @since TBD
++ */
++ private List<String> ignoredDependencyScopes;
+
+ /**
+ * Set to {@code true} if timestamped snapshots should be used.
+@@ -88,6 +97,17 @@ public void setExcludes( List<String> excludes )
+ this.excludes = excludes;
+ }
+
++ /**
++ * Ignores particular dependency scopes.
++ *
++ * @param scopes a list of ignored scopes
++ * @since TBD
++ */
++ public void setIgnoreDependencyScopes( List<String> scopes )
++ {
++ this.ignoredDependencyScopes = scopes;
++ }
++
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+@@ -143,8 +163,8 @@ public void execute( EnforcerRuleHelper helper )
+ try
+ {
+ DependencyNode node = getNode( helper );
+- RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor();
+- visitor.setUniqueVersions( uniqueVersions );
++ RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor
++ ( uniqueVersions, ignoredDependencyScopes, log );
+ node.accept( visitor );
+ List<String> errorMessages = buildErrorMessages( visitor.getConflicts() );
+ if ( errorMessages.size() > 0 )
+@@ -242,11 +262,16 @@ private String getFullArtifactName( DependencyNode node, boolean usePremanaged )
+ implements DependencyNodeVisitor
+ {
+
+- private boolean uniqueVersions;
++ private final boolean uniqueVersions;
++ private final Set<String> ignoredDependencyScopes;
++ private final Log log;
+
+- public void setUniqueVersions( boolean uniqueVersions )
++ public RequireUpperBoundDepsVisitor( boolean uniqueVersions, List<String> ignoredDependencyScopes, Log log )
+ {
+ this.uniqueVersions = uniqueVersions;
++ this.ignoredDependencyScopes = ignoredDependencyScopes != null
++ ? new HashSet<String>( ignoredDependencyScopes ) : null;
++ this.log = log;
+ }
+
+ private Map<String, List<DependencyNodeHopCountPair>> keyToPairsMap =
+@@ -254,6 +279,16 @@ public void setUniqueVersions( boolean uniqueVersions )
+
+ public boolean visit( DependencyNode node )
+ {
++ Artifact artifact = node.getArtifact();
++ String artifactScope = artifact.getScope();
++ if ( ignoredDependencyScopes != null && ignoredDependencyScopes.contains( artifactScope ) )
++ {
++ // If the scope is ignored, skip the artifact and its children
++ String groupArt = artifact.getGroupId() + ":" + artifact.getArtifactId();
++ log.warn( "Skipping dependency " + groupArt + ". Its scope is ignored: " + artifactScope );
++ return false;
++ }
++
+ DependencyNodeHopCountPair pair = new DependencyNodeHopCountPair( node );
+ String key = pair.constructKey();
+ List<DependencyNodeHopCountPair> pairs = keyToPairsMap.get( key );
+diff --git a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+index b34a6f4..1c136f7 100644
+--- a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
++++ b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+@@ -109,6 +109,11 @@ and
+ <exclude>com.google.guava:guava</exclude>
+ </excludes>
+ -->
++ <!-- If you wish to ignore certain dependency scopes:
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ -->
+ </requireUpperBoundDeps>
+ </rules>
+ </configuration>
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+index f1bd2c3..03bd847 100644
+--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+@@ -121,7 +121,19 @@ public static EnforcerRuleHelper getHelper( MavenProject project )
+ * @param mockExpression the mock expression
+ * @return the helper
+ */
+- public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression )
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression ) {
++ return getHelper(project, mockExpression, null);
++ }
++
++ /**
++ * Gets the helper.
++ *
++ * @param project the project
++ * @param mockExpression the mock expression
++ * @param container Plexus container to be used. If {@code null}, a default Maven Session one will be used.
++ * @return the helper
++ */
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression, PlexusContainer container)
+ {
+ MavenSession session = getMavenSession();
+ ExpressionEvaluator eval;
+@@ -136,7 +148,7 @@ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockEx
+ session.setCurrentProject( project );
+ eval = new PluginParameterExpressionEvaluator( session, mockExecution );
+ }
+- return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), null );
++ return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), container );
+ }
+
+ /**
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+new file mode 100644
+index 0000000..08aa92e
+--- /dev/null
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+@@ -0,0 +1,187 @@
++package org.apache.maven.plugins.enforcer;
++
++import java.util.ArrayList;
++import java.util.Arrays;
++import java.util.List;
++import org.apache.maven.artifact.Artifact;
++import org.apache.maven.artifact.factory.ArtifactFactory;
++import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
++import org.apache.maven.artifact.repository.ArtifactRepository;
++import org.apache.maven.artifact.resolver.ArtifactCollector;
++import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
++import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
++import org.apache.maven.plugin.testing.ArtifactStubFactory;
++import org.apache.maven.plugins.enforcer.utils.TestEnforcerRuleUtils;
++import org.apache.maven.project.MavenProject;
++import org.apache.maven.shared.dependency.tree.DependencyNode;
++import org.apache.maven.shared.dependency.tree.DependencyTree;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.codehaus.plexus.DefaultPlexusContainer;
++import org.codehaus.plexus.PlexusContainer;
++import org.junit.Before;
++import org.junit.Test;
++
++/*
++ * 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.
++ */
++
++/**
++ * Tests for {@link RequireUpperBoundDeps}.
++ * @author Oleg Nenashev
++ */
++public class TestRequireUpperBoundDeps {
++
++ private MavenProject project;
++
++ private EnforcerRuleHelper helper;
++
++ private ArtifactStubFactory factory;
++
++ private RequireUpperBoundDeps rule;
++ private MockDependencyTreeBuilder dependencyTree;
++
++ Artifact library1_10, library1_20, library2_10;
++
++ @Before
++ public void before() throws Exception
++ {
++ PlexusContainer c = new DefaultPlexusContainer();
++ dependencyTree = new MockDependencyTreeBuilder();
++ factory = new ArtifactStubFactory();
++
++ project = new MockProject();
++ project.setArtifact(factory.createArtifact("my", "project", "1.0"));
++ library1_10 = factory.createArtifact("my", "library1", "1.0");
++ library1_20 = factory.createArtifact("my", "library1", "2.0");
++ library2_10 = factory.createArtifact("my", "library2", "1.0");
++
++ helper = EnforcerTestUtils.getHelper(project, false, c);
++ helper.getContainer().addComponent(dependencyTree, DependencyTreeBuilder.class.getName());
++
++ rule = new RequireUpperBoundDeps();
++ }
++
++ @Test
++ public void testShouldPassForSameDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ @Test
++ public void testShouldFailForNewerDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ @Test
++ public void testShouldPassForOlderDependencies() throws Exception {
++ dependencyTree.addDependency(library1_20);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-273
++ @Test
++ public void testShouldPassForOlderDependencyIfExcluded() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setExcludes(Arrays.asList("my:library1"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldPassIfTestArtifactsAreIgnored() throws Exception {
++ dependencyTree.addDependency(library1_10);
++
++ library2_10.setScope("test");
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setIgnoreDependencyScopes(Arrays.asList("test"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldFailIfWrongScopeIsIgnored() throws Exception {
++ testShouldPassIfTestArtifactsAreIgnored();
++ rule.setIgnoreDependencyScopes(Arrays.asList("provided"));
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ // TODO: make it a generic class
++ private static final class MockDependencyTreeBuilder implements DependencyTreeBuilder {
++
++ List<DependencyNode> dependencies = new ArrayList<DependencyNode>();
++
++ public void addDependency(DependencyNode node) {
++ dependencies.add(node);
++ }
++
++ public void addDependency(Artifact artifact) {
++ dependencies.add(new DependencyNode(artifact));
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource, ArtifactFilter filter,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ DependencyNode root = new DependencyNode(project.getArtifact());
++ for (DependencyNode child : dependencies) {
++ root.addChild(child);
++ }
++ return root;
++ }
++
++ @Override
++ public DependencyTree buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject arg0, ArtifactRepository arg1, ArtifactFilter arg2) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ }
++}
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties
+new file mode 100644
+index 0000000..c98ac4c
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/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
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+new file mode 100644
+index 0000000..307987a
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+@@ -0,0 +1,63 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276/artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <RequireUpperBoundDeps/>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+new file mode 100644
+index 0000000..38bb648
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+@@ -0,0 +1,32 @@
++/*
++ * 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 LS = System.getProperty( "line.separator" )
++File buildLog = new File( basedir, 'build.log' )
++
++assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:' )
++def message =
++'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 paths to dependency are:'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0'+LS+
++'and'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_classic:0.9.9'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0'+LS
++assert buildLog.text.contains( message )
++
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+new file mode 100644
+index 0000000..dc0aa79
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+@@ -0,0 +1,67 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <requireUpperBoundDeps>
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ </requireUpperBoundDeps>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124340-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:41:44 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id D0003200D29
+ for <ar...@cust-asf2.ponee.io>; Thu, 26 Oct 2017 09:41:44 +0200 (CEST)
+Received: by cust-asf.ponee.io (Postfix)
+ id CE807160BF3; Thu, 26 Oct 2017 07:41:44 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 1EAD31609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:41:43 +0200 (CEST)
+Received: (qmail 26537 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 26524 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #4: Update to ASM5 opscode.
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:41:45 -0000
+
+asfgit closed pull request #4: Update to ASM5 opscode.
+URL: https://github.com/apache/maven-plugin-tools/pull/4
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+index 2993553d..e241987e 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+@@ -41,7 +41,7 @@
+
+ MojoAnnotationVisitor( Logger logger, String annotationClassName )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.annotationClassName = annotationClassName;
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+index f2333d4b..cbedfecd 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+@@ -53,7 +53,7 @@
+
+ public MojoClassVisitor( Logger logger )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ }
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+index 4a61a01e..783cbcbf 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+@@ -44,7 +44,7 @@
+
+ MojoFieldVisitor( Logger logger, String fieldName, String className )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.fieldName = fieldName;
+ this.className = className;
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124342-archive-asf-public=cust-asf.ponee.io@maven.apache.org Thu Oct 26 07:41:46 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id 08EEE200D29
+ for <ar...@cust-asf2.ponee.io>; Thu, 26 Oct 2017 09:41:46 +0200 (CEST)
+Received: by cust-asf.ponee.io (Postfix)
+ id 077A0160BF3; Thu, 26 Oct 2017 07:41:46 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id F1E871609E8
+ for <ar...@cust-asf.ponee.io>; Thu, 26 Oct 2017 09:41:44 +0200 (CEST)
+Received: (qmail 27357 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 27288 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Thu, 26 Oct 2017 07:41:46 -0000
+
+asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+URL: https://github.com/apache/maven-plugin-tools/pull/6
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+index e442310f..5a5d8d8c 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+@@ -117,4 +117,44 @@
+ * @return is thread safe
+ */
+ boolean threadSafe() default false;
++
++ /**
++ * Description for this Mojo. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this Mojo was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this Mojo is deprecated.
++ *
++ * <p>If this is given, then the Mojo should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Mojo(..., deprecated = "this Mojo is no longer used")
++public class ExampleMojo extends AbstractMojo { ... }</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+index ec9dbcf6..f364e945 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+@@ -85,4 +85,44 @@
+ * @return <code>true</code> if the user should not be allowed to configure the parameter directly
+ */
+ boolean readonly() default false;
++
++ /**
++ * Description for this parameter. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this parameter was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this parameter is deprecated.
++ *
++ * <p>If this is given, then the parameter should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Parameter(..., deprecated = "this parameter is no longer used")
++private String oldParameterThatNowDoesNothing;</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+index 33104cb8..663435ff 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+@@ -207,6 +207,36 @@ public void name( String name )
+ this.name = name;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ @Override
+ public String toString()
+ {
+@@ -226,6 +256,9 @@ public String toString()
+ sb.append( ", inheritByDefault=" ).append( inheritByDefault );
+ sb.append( ", configurator='" ).append( configurator ).append( '\'' );
+ sb.append( ", threadSafe=" ).append( threadSafe );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+index 919aaa4b..ca8a49fc 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+@@ -63,6 +63,16 @@ public ParameterAnnotationContent( String fieldName, String alias, String proper
+ this.readonly = readonly;
+ }
+
++ public ParameterAnnotationContent( String fieldName, String alias, String property, String defaultValue,
++ boolean required, boolean readonly, String className,
++ String deprecated, String description, String since )
++ {
++ this( fieldName, alias, property, defaultValue, required, readonly, className );
++ deprecated( deprecated );
++ description( description );
++ since( since );
++ }
++
+ public String name()
+ {
+ return name;
+@@ -123,6 +133,36 @@ public void readonly( boolean readonly )
+ this.readonly = readonly;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ public Class<? extends Annotation> annotationType()
+ {
+ return null;
+@@ -150,6 +190,9 @@ public String toString()
+ sb.append( ", defaultValue='" ).append( defaultValue ).append( '\'' );
+ sb.append( ", required=" ).append( required );
+ sb.append( ", readonly=" ).append( readonly );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+@@ -194,6 +237,18 @@ public boolean equals( Object o )
+ {
+ return false;
+ }
++ if ( deprecated() != null ? !deprecated().equals( that.deprecated() ) : that.deprecated() != null )
++ {
++ return false;
++ }
++ if ( description() != null ? !description().equals( that.description() ) : that.description() != null )
++ {
++ return false;
++ }
++ if ( since() != null ? !since().equals( that.since() ) : that.since() != null )
++ {
++ return false;
++ }
+
+ return true;
+ }
+@@ -207,6 +262,9 @@ public int hashCode()
+ result = 31 * result + ( defaultValue != null ? defaultValue.hashCode() : 0 );
+ result = 31 * result + ( required ? 1 : 0 );
+ result = 31 * result + ( readonly ? 1 : 0 );
++ result = 31 * result + ( deprecated() != null ? deprecated().hashCode() : 0 );
++ result = 31 * result + ( description() != null ? description().hashCode() : 0 );
++ result = 31 * result + ( since() != null ? since().hashCode() : 0 );
+ return result;
+ }
+ }
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+index 673f8b1a..ee8527b2 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+@@ -33,7 +33,7 @@
+ /**
+ * @author Olivier Lamy
+ */
+-@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true )
++@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true, description = "This is a description.", since = "3.5", deprecated = "because I said so" )
+ @Execute( goal = "compiler", lifecycle = "my-lifecycle", phase = LifecyclePhase.PACKAGE )
+ public class FooMojo
+ extends AbstractMojo
+@@ -52,6 +52,10 @@
+ @Parameter( property = "thebeer", defaultValue = "coolbeer" )
+ protected String beer;
+
++ @Parameter( description = "wine for french folks", since = "forever ago", deprecated = "beer is better" )
++ @Deprecated
++ protected String wine;
++
+ /**
+ * Plexus compiler manager.
+ */
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+index 17a24bfd..12359bee 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+@@ -71,6 +71,9 @@ public void testReadMojoClass()
+ assertEquals( true, mojo.threadSafe() );
+ assertEquals( false, mojo.aggregator() );
+ assertEquals( LifecyclePhase.COMPILE, mojo.defaultPhase() );
++ assertEquals( "This is a description.", mojo.description() );
++ assertEquals( "3.5", mojo.since() );
++ assertEquals( "because I said so", mojo.deprecated() );
+
+ Execute execute = mojoAnnotatedClass.getExecute();
+
+@@ -82,9 +85,12 @@ public void testReadMojoClass()
+ Assertions.assertThat( components ).isNotNull().isNotEmpty().hasSize( 2 );
+
+ Collection<ParameterAnnotationContent> parameters = mojoAnnotatedClass.getParameters().values();
+- Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 2 ).contains(
++ Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 3 ).contains(
+ new ParameterAnnotationContent( "bar", null, "thebar", "coolbar", true, false, String.class.getName() ),
+ new ParameterAnnotationContent( "beer", null, "thebeer", "coolbeer", false, false,
+- String.class.getName() ) );
++ String.class.getName() ),
++ new ParameterAnnotationContent( "wine", null, null, null, false, false,
++ String.class.getName(), "beer is better", "wine for french folks",
++ "forever ago" ) );
+ }
+ }
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124353-archive-asf-public=cust-asf.ponee.io@maven.apache.org Fri Oct 27 02:33:39 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id CF614200D3B
+ for <ar...@cust-asf2.ponee.io>; Fri, 27 Oct 2017 04:33:39 +0200 (CEST)
+Received: by cust-asf.ponee.io (Postfix)
+ id CDC96160BF3; Fri, 27 Oct 2017 02:33:39 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 1B8BA1609E5
+ for <ar...@cust-asf.ponee.io>; Fri, 27 Oct 2017 04:33:38 +0200 (CEST)
+Received: (qmail 37730 invoked by uid 500); 27 Oct 2017 02:33:38 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 37719 invoked by uid 99); 27 Oct 2017 02:33:38 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 27 Oct 2017 02:33:38 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Fri, 27 Oct 2017 02:33:40 -0000
+
+olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+URL: https://github.com/apache/maven-release/pull/19#issuecomment-339855892
+
+
+ @theit I'm happy with this changes. Except the lack of test. Is there anything you can do? A plugin IT test?
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124404-archive-asf-public=cust-asf.ponee.io@maven.apache.org Sat Nov 04 14:33:08 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id E0646200D31
+ for <ar...@cust-asf2.ponee.io>; Sat, 4 Nov 2017 15:33:08 +0100 (CET)
+Received: by cust-asf.ponee.io (Postfix)
+ id DF0B4160BFD; Sat, 4 Nov 2017 14:33:08 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 28AFF160BD5
+ for <ar...@cust-asf.ponee.io>; Sat, 4 Nov 2017 15:33:08 +0100 (CET)
+Received: (qmail 82314 invoked by uid 500); 4 Nov 2017 14:33:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 82303 invoked by uid 99); 4 Nov 2017 14:33:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:33:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Sat, 04 Nov 2017 14:33:09 -0000
+
+hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27#issuecomment-341901250
+
+
+ sorry, this was automatically closed when migrating to Git and deleting old trunk branch
+ reopening
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124407-archive-asf-public=cust-asf.ponee.io@maven.apache.org Sat Nov 04 14:41:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id E1D0E200D31
+ for <ar...@cust-asf2.ponee.io>; Sat, 4 Nov 2017 15:41:36 +0100 (CET)
+Received: by cust-asf.ponee.io (Postfix)
+ id E0806160BD5; Sat, 4 Nov 2017 14:41:36 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 29C60160BE7
+ for <ar...@cust-asf.ponee.io>; Sat, 4 Nov 2017 15:41:36 +0100 (CET)
+Received: (qmail 92040 invoked by uid 500); 4 Nov 2017 14:41:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 91799 invoked by uid 99); 4 Nov 2017 14:41:34 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:41:34 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Sat, 04 Nov 2017 14:41:37 -0000
+
+hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+index 890814a..bc7dcf9 100644
+--- a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
++++ b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+@@ -16,7 +16,7 @@
+ ~~ under the License.
+
+ -----
+- Comparing against a specific artifact
++ Dependency Convergence
+ -----
+ -----
+ 2008-09-13
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124501-archive-asf-public=cust-asf.ponee.io@maven.apache.org Fri Nov 17 08:40:37 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id 37AED200D42
+ for <ar...@cust-asf2.ponee.io>; Fri, 17 Nov 2017 09:40:37 +0100 (CET)
+Received: by cust-asf.ponee.io (Postfix)
+ id 3639B160BFB; Fri, 17 Nov 2017 08:40:37 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 544B0160BF8
+ for <ar...@cust-asf.ponee.io>; Fri, 17 Nov 2017 09:40:36 +0100 (CET)
+Received: (qmail 13228 invoked by uid 500); 17 Nov 2017 08:40:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 13217 invoked by uid 99); 17 Nov 2017 08:40:35 -0000
+Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 17 Nov 2017 08:40:35 +0000
+Received: from localhost (localhost [127.0.0.1])
+ by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 0478C18088F
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:33 +0000 (UTC)
+X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org
+X-Spam-Flag: NO
+X-Spam-Score: -1
+X-Spam-Level:
+X-Spam-Status: No, score=-1 tagged_above=-999 required=6.31
+ tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1,
+ RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-2.8] autolearn=disabled
+Received: from mx1-lw-us.apache.org ([10.40.0.8])
+ by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024)
+ with ESMTP id QNrCLGJBrxBw for <de...@maven.apache.org>;
+ Fri, 17 Nov 2017 08:40:31 +0000 (UTC)
+Received: from smtp.smtpout.orange.fr (smtp03.smtpout.orange.fr [80.12.242.125])
+ by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTPS id 796F95F569
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:29 +0000 (UTC)
+Received: from giga.localnet ([86.238.16.93])
+ by mwinf5d50 with ME
+ id awgN1w00K20Ufdy03wgNhg; Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-Helo: giga.localnet
+X-ME-Date: Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-IP: 86.238.16.93
+From: =?ISO-8859-1?Q?Herv=E9?= BOUTEMY <he...@free.fr>
+To: Maven Developers List <de...@maven.apache.org>
+Subject: Re: Maven resolver branch consolidation
+Date: Fri, 17 Nov 2017 09:40:22 +0100
+Message-ID: <25...@giga>
+In-Reply-To: <20...@dd17332.kasserver.com>
+References: <20...@dd17332.kasserver.com> <16...@giga> <20...@dd17332.kasserver.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="nextPart23989684.4Xbeelhfra"
+Content-Transfer-Encoding: 7Bit
+archived-at: Fri, 17 Nov 2017 08:40:37 -0000
+
+--nextPart23989684.4Xbeelhfra
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain; charset="iso-8859-1"
+
+on the second option, I was ready to just answer "not possible", but decide=
+d I=20
+could try at high level before answering...
+
+I took Maven core dependency tree [1], picked green color as the definition=
+ of=20
+Maven Artifact Resolver, put maven-resolver-provider in green + settings=20
+builder (since used by resolver ant tasks: that's a detail I didn't put in=
+=20
+latest resolver dependency tree)
+Then I extended green to every transitive dependency to have an independent=
+=20
+releasable reactor
+
+You'll find as a result the attached image.
+
+Analysis:
+=2D this splits Maven core in 2 parts: lower part on dependency resolution,=
+=20
+higher part on build
+=2D settings.xml and pom.xml are in dependency resolution
+
+Reaction: it could be for Maven 5 or 6, when consumer pom is strictly separ=
+ate=20
+from build pom...
+
+Regards,
+
+Herv=E9
+
+[1] http://maven.apache.org/ref/3.5.2/
+
+Le jeudi 16 novembre 2017, 18:13:15 CET Manfred Moser a =E9crit :
+> Thanks for the explanation and details Herve. Seems to be that to do this
+> cleanly we have to break the circle. From my limited knowledge there are
+> two ways to do that.
+>=20
+> 1. As stephen suggested.. get the resolver into maven core tree. That mak=
+es
+> core bigger again and ties the two projects into one release cycle.
+> Feasible but I am not a fan.
+>=20
+> 2. I am not sure if possible but .. could we get the maven resolver provi=
+der
+> out of maven core and into the resolver project and have it all together =
+in
+> there?
+>=20
+> In either case .. both of those seem rather large tasks so I will definit=
+ely
+> go ahead with demo branch merge first. I just have to redo the work I did
+> without the ant tasks in the tree. Stay tuned on that..
+>=20
+> Manfred
+>=20
+> Herv=E9 BOUTEMY wrote on 2017-11-16 05:49:
+> > feasible, but I really don't like it: separation is good.
+> >=20
+> > seriously, just merge demos and let ant-tasks separate, and we have a
+> > pretty good compromise on every aspect
+> > (or even drop ant tasks if really this is causing us too much headache.=
+=2E.)
+> >=20
+> > Regards,
+> >=20
+> > Herv=E9
+> >=20
+> > Le jeudi 16 novembre 2017, 10:03:07 CET Stephen Connolly a =E9crit :
+> >> On Thu 16 Nov 2017 at 07:51, Herv=E9 BOUTEMY <he...@free.fr> w=
+rote:
+> >> > I just pushed an update of dependencies image that shows the external
+> >> > maven-
+> >> > resolver-provider (in yellow) inside the reactor dependency graph (in
+> >> > blue)
+> >> >=20
+> >> > That shows the chicken and egg issue on releasing we'll have on API
+> >> > breaking
+> >> > change. People always building from source (like Debian) will have t=
+he
+> >> > issue
+> >> > also.
+> >> >=20
+> >> > For demos, which are not really published during the release (just as
+> >> > documentation), disabling the module in the build when necessary is
+> >> > sufficient,
+> >> > won't change many things. For ant tasks, disabling the module will n=
+ot
+> >> > publish
+> >> > the artifact: this will have a visible impact.
+> >>=20
+> >> Should we just bite the bullet and bring resolver in-tree as modules in
+> >> maven core... leaving demos and ant tasks here?
+> >>=20
+> >> > Regards,
+> >> >=20
+> >> > Herv=E9
+> >> >=20
+> >> > Le mercredi 15 novembre 2017, 23:05:14 CET Herv=E9 BOUTEMY a =E9crit=
+ :
+> >> > > it seems I have not been clear: I'll try to explain better
+> >> > >=20
+> >> > > 1. maven-resolver-ant-tasks depends on maven-resolver-provider (fr=
+om
+> >> >=20
+> >> > Maven
+> >> >=20
+> >> > > core)
+> >> > > 2. maven-resolver-provider (then Maven core) depends on
+> >> > > maven-resolver
+> >> > >=20
+> >> > > if we put maven-resolver-ant-tasks in the same reactor than
+> >> >=20
+> >> > maven-resolver,
+> >> >=20
+> >> > > we can't release any maven-resolver API change that breaks
+> >> >=20
+> >> > maven-resolver-
+> >> >=20
+> >> > > provider
+> >> > >=20
+> >> > > example: if we move maven-resolver code to org.apache.maven java
+> >> > > package
+> >> >=20
+> >> > in
+> >> >=20
+> >> > > maven-resolver 2.0.0-SNAPSHOT, we need maven-resolver-provider
+> >> > > 4.0.0-SNAPSHOT that uses maven-resolver 2.0.0-SNAPSHOT with this n=
+ew
+> >> > > java
+> >> > > package. Then try to release anything: you can't, unless you don't
+> >> > > try
+> >> > > to
+> >> > > release maven- resolver-ant-tasks
+> >> > >=20
+> >> > > (the consequence on version consistency is another way to describe
+> >> > > the
+> >> > > issue, but that is more subtle, then I chose to describe the most
+> >> > > visible
+> >> > > issue, with API breaking change)
+> >> > >=20
+> >> > > IMHO, another consequence could be: maven-resolver-ant-tasks would
+> >> >=20
+> >> > perhaps
+> >> >=20
+> >> > > better be versionned like maven-resolver-provider
+> >> > >=20
+> >> > >=20
+> >> > > Merging resolver-demos is really the great big idea: with that mer=
+ge,
+> >> > > modifying maven-rresolver can immediately be tested with demos:
+> >> > > that'll
+> >> >=20
+> >> > be
+> >> >=20
+> >> > > so much easier to make changes to maven-resolver code!
+> >> > >=20
+> >> > > Regards,
+> >> > >=20
+> >> > > Herv=E9
+> >> > >=20
+> >> > > Le mercredi 15 novembre 2017, 09:02:12 CET Michael Osipov a =E9cri=
+t :
+> >> > > > Why -1 on the Ant tasks?
+> >> > > >=20
+> >> > > > Am 2017-11-15 um 00:50 schrieb Herv=E9 BOUTEMY:
+> >> > > > > I answered on the mailing list and on the 2 Jira issues
+> >> > > > > In summary, +1 to merge demos, -1 to merge ant-tasks
+> >> > > > >=20
+> >> > > > > Regards,
+> >> > > > >=20
+> >> > > > > Herv=E9
+> >> > > > >=20
+> >> > > > > Le mardi 14 novembre 2017, 18:19:40 CET Manfred Moser a =E9cri=
+t :
+> >> > > > >> Any feedback or should I just go ahead with the cleanup?
+> >> > > > >>=20
+> >> > > > >> Manfred
+> >> > > > >>=20
+> >> > > > >> Manfred Moser wrote on 2017-11-08 21:35:
+> >> > > > >>> Hi all,
+> >> > > > >>>=20
+> >> > > > >>> I have started and made good progress on getting Maven resol=
+ver
+> >> > > > >>> all
+> >> > > > >>> into
+> >> > > > >>> the master branch instead of having master, demos and ant-ta=
+sks
+> >> > > > >>> in
+> >> > > > >>> separate branches.
+> >> > > > >>>=20
+> >> > > > >>> Details are tracked in
+> >> > > > >>> https://issues.apache.org/jira/browse/MRESOLVER-28
+> >> > > > >>>=20
+> >> > > > >>> All of it is now in a new branch called master-all for you to
+> >> > > > >>> see.
+> >> > > > >>>=20
+> >> > > > >>> I am now wondering what the next steps are. I added what I
+> >> > > > >>> think
+> >> > > > >>> should
+> >> > > > >>> happen next in the issue in a comment and would appreciate a=
+ny
+> >> >=20
+> >> > input
+> >> >=20
+> >> > > > >>> on
+> >> > > > >>> the current setup and next steps.
+> >> > > > >>>=20
+> >> > > > >>> Any help would be appreciated.
+> >> > > > >>>=20
+> >> > > > >>> manfred
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> >=20
+> >> > > > >> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > >> For additional commands, e-mail: dev-help@maven.apache.org
+> >> > > > >=20
+> >> > > > > --------------------------------------------------------------=
+=2D--
+> >> > > > > ---
+> >> > > > > -
+> >> > > > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> > >=20
+> >> > > ------------------------------------------------------------------=
+=2D--
+> >> > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > --
+> >>=20
+> >> Sent from my phone
+> >=20
+> > ---------------------------------------------------------------------
+> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> > For additional commands, e-mail: dev-help@maven.apache.org
+>=20
+> ---------------------------------------------------------------------
+> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> For additional commands, e-mail: dev-help@maven.apache.org
+
+
+
+--nextPart23989684.4Xbeelhfra
+Content-Type: text/plain; charset=us-ascii
+
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+--nextPart23989684.4Xbeelhfra--
+
+
+From dev-return-124732-archive-asf-public=cust-asf.ponee.io@maven.apache.org Mon Dec 04 11:39:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io
+Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io
+Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183])
+ by cust-asf2.ponee.io (Postfix) with ESMTP id EEC6C200D50
+ for <ar...@cust-asf2.ponee.io>; Mon, 4 Dec 2017 12:39:36 +0100 (CET)
+Received: by cust-asf.ponee.io (Postfix)
+ id EB9DF160C05; Mon, 4 Dec 2017 11:39:36 +0000 (UTC)
+Delivered-To: archive-asf-public@cust-asf.ponee.io
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by cust-asf.ponee.io (Postfix) with SMTP id 358C9160BF9
+ for <ar...@cust-asf.ponee.io>; Mon, 4 Dec 2017 12:39:36 +0100 (CET)
+Received: (qmail 14334 invoked by uid 500); 4 Dec 2017 11:39:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 14323 invoked by uid 99); 4 Dec 2017 11:39:35 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Dec 2017 11:39:35 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+Message-ID: <15...@gitbox.apache.org>
+archived-at: Mon, 04 Dec 2017 11:39:37 -0000
+
+slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+URL: https://github.com/apache/maven-doxia/pull/6#issuecomment-348937905
+
+
+ ok, plugin updates removed
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
diff --git a/corpus/maven_duplicates_2017_mailarchivesao.mbox b/corpus/maven_duplicates_2017_mailarchivesao.mbox
new file mode 100644
index 0000000..b4688fc
--- /dev/null
+++ b/corpus/maven_duplicates_2017_mailarchivesao.mbox
@@ -0,0 +1,2138 @@
+From dev-return-124335-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Thu Oct 26 07:40:10 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id F090817E26
+ for <ap...@www.apache.org>; Thu, 26 Oct 2017 07:40:10 +0000 (UTC)
+Received: (qmail 16645 invoked by uid 500); 26 Oct 2017 07:40:07 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 16272 invoked by uid 500); 26 Oct 2017 07:40:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 15739 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+URL: https://github.com/apache/maven-enforcer/pull/20
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+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 7c21bd6..75d9842 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
+@@ -24,10 +24,6 @@
+ import java.util.List;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.enforcer.rule.api.EnforcerRule;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+@@ -35,9 +31,9 @@
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.plugins.enforcer.utils.DependencyVersionMap;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -63,7 +59,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -78,17 +74,11 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ try
+ {
+ MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class );
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node = dependencyTreeBuilder.buildDependencyTree( project, repository, factory,
+- metadataSource, filter, collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph( project, filter );
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -98,7 +88,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 71210e2..426c32d 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -26,10 +26,6 @@
+ import java.util.Map;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.artifact.versioning.ArtifactVersion;
+ import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+@@ -38,10 +34,10 @@
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -78,7 +74,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -87,24 +83,17 @@ public void setUniqueVersions( boolean uniqueVersions )
+ * @throws EnforcerRuleException when the build should fail
+ */
+ // CHECKSTYLE_ON: LineLength
+- private DependencyNode getNode( EnforcerRuleHelper helper )
++ private DependencyNode getNode(EnforcerRuleHelper helper )
+ throws EnforcerRuleException
+ {
+ try
+ {
+- MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ MavenProject project = (MavenProject) helper.evaluate("${project}");
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent(DependencyGraphBuilder.class);
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node =
+- dependencyTreeBuilder.buildDependencyTree( project, repository, factory, metadataSource, filter,
+- collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph(project, filter);
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -114,7 +103,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+index 2ec4ac2..ece772b 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+@@ -26,8 +26,8 @@
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.plugin.logging.Log;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+
+ /**
+ * @author Brian Fox
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124337-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Thu Oct 26 07:40:11 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id 1B60F17E33
+ for <ap...@www.apache.org>; Thu, 26 Oct 2017 07:40:11 +0000 (UTC)
+Received: (qmail 17314 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 16848 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16129 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+URL: https://github.com/apache/maven-enforcer/pull/28
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+new file mode 100644
+index 0000000..a07d2f1
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+@@ -0,0 +1,17 @@
++# 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.goals = install -Drevision=0.10.0-SNAPSHOT
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+new file mode 100644
+index 0000000..a6807af
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+@@ -0,0 +1,36 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ </parent>
++
++ <artifactId>menforcer281-module</artifactId>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+new file mode 100644
+index 0000000..e9d613b
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+@@ -0,0 +1,115 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++ <properties>
++ <revision>0.0.1-SNAPSHOT</revision>
++ </properties>
++
++ <build>
++ <pluginManagement>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-clean-plugin</artifactId>
++ <version>2.5</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-resources-plugin</artifactId>
++ <version>2.6</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-compiler-plugin</artifactId>
++ <version>2.5.1</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-surefire-plugin</artifactId>
++ <version>2.12.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-jar-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-install-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-deploy-plugin</artifactId>
++ <version>2.7</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-site-plugin</artifactId>
++ <version>3.2</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>test</id>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ <configuration>
++ <rules>
++ <requirePluginVersions>
++ <banSnapshots>false</banSnapshots>
++ </requirePluginVersions>
++ </rules>
++ </configuration>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </pluginManagement>
++
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ </plugin>
++ </plugins>
++ </build>
++
++ <modules>
++ <module>menforcer281-module</module>
++ </modules>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124338-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Thu Oct 26 07:40:11 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id 0670F17E2C
+ for <ap...@www.apache.org>; Thu, 26 Oct 2017 07:40:11 +0000 (UTC)
+Received: (qmail 17906 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 16859 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16131 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+URL: https://github.com/apache/maven-enforcer/pull/25
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 2600b36..4c0ccde 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -21,9 +21,11 @@
+
+ import java.util.ArrayList;
+ import java.util.Collections;
++import java.util.HashSet;
+ import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
++import java.util.Set;
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.artifact.factory.ArtifactFactory;
+@@ -67,6 +69,13 @@
+ * @since TBD
+ */
+ private List<String> excludes = null;
++
++ /**
++ * Dependency scopes to ignore.
++ *
++ * @since TBD
++ */
++ private List<String> ignoredDependencyScopes;
+
+ /**
+ * Set to {@code true} if timestamped snapshots should be used.
+@@ -88,6 +97,17 @@ public void setExcludes( List<String> excludes )
+ this.excludes = excludes;
+ }
+
++ /**
++ * Ignores particular dependency scopes.
++ *
++ * @param scopes a list of ignored scopes
++ * @since TBD
++ */
++ public void setIgnoreDependencyScopes( List<String> scopes )
++ {
++ this.ignoredDependencyScopes = scopes;
++ }
++
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+@@ -143,8 +163,8 @@ public void execute( EnforcerRuleHelper helper )
+ try
+ {
+ DependencyNode node = getNode( helper );
+- RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor();
+- visitor.setUniqueVersions( uniqueVersions );
++ RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor
++ ( uniqueVersions, ignoredDependencyScopes, log );
+ node.accept( visitor );
+ List<String> errorMessages = buildErrorMessages( visitor.getConflicts() );
+ if ( errorMessages.size() > 0 )
+@@ -242,11 +262,16 @@ private String getFullArtifactName( DependencyNode node, boolean usePremanaged )
+ implements DependencyNodeVisitor
+ {
+
+- private boolean uniqueVersions;
++ private final boolean uniqueVersions;
++ private final Set<String> ignoredDependencyScopes;
++ private final Log log;
+
+- public void setUniqueVersions( boolean uniqueVersions )
++ public RequireUpperBoundDepsVisitor( boolean uniqueVersions, List<String> ignoredDependencyScopes, Log log )
+ {
+ this.uniqueVersions = uniqueVersions;
++ this.ignoredDependencyScopes = ignoredDependencyScopes != null
++ ? new HashSet<String>( ignoredDependencyScopes ) : null;
++ this.log = log;
+ }
+
+ private Map<String, List<DependencyNodeHopCountPair>> keyToPairsMap =
+@@ -254,6 +279,16 @@ public void setUniqueVersions( boolean uniqueVersions )
+
+ public boolean visit( DependencyNode node )
+ {
++ Artifact artifact = node.getArtifact();
++ String artifactScope = artifact.getScope();
++ if ( ignoredDependencyScopes != null && ignoredDependencyScopes.contains( artifactScope ) )
++ {
++ // If the scope is ignored, skip the artifact and its children
++ String groupArt = artifact.getGroupId() + ":" + artifact.getArtifactId();
++ log.warn( "Skipping dependency " + groupArt + ". Its scope is ignored: " + artifactScope );
++ return false;
++ }
++
+ DependencyNodeHopCountPair pair = new DependencyNodeHopCountPair( node );
+ String key = pair.constructKey();
+ List<DependencyNodeHopCountPair> pairs = keyToPairsMap.get( key );
+diff --git a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+index b34a6f4..1c136f7 100644
+--- a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
++++ b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+@@ -109,6 +109,11 @@ and
+ <exclude>com.google.guava:guava</exclude>
+ </excludes>
+ -->
++ <!-- If you wish to ignore certain dependency scopes:
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ -->
+ </requireUpperBoundDeps>
+ </rules>
+ </configuration>
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+index f1bd2c3..03bd847 100644
+--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+@@ -121,7 +121,19 @@ public static EnforcerRuleHelper getHelper( MavenProject project )
+ * @param mockExpression the mock expression
+ * @return the helper
+ */
+- public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression )
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression ) {
++ return getHelper(project, mockExpression, null);
++ }
++
++ /**
++ * Gets the helper.
++ *
++ * @param project the project
++ * @param mockExpression the mock expression
++ * @param container Plexus container to be used. If {@code null}, a default Maven Session one will be used.
++ * @return the helper
++ */
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression, PlexusContainer container)
+ {
+ MavenSession session = getMavenSession();
+ ExpressionEvaluator eval;
+@@ -136,7 +148,7 @@ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockEx
+ session.setCurrentProject( project );
+ eval = new PluginParameterExpressionEvaluator( session, mockExecution );
+ }
+- return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), null );
++ return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), container );
+ }
+
+ /**
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+new file mode 100644
+index 0000000..08aa92e
+--- /dev/null
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+@@ -0,0 +1,187 @@
++package org.apache.maven.plugins.enforcer;
++
++import java.util.ArrayList;
++import java.util.Arrays;
++import java.util.List;
++import org.apache.maven.artifact.Artifact;
++import org.apache.maven.artifact.factory.ArtifactFactory;
++import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
++import org.apache.maven.artifact.repository.ArtifactRepository;
++import org.apache.maven.artifact.resolver.ArtifactCollector;
++import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
++import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
++import org.apache.maven.plugin.testing.ArtifactStubFactory;
++import org.apache.maven.plugins.enforcer.utils.TestEnforcerRuleUtils;
++import org.apache.maven.project.MavenProject;
++import org.apache.maven.shared.dependency.tree.DependencyNode;
++import org.apache.maven.shared.dependency.tree.DependencyTree;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.codehaus.plexus.DefaultPlexusContainer;
++import org.codehaus.plexus.PlexusContainer;
++import org.junit.Before;
++import org.junit.Test;
++
++/*
++ * 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.
++ */
++
++/**
++ * Tests for {@link RequireUpperBoundDeps}.
++ * @author Oleg Nenashev
++ */
++public class TestRequireUpperBoundDeps {
++
++ private MavenProject project;
++
++ private EnforcerRuleHelper helper;
++
++ private ArtifactStubFactory factory;
++
++ private RequireUpperBoundDeps rule;
++ private MockDependencyTreeBuilder dependencyTree;
++
++ Artifact library1_10, library1_20, library2_10;
++
++ @Before
++ public void before() throws Exception
++ {
++ PlexusContainer c = new DefaultPlexusContainer();
++ dependencyTree = new MockDependencyTreeBuilder();
++ factory = new ArtifactStubFactory();
++
++ project = new MockProject();
++ project.setArtifact(factory.createArtifact("my", "project", "1.0"));
++ library1_10 = factory.createArtifact("my", "library1", "1.0");
++ library1_20 = factory.createArtifact("my", "library1", "2.0");
++ library2_10 = factory.createArtifact("my", "library2", "1.0");
++
++ helper = EnforcerTestUtils.getHelper(project, false, c);
++ helper.getContainer().addComponent(dependencyTree, DependencyTreeBuilder.class.getName());
++
++ rule = new RequireUpperBoundDeps();
++ }
++
++ @Test
++ public void testShouldPassForSameDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ @Test
++ public void testShouldFailForNewerDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ @Test
++ public void testShouldPassForOlderDependencies() throws Exception {
++ dependencyTree.addDependency(library1_20);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-273
++ @Test
++ public void testShouldPassForOlderDependencyIfExcluded() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setExcludes(Arrays.asList("my:library1"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldPassIfTestArtifactsAreIgnored() throws Exception {
++ dependencyTree.addDependency(library1_10);
++
++ library2_10.setScope("test");
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setIgnoreDependencyScopes(Arrays.asList("test"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldFailIfWrongScopeIsIgnored() throws Exception {
++ testShouldPassIfTestArtifactsAreIgnored();
++ rule.setIgnoreDependencyScopes(Arrays.asList("provided"));
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ // TODO: make it a generic class
++ private static final class MockDependencyTreeBuilder implements DependencyTreeBuilder {
++
++ List<DependencyNode> dependencies = new ArrayList<DependencyNode>();
++
++ public void addDependency(DependencyNode node) {
++ dependencies.add(node);
++ }
++
++ public void addDependency(Artifact artifact) {
++ dependencies.add(new DependencyNode(artifact));
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource, ArtifactFilter filter,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ DependencyNode root = new DependencyNode(project.getArtifact());
++ for (DependencyNode child : dependencies) {
++ root.addChild(child);
++ }
++ return root;
++ }
++
++ @Override
++ public DependencyTree buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject arg0, ArtifactRepository arg1, ArtifactFilter arg2) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ }
++}
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties
+new file mode 100644
+index 0000000..c98ac4c
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/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
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+new file mode 100644
+index 0000000..307987a
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+@@ -0,0 +1,63 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276/artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <RequireUpperBoundDeps/>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+new file mode 100644
+index 0000000..38bb648
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+@@ -0,0 +1,32 @@
++/*
++ * 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 LS = System.getProperty( "line.separator" )
++File buildLog = new File( basedir, 'build.log' )
++
++assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:' )
++def message =
++'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 paths to dependency are:'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0'+LS+
++'and'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_classic:0.9.9'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0'+LS
++assert buildLog.text.contains( message )
++
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+new file mode 100644
+index 0000000..dc0aa79
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+@@ -0,0 +1,67 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <requireUpperBoundDeps>
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ </requireUpperBoundDeps>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124340-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Thu Oct 26 07:41:43 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id 81CC317E6C
+ for <ap...@www.apache.org>; Thu, 26 Oct 2017 07:41:43 +0000 (UTC)
+Received: (qmail 26629 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 26537 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 26524 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #4: Update to ASM5 opscode.
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #4: Update to ASM5 opscode.
+URL: https://github.com/apache/maven-plugin-tools/pull/4
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+index 2993553d..e241987e 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+@@ -41,7 +41,7 @@
+
+ MojoAnnotationVisitor( Logger logger, String annotationClassName )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.annotationClassName = annotationClassName;
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+index f2333d4b..cbedfecd 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+@@ -53,7 +53,7 @@
+
+ public MojoClassVisitor( Logger logger )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ }
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+index 4a61a01e..783cbcbf 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+@@ -44,7 +44,7 @@
+
+ MojoFieldVisitor( Logger logger, String fieldName, String className )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.fieldName = fieldName;
+ this.className = className;
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124342-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Thu Oct 26 07:41:44 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id EF52417E78
+ for <ap...@www.apache.org>; Thu, 26 Oct 2017 07:41:44 +0000 (UTC)
+Received: (qmail 27540 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 27357 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 27288 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+URL: https://github.com/apache/maven-plugin-tools/pull/6
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+index e442310f..5a5d8d8c 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+@@ -117,4 +117,44 @@
+ * @return is thread safe
+ */
+ boolean threadSafe() default false;
++
++ /**
++ * Description for this Mojo. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this Mojo was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this Mojo is deprecated.
++ *
++ * <p>If this is given, then the Mojo should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Mojo(..., deprecated = "this Mojo is no longer used")
++public class ExampleMojo extends AbstractMojo { ... }</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+index ec9dbcf6..f364e945 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+@@ -85,4 +85,44 @@
+ * @return <code>true</code> if the user should not be allowed to configure the parameter directly
+ */
+ boolean readonly() default false;
++
++ /**
++ * Description for this parameter. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this parameter was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this parameter is deprecated.
++ *
++ * <p>If this is given, then the parameter should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Parameter(..., deprecated = "this parameter is no longer used")
++private String oldParameterThatNowDoesNothing;</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+index 33104cb8..663435ff 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+@@ -207,6 +207,36 @@ public void name( String name )
+ this.name = name;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ @Override
+ public String toString()
+ {
+@@ -226,6 +256,9 @@ public String toString()
+ sb.append( ", inheritByDefault=" ).append( inheritByDefault );
+ sb.append( ", configurator='" ).append( configurator ).append( '\'' );
+ sb.append( ", threadSafe=" ).append( threadSafe );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+index 919aaa4b..ca8a49fc 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+@@ -63,6 +63,16 @@ public ParameterAnnotationContent( String fieldName, String alias, String proper
+ this.readonly = readonly;
+ }
+
++ public ParameterAnnotationContent( String fieldName, String alias, String property, String defaultValue,
++ boolean required, boolean readonly, String className,
++ String deprecated, String description, String since )
++ {
++ this( fieldName, alias, property, defaultValue, required, readonly, className );
++ deprecated( deprecated );
++ description( description );
++ since( since );
++ }
++
+ public String name()
+ {
+ return name;
+@@ -123,6 +133,36 @@ public void readonly( boolean readonly )
+ this.readonly = readonly;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ public Class<? extends Annotation> annotationType()
+ {
+ return null;
+@@ -150,6 +190,9 @@ public String toString()
+ sb.append( ", defaultValue='" ).append( defaultValue ).append( '\'' );
+ sb.append( ", required=" ).append( required );
+ sb.append( ", readonly=" ).append( readonly );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+@@ -194,6 +237,18 @@ public boolean equals( Object o )
+ {
+ return false;
+ }
++ if ( deprecated() != null ? !deprecated().equals( that.deprecated() ) : that.deprecated() != null )
++ {
++ return false;
++ }
++ if ( description() != null ? !description().equals( that.description() ) : that.description() != null )
++ {
++ return false;
++ }
++ if ( since() != null ? !since().equals( that.since() ) : that.since() != null )
++ {
++ return false;
++ }
+
+ return true;
+ }
+@@ -207,6 +262,9 @@ public int hashCode()
+ result = 31 * result + ( defaultValue != null ? defaultValue.hashCode() : 0 );
+ result = 31 * result + ( required ? 1 : 0 );
+ result = 31 * result + ( readonly ? 1 : 0 );
++ result = 31 * result + ( deprecated() != null ? deprecated().hashCode() : 0 );
++ result = 31 * result + ( description() != null ? description().hashCode() : 0 );
++ result = 31 * result + ( since() != null ? since().hashCode() : 0 );
+ return result;
+ }
+ }
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+index 673f8b1a..ee8527b2 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+@@ -33,7 +33,7 @@
+ /**
+ * @author Olivier Lamy
+ */
+-@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true )
++@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true, description = "This is a description.", since = "3.5", deprecated = "because I said so" )
+ @Execute( goal = "compiler", lifecycle = "my-lifecycle", phase = LifecyclePhase.PACKAGE )
+ public class FooMojo
+ extends AbstractMojo
+@@ -52,6 +52,10 @@
+ @Parameter( property = "thebeer", defaultValue = "coolbeer" )
+ protected String beer;
+
++ @Parameter( description = "wine for french folks", since = "forever ago", deprecated = "beer is better" )
++ @Deprecated
++ protected String wine;
++
+ /**
+ * Plexus compiler manager.
+ */
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+index 17a24bfd..12359bee 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+@@ -71,6 +71,9 @@ public void testReadMojoClass()
+ assertEquals( true, mojo.threadSafe() );
+ assertEquals( false, mojo.aggregator() );
+ assertEquals( LifecyclePhase.COMPILE, mojo.defaultPhase() );
++ assertEquals( "This is a description.", mojo.description() );
++ assertEquals( "3.5", mojo.since() );
++ assertEquals( "because I said so", mojo.deprecated() );
+
+ Execute execute = mojoAnnotatedClass.getExecute();
+
+@@ -82,9 +85,12 @@ public void testReadMojoClass()
+ Assertions.assertThat( components ).isNotNull().isNotEmpty().hasSize( 2 );
+
+ Collection<ParameterAnnotationContent> parameters = mojoAnnotatedClass.getParameters().values();
+- Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 2 ).contains(
++ Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 3 ).contains(
+ new ParameterAnnotationContent( "bar", null, "thebar", "coolbar", true, false, String.class.getName() ),
+ new ParameterAnnotationContent( "beer", null, "thebeer", "coolbeer", false, false,
+- String.class.getName() ) );
++ String.class.getName() ),
++ new ParameterAnnotationContent( "wine", null, null, null, false, false,
++ String.class.getName(), "beer is better", "wine for french folks",
++ "forever ago" ) );
+ }
+ }
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124353-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Fri Oct 27 02:33:38 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id 7D50310F11
+ for <ap...@www.apache.org>; Fri, 27 Oct 2017 02:33:38 +0000 (UTC)
+Received: (qmail 37832 invoked by uid 500); 27 Oct 2017 02:33:38 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 37730 invoked by uid 500); 27 Oct 2017 02:33:38 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 37719 invoked by uid 99); 27 Oct 2017 02:33:38 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 27 Oct 2017 02:33:38 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+Message-ID: <15...@gitbox.apache.org>
+
+olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+URL: https://github.com/apache/maven-release/pull/19#issuecomment-339855892
+
+
+ @theit I'm happy with this changes. Except the lack of test. Is there anything you can do? A plugin IT test?
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124404-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Sat Nov 4 14:33:07 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id 9CB4B10006
+ for <ap...@www.apache.org>; Sat, 4 Nov 2017 14:33:07 +0000 (UTC)
+Received: (qmail 82394 invoked by uid 500); 4 Nov 2017 14:33:07 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 82314 invoked by uid 500); 4 Nov 2017 14:33:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 82303 invoked by uid 99); 4 Nov 2017 14:33:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:33:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+
+hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27#issuecomment-341901250
+
+
+ sorry, this was automatically closed when migrating to Git and deleting old trunk branch
+ reopening
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124407-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Sat Nov 4 14:41:35 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id 969F610039
+ for <ap...@www.apache.org>; Sat, 4 Nov 2017 14:41:35 +0000 (UTC)
+Received: (qmail 92123 invoked by uid 500); 4 Nov 2017 14:41:35 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 92040 invoked by uid 500); 4 Nov 2017 14:41:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 91799 invoked by uid 99); 4 Nov 2017 14:41:34 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:41:34 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+
+hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+index 890814a..bc7dcf9 100644
+--- a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
++++ b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+@@ -16,7 +16,7 @@
+ ~~ under the License.
+
+ -----
+- Comparing against a specific artifact
++ Dependency Convergence
+ -----
+ -----
+ 2008-09-13
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124501-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Fri Nov 17 08:40:35 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id CFB0E179CA
+ for <ap...@www.apache.org>; Fri, 17 Nov 2017 08:40:35 +0000 (UTC)
+Received: (qmail 13313 invoked by uid 500); 17 Nov 2017 08:40:35 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 13228 invoked by uid 500); 17 Nov 2017 08:40:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 13217 invoked by uid 99); 17 Nov 2017 08:40:35 -0000
+Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 17 Nov 2017 08:40:35 +0000
+Received: from localhost (localhost [127.0.0.1])
+ by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 0478C18088F
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:33 +0000 (UTC)
+X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org
+X-Spam-Flag: NO
+X-Spam-Score: -1
+X-Spam-Level:
+X-Spam-Status: No, score=-1 tagged_above=-999 required=6.31
+ tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1,
+ RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-2.8] autolearn=disabled
+Received: from mx1-lw-us.apache.org ([10.40.0.8])
+ by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024)
+ with ESMTP id QNrCLGJBrxBw for <de...@maven.apache.org>;
+ Fri, 17 Nov 2017 08:40:31 +0000 (UTC)
+Received: from smtp.smtpout.orange.fr (smtp03.smtpout.orange.fr [80.12.242.125])
+ by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTPS id 796F95F569
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:29 +0000 (UTC)
+Received: from giga.localnet ([86.238.16.93])
+ by mwinf5d50 with ME
+ id awgN1w00K20Ufdy03wgNhg; Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-Helo: giga.localnet
+X-ME-Date: Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-IP: 86.238.16.93
+From: =?ISO-8859-1?Q?Herv=E9?= BOUTEMY <he...@free.fr>
+To: Maven Developers List <de...@maven.apache.org>
+Subject: Re: Maven resolver branch consolidation
+Date: Fri, 17 Nov 2017 09:40:22 +0100
+Message-ID: <25...@giga>
+In-Reply-To: <20...@dd17332.kasserver.com>
+References: <20...@dd17332.kasserver.com> <16...@giga> <20...@dd17332.kasserver.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="nextPart23989684.4Xbeelhfra"
+Content-Transfer-Encoding: 7Bit
+
+--nextPart23989684.4Xbeelhfra
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain; charset="iso-8859-1"
+
+on the second option, I was ready to just answer "not possible", but decide=
+d I=20
+could try at high level before answering...
+
+I took Maven core dependency tree [1], picked green color as the definition=
+ of=20
+Maven Artifact Resolver, put maven-resolver-provider in green + settings=20
+builder (since used by resolver ant tasks: that's a detail I didn't put in=
+=20
+latest resolver dependency tree)
+Then I extended green to every transitive dependency to have an independent=
+=20
+releasable reactor
+
+You'll find as a result the attached image.
+
+Analysis:
+=2D this splits Maven core in 2 parts: lower part on dependency resolution,=
+=20
+higher part on build
+=2D settings.xml and pom.xml are in dependency resolution
+
+Reaction: it could be for Maven 5 or 6, when consumer pom is strictly separ=
+ate=20
+from build pom...
+
+Regards,
+
+Herv=E9
+
+[1] http://maven.apache.org/ref/3.5.2/
+
+Le jeudi 16 novembre 2017, 18:13:15 CET Manfred Moser a =E9crit :
+> Thanks for the explanation and details Herve. Seems to be that to do this
+> cleanly we have to break the circle. From my limited knowledge there are
+> two ways to do that.
+>=20
+> 1. As stephen suggested.. get the resolver into maven core tree. That mak=
+es
+> core bigger again and ties the two projects into one release cycle.
+> Feasible but I am not a fan.
+>=20
+> 2. I am not sure if possible but .. could we get the maven resolver provi=
+der
+> out of maven core and into the resolver project and have it all together =
+in
+> there?
+>=20
+> In either case .. both of those seem rather large tasks so I will definit=
+ely
+> go ahead with demo branch merge first. I just have to redo the work I did
+> without the ant tasks in the tree. Stay tuned on that..
+>=20
+> Manfred
+>=20
+> Herv=E9 BOUTEMY wrote on 2017-11-16 05:49:
+> > feasible, but I really don't like it: separation is good.
+> >=20
+> > seriously, just merge demos and let ant-tasks separate, and we have a
+> > pretty good compromise on every aspect
+> > (or even drop ant tasks if really this is causing us too much headache.=
+=2E.)
+> >=20
+> > Regards,
+> >=20
+> > Herv=E9
+> >=20
+> > Le jeudi 16 novembre 2017, 10:03:07 CET Stephen Connolly a =E9crit :
+> >> On Thu 16 Nov 2017 at 07:51, Herv=E9 BOUTEMY <he...@free.fr> w=
+rote:
+> >> > I just pushed an update of dependencies image that shows the external
+> >> > maven-
+> >> > resolver-provider (in yellow) inside the reactor dependency graph (in
+> >> > blue)
+> >> >=20
+> >> > That shows the chicken and egg issue on releasing we'll have on API
+> >> > breaking
+> >> > change. People always building from source (like Debian) will have t=
+he
+> >> > issue
+> >> > also.
+> >> >=20
+> >> > For demos, which are not really published during the release (just as
+> >> > documentation), disabling the module in the build when necessary is
+> >> > sufficient,
+> >> > won't change many things. For ant tasks, disabling the module will n=
+ot
+> >> > publish
+> >> > the artifact: this will have a visible impact.
+> >>=20
+> >> Should we just bite the bullet and bring resolver in-tree as modules in
+> >> maven core... leaving demos and ant tasks here?
+> >>=20
+> >> > Regards,
+> >> >=20
+> >> > Herv=E9
+> >> >=20
+> >> > Le mercredi 15 novembre 2017, 23:05:14 CET Herv=E9 BOUTEMY a =E9crit=
+ :
+> >> > > it seems I have not been clear: I'll try to explain better
+> >> > >=20
+> >> > > 1. maven-resolver-ant-tasks depends on maven-resolver-provider (fr=
+om
+> >> >=20
+> >> > Maven
+> >> >=20
+> >> > > core)
+> >> > > 2. maven-resolver-provider (then Maven core) depends on
+> >> > > maven-resolver
+> >> > >=20
+> >> > > if we put maven-resolver-ant-tasks in the same reactor than
+> >> >=20
+> >> > maven-resolver,
+> >> >=20
+> >> > > we can't release any maven-resolver API change that breaks
+> >> >=20
+> >> > maven-resolver-
+> >> >=20
+> >> > > provider
+> >> > >=20
+> >> > > example: if we move maven-resolver code to org.apache.maven java
+> >> > > package
+> >> >=20
+> >> > in
+> >> >=20
+> >> > > maven-resolver 2.0.0-SNAPSHOT, we need maven-resolver-provider
+> >> > > 4.0.0-SNAPSHOT that uses maven-resolver 2.0.0-SNAPSHOT with this n=
+ew
+> >> > > java
+> >> > > package. Then try to release anything: you can't, unless you don't
+> >> > > try
+> >> > > to
+> >> > > release maven- resolver-ant-tasks
+> >> > >=20
+> >> > > (the consequence on version consistency is another way to describe
+> >> > > the
+> >> > > issue, but that is more subtle, then I chose to describe the most
+> >> > > visible
+> >> > > issue, with API breaking change)
+> >> > >=20
+> >> > > IMHO, another consequence could be: maven-resolver-ant-tasks would
+> >> >=20
+> >> > perhaps
+> >> >=20
+> >> > > better be versionned like maven-resolver-provider
+> >> > >=20
+> >> > >=20
+> >> > > Merging resolver-demos is really the great big idea: with that mer=
+ge,
+> >> > > modifying maven-rresolver can immediately be tested with demos:
+> >> > > that'll
+> >> >=20
+> >> > be
+> >> >=20
+> >> > > so much easier to make changes to maven-resolver code!
+> >> > >=20
+> >> > > Regards,
+> >> > >=20
+> >> > > Herv=E9
+> >> > >=20
+> >> > > Le mercredi 15 novembre 2017, 09:02:12 CET Michael Osipov a =E9cri=
+t :
+> >> > > > Why -1 on the Ant tasks?
+> >> > > >=20
+> >> > > > Am 2017-11-15 um 00:50 schrieb Herv=E9 BOUTEMY:
+> >> > > > > I answered on the mailing list and on the 2 Jira issues
+> >> > > > > In summary, +1 to merge demos, -1 to merge ant-tasks
+> >> > > > >=20
+> >> > > > > Regards,
+> >> > > > >=20
+> >> > > > > Herv=E9
+> >> > > > >=20
+> >> > > > > Le mardi 14 novembre 2017, 18:19:40 CET Manfred Moser a =E9cri=
+t :
+> >> > > > >> Any feedback or should I just go ahead with the cleanup?
+> >> > > > >>=20
+> >> > > > >> Manfred
+> >> > > > >>=20
+> >> > > > >> Manfred Moser wrote on 2017-11-08 21:35:
+> >> > > > >>> Hi all,
+> >> > > > >>>=20
+> >> > > > >>> I have started and made good progress on getting Maven resol=
+ver
+> >> > > > >>> all
+> >> > > > >>> into
+> >> > > > >>> the master branch instead of having master, demos and ant-ta=
+sks
+> >> > > > >>> in
+> >> > > > >>> separate branches.
+> >> > > > >>>=20
+> >> > > > >>> Details are tracked in
+> >> > > > >>> https://issues.apache.org/jira/browse/MRESOLVER-28
+> >> > > > >>>=20
+> >> > > > >>> All of it is now in a new branch called master-all for you to
+> >> > > > >>> see.
+> >> > > > >>>=20
+> >> > > > >>> I am now wondering what the next steps are. I added what I
+> >> > > > >>> think
+> >> > > > >>> should
+> >> > > > >>> happen next in the issue in a comment and would appreciate a=
+ny
+> >> >=20
+> >> > input
+> >> >=20
+> >> > > > >>> on
+> >> > > > >>> the current setup and next steps.
+> >> > > > >>>=20
+> >> > > > >>> Any help would be appreciated.
+> >> > > > >>>=20
+> >> > > > >>> manfred
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> >=20
+> >> > > > >> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > >> For additional commands, e-mail: dev-help@maven.apache.org
+> >> > > > >=20
+> >> > > > > --------------------------------------------------------------=
+=2D--
+> >> > > > > ---
+> >> > > > > -
+> >> > > > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> > >=20
+> >> > > ------------------------------------------------------------------=
+=2D--
+> >> > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > --
+> >>=20
+> >> Sent from my phone
+> >=20
+> > ---------------------------------------------------------------------
+> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> > For additional commands, e-mail: dev-help@maven.apache.org
+>=20
+> ---------------------------------------------------------------------
+> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> For additional commands, e-mail: dev-help@maven.apache.org
+
+
+
+--nextPart23989684.4Xbeelhfra
+Content-Type: text/plain; charset=us-ascii
+
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+--nextPart23989684.4Xbeelhfra--
+
+
+From dev-return-124732-apmail-maven-dev-archive=maven.apache.org@maven.apache.org Mon Dec 4 11:39:35 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: apmail-maven-dev-archive@www.apache.org
+Delivered-To: apmail-maven-dev-archive@www.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by minotaur.apache.org (Postfix) with SMTP id 9B6E21790D
+ for <ap...@www.apache.org>; Mon, 4 Dec 2017 11:39:35 +0000 (UTC)
+Received: (qmail 14425 invoked by uid 500); 4 Dec 2017 11:39:35 -0000
+Delivered-To: apmail-maven-dev-archive@maven.apache.org
+Received: (qmail 14334 invoked by uid 500); 4 Dec 2017 11:39:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 14323 invoked by uid 99); 4 Dec 2017 11:39:35 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Dec 2017 11:39:35 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+Message-ID: <15...@gitbox.apache.org>
+
+slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+URL: https://github.com/apache/maven-doxia/pull/6#issuecomment-348937905
+
+
+ ok, plugin updates removed
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
diff --git a/corpus/maven_duplicates_2017_mboxvm.mbox b/corpus/maven_duplicates_2017_mboxvm.mbox
new file mode 100644
index 0000000..8fc7ada
--- /dev/null
+++ b/corpus/maven_duplicates_2017_mboxvm.mbox
@@ -0,0 +1,2118 @@
+From dev-return-124335-archiver=mbox-vm.apache.org@maven.apache.org Thu Oct 26 07:40:09 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id F0EF42A5
+ for <ar...@mbox-vm.apache.org>; Thu, 26 Oct 2017 07:40:08 +0000 (UTC)
+Received: (qmail 16272 invoked by uid 500); 26 Oct 2017 07:40:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 15739 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #20: MENFORCER-195 - use DependencyGraphBuilder API instead of DependencyTreeBuilder
+URL: https://github.com/apache/maven-enforcer/pull/20
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+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 7c21bd6..75d9842 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
+@@ -24,10 +24,6 @@
+ import java.util.List;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.enforcer.rule.api.EnforcerRule;
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+@@ -35,9 +31,9 @@
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.plugins.enforcer.utils.DependencyVersionMap;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -63,7 +59,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -78,17 +74,11 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ try
+ {
+ MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class );
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node = dependencyTreeBuilder.buildDependencyTree( project, repository, factory,
+- metadataSource, filter, collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph( project, filter );
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -98,7 +88,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 71210e2..426c32d 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -26,10 +26,6 @@
+ import java.util.Map;
+
+ import org.apache.maven.artifact.Artifact;
+-import org.apache.maven.artifact.factory.ArtifactFactory;
+-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+-import org.apache.maven.artifact.repository.ArtifactRepository;
+-import org.apache.maven.artifact.resolver.ArtifactCollector;
+ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+ import org.apache.maven.artifact.versioning.ArtifactVersion;
+ import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+@@ -38,10 +34,10 @@
+ import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+ import org.apache.maven.plugin.logging.Log;
+ import org.apache.maven.project.MavenProject;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
++import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+ import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+ import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+ import org.codehaus.plexus.i18n.I18N;
+@@ -78,7 +74,7 @@ public void setUniqueVersions( boolean uniqueVersions )
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+- * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject, ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter, ArtifactCollector)}
++ * {@link DependencyGraphBuilder#buildDependencyGraph(MavenProject, ArtifactFilter)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link EnforcerRuleHelper} has to do.
+ *
+@@ -87,24 +83,17 @@ public void setUniqueVersions( boolean uniqueVersions )
+ * @throws EnforcerRuleException when the build should fail
+ */
+ // CHECKSTYLE_ON: LineLength
+- private DependencyNode getNode( EnforcerRuleHelper helper )
++ private DependencyNode getNode(EnforcerRuleHelper helper )
+ throws EnforcerRuleException
+ {
+ try
+ {
+- MavenProject project = (MavenProject) helper.evaluate( "${project}" );
+- DependencyTreeBuilder dependencyTreeBuilder =
+- (DependencyTreeBuilder) helper.getComponent( DependencyTreeBuilder.class );
+- ArtifactRepository repository = (ArtifactRepository) helper.evaluate( "${localRepository}" );
+- ArtifactFactory factory = (ArtifactFactory) helper.getComponent( ArtifactFactory.class );
+- ArtifactMetadataSource metadataSource =
+- (ArtifactMetadataSource) helper.getComponent( ArtifactMetadataSource.class );
+- ArtifactCollector collector = (ArtifactCollector) helper.getComponent( ArtifactCollector.class );
++ MavenProject project = (MavenProject) helper.evaluate("${project}");
++ DependencyGraphBuilder dependencyGraphBuilder =
++ (DependencyGraphBuilder) helper.getComponent(DependencyGraphBuilder.class);
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+- DependencyNode node =
+- dependencyTreeBuilder.buildDependencyTree( project, repository, factory, metadataSource, filter,
+- collector );
+- return node;
++
++ return dependencyGraphBuilder.buildDependencyGraph(project, filter);
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+@@ -114,7 +103,7 @@ private DependencyNode getNode( EnforcerRuleHelper helper )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " + e.getLocalizedMessage(), e );
+ }
+- catch ( DependencyTreeBuilderException e )
++ catch ( DependencyGraphBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree " + e.getLocalizedMessage(), e );
+ }
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+index 2ec4ac2..ece772b 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+@@ -26,8 +26,8 @@
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.plugin.logging.Log;
+-import org.apache.maven.shared.dependency.tree.DependencyNode;
+-import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
++import org.apache.maven.shared.dependency.graph.DependencyNode;
++import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+
+ /**
+ * @author Brian Fox
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124337-archiver=mbox-vm.apache.org@maven.apache.org Thu Oct 26 07:40:10 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id EC1D52A5
+ for <ar...@mbox-vm.apache.org>; Thu, 26 Oct 2017 07:40:09 +0000 (UTC)
+Received: (qmail 16848 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16129 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #28: [MENFORCER-281] added IT to show the issue.
+URL: https://github.com/apache/maven-enforcer/pull/28
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+new file mode 100644
+index 0000000..a07d2f1
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/invoker.properties
+@@ -0,0 +1,17 @@
++# 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.goals = install -Drevision=0.10.0-SNAPSHOT
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+new file mode 100644
+index 0000000..a6807af
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/menforcer281-module/pom.xml
+@@ -0,0 +1,36 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ </parent>
++
++ <artifactId>menforcer281-module</artifactId>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+new file mode 100644
+index 0000000..e9d613b
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-plugin-versions-mm-ci-friendly/pom.xml
+@@ -0,0 +1,115 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<!--
++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.
++-->
++
++<project>
++ <modelVersion>4.0.0</modelVersion>
++
++ <groupId>org.apache.maven.its.enforcer</groupId>
++ <artifactId>menforcer281-parent</artifactId>
++ <version>${revision}</version>
++ <packaging>pom</packaging>
++
++ <description>
++ </description>
++
++ <properties>
++ <revision>0.0.1-SNAPSHOT</revision>
++ </properties>
++
++ <build>
++ <pluginManagement>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-clean-plugin</artifactId>
++ <version>2.5</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-resources-plugin</artifactId>
++ <version>2.6</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-compiler-plugin</artifactId>
++ <version>2.5.1</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-surefire-plugin</artifactId>
++ <version>2.12.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-jar-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-install-plugin</artifactId>
++ <version>2.4</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-deploy-plugin</artifactId>
++ <version>2.7</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-site-plugin</artifactId>
++ <version>3.2</version>
++ </plugin>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>test</id>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ <configuration>
++ <rules>
++ <requirePluginVersions>
++ <banSnapshots>false</banSnapshots>
++ </requirePluginVersions>
++ </rules>
++ </configuration>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </pluginManagement>
++
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ </plugin>
++ </plugins>
++ </build>
++
++ <modules>
++ <module>menforcer281-module</module>
++ </modules>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124338-archiver=mbox-vm.apache.org@maven.apache.org Thu Oct 26 07:40:10 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id 60CE22A4
+ for <ar...@mbox-vm.apache.org>; Thu, 26 Oct 2017 07:40:10 +0000 (UTC)
+Received: (qmail 16859 invoked by uid 500); 26 Oct 2017 07:40:08 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 16131 invoked by uid 99); 26 Oct 2017 07:40:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:40:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #25: MENFORCER-276 - Support ignoring dependency scopes in RequireUpperBoundDeps
+URL: https://github.com/apache/maven-enforcer/pull/25
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+index 2600b36..4c0ccde 100644
+--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
++++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireUpperBoundDeps.java
+@@ -21,9 +21,11 @@
+
+ import java.util.ArrayList;
+ import java.util.Collections;
++import java.util.HashSet;
+ import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
++import java.util.Set;
+
+ import org.apache.maven.artifact.Artifact;
+ import org.apache.maven.artifact.factory.ArtifactFactory;
+@@ -67,6 +69,13 @@
+ * @since TBD
+ */
+ private List<String> excludes = null;
++
++ /**
++ * Dependency scopes to ignore.
++ *
++ * @since TBD
++ */
++ private List<String> ignoredDependencyScopes;
+
+ /**
+ * Set to {@code true} if timestamped snapshots should be used.
+@@ -88,6 +97,17 @@ public void setExcludes( List<String> excludes )
+ this.excludes = excludes;
+ }
+
++ /**
++ * Ignores particular dependency scopes.
++ *
++ * @param scopes a list of ignored scopes
++ * @since TBD
++ */
++ public void setIgnoreDependencyScopes( List<String> scopes )
++ {
++ this.ignoredDependencyScopes = scopes;
++ }
++
+ // CHECKSTYLE_OFF: LineLength
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+@@ -143,8 +163,8 @@ public void execute( EnforcerRuleHelper helper )
+ try
+ {
+ DependencyNode node = getNode( helper );
+- RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor();
+- visitor.setUniqueVersions( uniqueVersions );
++ RequireUpperBoundDepsVisitor visitor = new RequireUpperBoundDepsVisitor
++ ( uniqueVersions, ignoredDependencyScopes, log );
+ node.accept( visitor );
+ List<String> errorMessages = buildErrorMessages( visitor.getConflicts() );
+ if ( errorMessages.size() > 0 )
+@@ -242,11 +262,16 @@ private String getFullArtifactName( DependencyNode node, boolean usePremanaged )
+ implements DependencyNodeVisitor
+ {
+
+- private boolean uniqueVersions;
++ private final boolean uniqueVersions;
++ private final Set<String> ignoredDependencyScopes;
++ private final Log log;
+
+- public void setUniqueVersions( boolean uniqueVersions )
++ public RequireUpperBoundDepsVisitor( boolean uniqueVersions, List<String> ignoredDependencyScopes, Log log )
+ {
+ this.uniqueVersions = uniqueVersions;
++ this.ignoredDependencyScopes = ignoredDependencyScopes != null
++ ? new HashSet<String>( ignoredDependencyScopes ) : null;
++ this.log = log;
+ }
+
+ private Map<String, List<DependencyNodeHopCountPair>> keyToPairsMap =
+@@ -254,6 +279,16 @@ public void setUniqueVersions( boolean uniqueVersions )
+
+ public boolean visit( DependencyNode node )
+ {
++ Artifact artifact = node.getArtifact();
++ String artifactScope = artifact.getScope();
++ if ( ignoredDependencyScopes != null && ignoredDependencyScopes.contains( artifactScope ) )
++ {
++ // If the scope is ignored, skip the artifact and its children
++ String groupArt = artifact.getGroupId() + ":" + artifact.getArtifactId();
++ log.warn( "Skipping dependency " + groupArt + ". Its scope is ignored: " + artifactScope );
++ return false;
++ }
++
+ DependencyNodeHopCountPair pair = new DependencyNodeHopCountPair( node );
+ String key = pair.constructKey();
+ List<DependencyNodeHopCountPair> pairs = keyToPairsMap.get( key );
+diff --git a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+index b34a6f4..1c136f7 100644
+--- a/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
++++ b/enforcer-rules/src/site/apt/requireUpperBoundDeps.apt.vm
+@@ -109,6 +109,11 @@ and
+ <exclude>com.google.guava:guava</exclude>
+ </excludes>
+ -->
++ <!-- If you wish to ignore certain dependency scopes:
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ -->
+ </requireUpperBoundDeps>
+ </rules>
+ </configuration>
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+index f1bd2c3..03bd847 100644
+--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+@@ -121,7 +121,19 @@ public static EnforcerRuleHelper getHelper( MavenProject project )
+ * @param mockExpression the mock expression
+ * @return the helper
+ */
+- public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression )
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression ) {
++ return getHelper(project, mockExpression, null);
++ }
++
++ /**
++ * Gets the helper.
++ *
++ * @param project the project
++ * @param mockExpression the mock expression
++ * @param container Plexus container to be used. If {@code null}, a default Maven Session one will be used.
++ * @return the helper
++ */
++ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockExpression, PlexusContainer container)
+ {
+ MavenSession session = getMavenSession();
+ ExpressionEvaluator eval;
+@@ -136,7 +148,7 @@ public static EnforcerRuleHelper getHelper( MavenProject project, boolean mockEx
+ session.setCurrentProject( project );
+ eval = new PluginParameterExpressionEvaluator( session, mockExecution );
+ }
+- return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), null );
++ return new DefaultEnforcementRuleHelper( session, eval, new SystemStreamLog(), container );
+ }
+
+ /**
+diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+new file mode 100644
+index 0000000..08aa92e
+--- /dev/null
++++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireUpperBoundDeps.java
+@@ -0,0 +1,187 @@
++package org.apache.maven.plugins.enforcer;
++
++import java.util.ArrayList;
++import java.util.Arrays;
++import java.util.List;
++import org.apache.maven.artifact.Artifact;
++import org.apache.maven.artifact.factory.ArtifactFactory;
++import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
++import org.apache.maven.artifact.repository.ArtifactRepository;
++import org.apache.maven.artifact.resolver.ArtifactCollector;
++import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
++import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
++import org.apache.maven.plugin.testing.ArtifactStubFactory;
++import org.apache.maven.plugins.enforcer.utils.TestEnforcerRuleUtils;
++import org.apache.maven.project.MavenProject;
++import org.apache.maven.shared.dependency.tree.DependencyNode;
++import org.apache.maven.shared.dependency.tree.DependencyTree;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
++import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
++import org.codehaus.plexus.DefaultPlexusContainer;
++import org.codehaus.plexus.PlexusContainer;
++import org.junit.Before;
++import org.junit.Test;
++
++/*
++ * 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.
++ */
++
++/**
++ * Tests for {@link RequireUpperBoundDeps}.
++ * @author Oleg Nenashev
++ */
++public class TestRequireUpperBoundDeps {
++
++ private MavenProject project;
++
++ private EnforcerRuleHelper helper;
++
++ private ArtifactStubFactory factory;
++
++ private RequireUpperBoundDeps rule;
++ private MockDependencyTreeBuilder dependencyTree;
++
++ Artifact library1_10, library1_20, library2_10;
++
++ @Before
++ public void before() throws Exception
++ {
++ PlexusContainer c = new DefaultPlexusContainer();
++ dependencyTree = new MockDependencyTreeBuilder();
++ factory = new ArtifactStubFactory();
++
++ project = new MockProject();
++ project.setArtifact(factory.createArtifact("my", "project", "1.0"));
++ library1_10 = factory.createArtifact("my", "library1", "1.0");
++ library1_20 = factory.createArtifact("my", "library1", "2.0");
++ library2_10 = factory.createArtifact("my", "library2", "1.0");
++
++ helper = EnforcerTestUtils.getHelper(project, false, c);
++ helper.getContainer().addComponent(dependencyTree, DependencyTreeBuilder.class.getName());
++
++ rule = new RequireUpperBoundDeps();
++ }
++
++ @Test
++ public void testShouldPassForSameDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ @Test
++ public void testShouldFailForNewerDependencies() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ @Test
++ public void testShouldPassForOlderDependencies() throws Exception {
++ dependencyTree.addDependency(library1_20);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_10));
++ dependencyTree.addDependency(n);
++
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-273
++ @Test
++ public void testShouldPassForOlderDependencyIfExcluded() throws Exception {
++ dependencyTree.addDependency(library1_10);
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setExcludes(Arrays.asList("my:library1"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldPassIfTestArtifactsAreIgnored() throws Exception {
++ dependencyTree.addDependency(library1_10);
++
++ library2_10.setScope("test");
++ DependencyNode n = new DependencyNode(library2_10);
++ n.addChild(new DependencyNode(library1_20));
++ dependencyTree.addDependency(n);
++
++ rule.setIgnoreDependencyScopes(Arrays.asList("test"));
++ TestEnforcerRuleUtils.execute(rule, helper, false);
++ }
++
++ // MENFORCER-276
++ @Test
++ public void testShouldFailIfWrongScopeIsIgnored() throws Exception {
++ testShouldPassIfTestArtifactsAreIgnored();
++ rule.setIgnoreDependencyScopes(Arrays.asList("provided"));
++ TestEnforcerRuleUtils.execute(rule, helper, true);
++ }
++
++ // TODO: make it a generic class
++ private static final class MockDependencyTreeBuilder implements DependencyTreeBuilder {
++
++ List<DependencyNode> dependencies = new ArrayList<DependencyNode>();
++
++ public void addDependency(DependencyNode node) {
++ dependencies.add(node);
++ }
++
++ public void addDependency(Artifact artifact) {
++ dependencies.add(new DependencyNode(artifact));
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource, ArtifactFilter filter,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ DependencyNode root = new DependencyNode(project.getArtifact());
++ for (DependencyNode child : dependencies) {
++ root.addChild(child);
++ }
++ return root;
++ }
++
++ @Override
++ public DependencyTree buildDependencyTree(MavenProject project, ArtifactRepository repository,
++ ArtifactFactory factory, ArtifactMetadataSource metadataSource,
++ ArtifactCollector collector) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject project) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ @Override
++ public DependencyNode buildDependencyTree(MavenProject arg0, ArtifactRepository arg1, ArtifactFilter arg2) throws DependencyTreeBuilderException {
++ throw new UnsupportedOperationException("Not supported yet.");
++ }
++
++ }
++}
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/invoker.properties
+new file mode 100644
+index 0000000..c98ac4c
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/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
+\ No newline at end of file
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+new file mode 100644
+index 0000000..307987a
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/pom.xml
+@@ -0,0 +1,63 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276/artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <RequireUpperBoundDeps/>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+new file mode 100644
+index 0000000..38bb648
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_failure/verify.groovy
+@@ -0,0 +1,32 @@
++/*
++ * 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 LS = System.getProperty( "line.separator" )
++File buildLog = new File( basedir, 'build.log' )
++
++assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireUpperBoundDeps failed with message:' )
++def message =
++'Require upper bound dependencies error for org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0 paths to dependency are:'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.4.0'+LS+
++'and'+LS+
++'+-org.apache.maven.plugins.enforcer.its:menforcer128:1.0-SNAPSHOT'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_classic:0.9.9'+LS+
++' +-org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0'+LS
++assert buildLog.text.contains( message )
++
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+new file mode 100644
+index 0000000..6d2c1bb
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/module/pom.xml
+@@ -0,0 +1,30 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <parent>
++ <groupId>test</groupId>
++ <artifactId>TestParent</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ </parent>
++ <artifactId>TestModule</artifactId>
++ <version>1.1-SNAPSHOT</version>
++</project>
+diff --git a/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+new file mode 100644
+index 0000000..dc0aa79
+--- /dev/null
++++ b/maven-enforcer-plugin/src/it/projects/require-upper-bound-test-deps_ignored/pom.xml
+@@ -0,0 +1,67 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++ * 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.
++ *
++-->
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
++ <modelVersion>4.0.0</modelVersion>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer276</artifactId>
++ <version>1.0-SNAPSHOT</version>
++ <packaging>jar</packaging>
++ <dependencies>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_api</artifactId>
++ <version>1.4.0</version>
++ </dependency>
++ <dependency>
++ <groupId>org.apache.maven.plugins.enforcer.its</groupId>
++ <artifactId>menforcer128_classic</artifactId>
++ <version>0.9.9</version>
++ <scope>test</scope>
++ <!-- Depends on org.apache.maven.plugins.enforcer.its:menforcer128_api:1.5.0 -->
++ </dependency>
++ </dependencies>
++ <build>
++ <plugins>
++ <plugin>
++ <groupId>org.apache.maven.plugins</groupId>
++ <artifactId>maven-enforcer-plugin</artifactId>
++ <version>@project.version@</version>
++ <executions>
++ <execution>
++ <id>enforce</id>
++ <configuration>
++ <rules>
++ <requireUpperBoundDeps>
++ <ignoreDependencyScopes>
++ <scope>test</scope>
++ </ignoreDependencyScopes>
++ </requireUpperBoundDeps>
++ </rules>
++ </configuration>
++ <goals>
++ <goal>enforce</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
++ </plugins>
++ </build>
++</project>
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124340-archiver=mbox-vm.apache.org@maven.apache.org Thu Oct 26 07:41:44 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id DA3412A4
+ for <ar...@mbox-vm.apache.org>; Thu, 26 Oct 2017 07:41:43 +0000 (UTC)
+Received: (qmail 26537 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 26524 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #4: Update to ASM5 opscode.
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #4: Update to ASM5 opscode.
+URL: https://github.com/apache/maven-plugin-tools/pull/4
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+index 2993553d..e241987e 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoAnnotationVisitor.java
+@@ -41,7 +41,7 @@
+
+ MojoAnnotationVisitor( Logger logger, String annotationClassName )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.annotationClassName = annotationClassName;
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+index f2333d4b..cbedfecd 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoClassVisitor.java
+@@ -53,7 +53,7 @@
+
+ public MojoClassVisitor( Logger logger )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ }
+
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+index 4a61a01e..783cbcbf 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/annotations/scanner/visitors/MojoFieldVisitor.java
+@@ -44,7 +44,7 @@
+
+ MojoFieldVisitor( Logger logger, String fieldName, String className )
+ {
+- super( Opcodes.ASM4 );
++ super( Opcodes.ASM5 );
+ this.logger = logger;
+ this.fieldName = fieldName;
+ this.className = className;
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124342-archiver=mbox-vm.apache.org@maven.apache.org Thu Oct 26 07:41:45 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id CE49D2A5
+ for <ar...@mbox-vm.apache.org>; Thu, 26 Oct 2017 07:41:44 +0000 (UTC)
+Received: (qmail 27357 invoked by uid 500); 26 Oct 2017 07:41:43 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 27288 invoked by uid 99); 26 Oct 2017 07:41:43 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Oct 2017 07:41:43 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+Message-ID: <15...@gitbox.apache.org>
+
+asfgit closed pull request #6: For Groovy/Scala Mojos: Allow Mojo documentation in annotations, too.
+URL: https://github.com/apache/maven-plugin-tools/pull/6
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+index e442310f..5a5d8d8c 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Mojo.java
+@@ -117,4 +117,44 @@
+ * @return is thread safe
+ */
+ boolean threadSafe() default false;
++
++ /**
++ * Description for this Mojo. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this Mojo was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this Mojo is deprecated.
++ *
++ * <p>If this is given, then the Mojo should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Mojo(..., deprecated = "this Mojo is no longer used")
++public class ExampleMojo extends AbstractMojo { ... }</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+index ec9dbcf6..f364e945 100644
+--- a/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
++++ b/maven-plugin-annotations/src/main/java/org/apache/maven/plugins/annotations/Parameter.java
+@@ -85,4 +85,44 @@
+ * @return <code>true</code> if the user should not be allowed to configure the parameter directly
+ */
+ boolean readonly() default false;
++
++ /**
++ * Description for this parameter. Has the same format as a Javadoc comment body (that is, HTML with Javadoc inline
++ * tags).
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String description() default "";
++
++ /**
++ * The first version of the plugin when this parameter was added.
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String since() default "";
++
++ /**
++ * The reason why this parameter is deprecated.
++ *
++ * <p>If this is given, then the parameter should also be annotated with {@code @}{@link Deprecated}, like so:</p>
++ *
++ * <pre><code>@Deprecated
++@Parameter(..., deprecated = "this parameter is no longer used")
++private String oldParameterThatNowDoesNothing;</code></pre>
++ *
++ * <p>Ordinarily, this information is taken from Javadoc comments. This annotation is used when documenting a Maven
++ * plugin that is written in a language other than Java, but which supports Java annotations, such as Groovy or
++ * Scala.</p>
++ *
++ * @since 3.5
++ */
++ String deprecated() default "";
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+index 33104cb8..663435ff 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/MojoAnnotationContent.java
+@@ -207,6 +207,36 @@ public void name( String name )
+ this.name = name;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ @Override
+ public String toString()
+ {
+@@ -226,6 +256,9 @@ public String toString()
+ sb.append( ", inheritByDefault=" ).append( inheritByDefault );
+ sb.append( ", configurator='" ).append( configurator ).append( '\'' );
+ sb.append( ", threadSafe=" ).append( threadSafe );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+diff --git a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+index 919aaa4b..ca8a49fc 100644
+--- a/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
++++ b/maven-plugin-tools-annotations/src/main/java/org/apache/maven/tools/plugin/extractor/annotations/datamodel/ParameterAnnotationContent.java
+@@ -63,6 +63,16 @@ public ParameterAnnotationContent( String fieldName, String alias, String proper
+ this.readonly = readonly;
+ }
+
++ public ParameterAnnotationContent( String fieldName, String alias, String property, String defaultValue,
++ boolean required, boolean readonly, String className,
++ String deprecated, String description, String since )
++ {
++ this( fieldName, alias, property, defaultValue, required, readonly, className );
++ deprecated( deprecated );
++ description( description );
++ since( since );
++ }
++
+ public String name()
+ {
+ return name;
+@@ -123,6 +133,36 @@ public void readonly( boolean readonly )
+ this.readonly = readonly;
+ }
+
++ public String deprecated()
++ {
++ return getDeprecated();
++ }
++
++ public void deprecated( String deprecated )
++ {
++ setDeprecated( deprecated );
++ }
++
++ public String description()
++ {
++ return getDescription();
++ }
++
++ public void description( String description )
++ {
++ setDescription( description );
++ }
++
++ public String since()
++ {
++ return getSince();
++ }
++
++ public void since( String since )
++ {
++ setSince( since );
++ }
++
+ public Class<? extends Annotation> annotationType()
+ {
+ return null;
+@@ -150,6 +190,9 @@ public String toString()
+ sb.append( ", defaultValue='" ).append( defaultValue ).append( '\'' );
+ sb.append( ", required=" ).append( required );
+ sb.append( ", readonly=" ).append( readonly );
++ sb.append( ", deprecated='" ).append( deprecated() ).append( '\'' );
++ sb.append( ", description='" ).append( description() ).append( '\'' );
++ sb.append( ", since='" ).append( since() ).append( '\'' );
+ sb.append( '}' );
+ return sb.toString();
+ }
+@@ -194,6 +237,18 @@ public boolean equals( Object o )
+ {
+ return false;
+ }
++ if ( deprecated() != null ? !deprecated().equals( that.deprecated() ) : that.deprecated() != null )
++ {
++ return false;
++ }
++ if ( description() != null ? !description().equals( that.description() ) : that.description() != null )
++ {
++ return false;
++ }
++ if ( since() != null ? !since().equals( that.since() ) : that.since() != null )
++ {
++ return false;
++ }
+
+ return true;
+ }
+@@ -207,6 +262,9 @@ public int hashCode()
+ result = 31 * result + ( defaultValue != null ? defaultValue.hashCode() : 0 );
+ result = 31 * result + ( required ? 1 : 0 );
+ result = 31 * result + ( readonly ? 1 : 0 );
++ result = 31 * result + ( deprecated() != null ? deprecated().hashCode() : 0 );
++ result = 31 * result + ( description() != null ? description().hashCode() : 0 );
++ result = 31 * result + ( since() != null ? since().hashCode() : 0 );
+ return result;
+ }
+ }
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+index 673f8b1a..ee8527b2 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/FooMojo.java
+@@ -33,7 +33,7 @@
+ /**
+ * @author Olivier Lamy
+ */
+-@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true )
++@Mojo( name = "foo", defaultPhase = LifecyclePhase.COMPILE, threadSafe = true, description = "This is a description.", since = "3.5", deprecated = "because I said so" )
+ @Execute( goal = "compiler", lifecycle = "my-lifecycle", phase = LifecyclePhase.PACKAGE )
+ public class FooMojo
+ extends AbstractMojo
+@@ -52,6 +52,10 @@
+ @Parameter( property = "thebeer", defaultValue = "coolbeer" )
+ protected String beer;
+
++ @Parameter( description = "wine for french folks", since = "forever ago", deprecated = "beer is better" )
++ @Deprecated
++ protected String wine;
++
+ /**
+ * Plexus compiler manager.
+ */
+diff --git a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+index 17a24bfd..12359bee 100644
+--- a/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
++++ b/maven-plugin-tools-annotations/src/test/java/org/apache/maven/tools/plugin/extractor/annotations/TestAnnotationsReader.java
+@@ -71,6 +71,9 @@ public void testReadMojoClass()
+ assertEquals( true, mojo.threadSafe() );
+ assertEquals( false, mojo.aggregator() );
+ assertEquals( LifecyclePhase.COMPILE, mojo.defaultPhase() );
++ assertEquals( "This is a description.", mojo.description() );
++ assertEquals( "3.5", mojo.since() );
++ assertEquals( "because I said so", mojo.deprecated() );
+
+ Execute execute = mojoAnnotatedClass.getExecute();
+
+@@ -82,9 +85,12 @@ public void testReadMojoClass()
+ Assertions.assertThat( components ).isNotNull().isNotEmpty().hasSize( 2 );
+
+ Collection<ParameterAnnotationContent> parameters = mojoAnnotatedClass.getParameters().values();
+- Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 2 ).contains(
++ Assertions.assertThat( parameters ).isNotNull().isNotEmpty().hasSize( 3 ).contains(
+ new ParameterAnnotationContent( "bar", null, "thebar", "coolbar", true, false, String.class.getName() ),
+ new ParameterAnnotationContent( "beer", null, "thebeer", "coolbeer", false, false,
+- String.class.getName() ) );
++ String.class.getName() ),
++ new ParameterAnnotationContent( "wine", null, null, null, false, false,
++ String.class.getName(), "beer is better", "wine for french folks",
++ "forever ago" ) );
+ }
+ }
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124353-archiver=mbox-vm.apache.org@maven.apache.org Fri Oct 27 02:33:39 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id D7F112A4
+ for <ar...@mbox-vm.apache.org>; Fri, 27 Oct 2017 02:33:38 +0000 (UTC)
+Received: (qmail 37730 invoked by uid 500); 27 Oct 2017 02:33:38 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 37719 invoked by uid 99); 27 Oct 2017 02:33:38 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 27 Oct 2017 02:33:38 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+Message-ID: <15...@gitbox.apache.org>
+
+olamy commented on issue #19: Fix for MRELEASE-835: Automatically resolve snapshot dependencies in release:prepare
+URL: https://github.com/apache/maven-release/pull/19#issuecomment-339855892
+
+
+ @theit I'm happy with this changes. Except the lack of test. Is there anything you can do? A plugin IT test?
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124404-archiver=mbox-vm.apache.org@maven.apache.org Sat Nov 4 14:33:08 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id 103FF2A3
+ for <ar...@mbox-vm.apache.org>; Sat, 4 Nov 2017 14:33:07 +0000 (UTC)
+Received: (qmail 82314 invoked by uid 500); 4 Nov 2017 14:33:07 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 82303 invoked by uid 99); 4 Nov 2017 14:33:07 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:33:07 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+
+hboutemy commented on issue #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27#issuecomment-341901250
+
+
+ sorry, this was automatically closed when migrating to Git and deleting old trunk branch
+ reopening
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124407-archiver=mbox-vm.apache.org@maven.apache.org Sat Nov 4 14:41:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id 1906D665
+ for <ar...@mbox-vm.apache.org>; Sat, 4 Nov 2017 14:41:35 +0000 (UTC)
+Received: (qmail 92040 invoked by uid 500); 4 Nov 2017 14:41:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 91799 invoked by uid 99); 4 Nov 2017 14:41:34 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Nov 2017 14:41:34 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+Message-ID: <15...@gitbox.apache.org>
+
+hboutemy closed pull request #27: Fixed wrong page title for Dependency Convergence
+URL: https://github.com/apache/maven-enforcer/pull/27
+
+
+
+
+This is a PR merged from a forked repository.
+As GitHub hides the original diff on merge, it is displayed below for
+the sake of provenance:
+
+As this is a foreign pull request (from a fork), the diff is supplied
+below (as it won't show otherwise due to GitHub magic):
+
+diff --git a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+index 890814a..bc7dcf9 100644
+--- a/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
++++ b/enforcer-rules/src/site/apt/dependencyConvergence.apt.vm
+@@ -16,7 +16,7 @@
+ ~~ under the License.
+
+ -----
+- Comparing against a specific artifact
++ Dependency Convergence
+ -----
+ -----
+ 2008-09-13
+
+
+
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
+From dev-return-124501-archiver=mbox-vm.apache.org@maven.apache.org Fri Nov 17 08:40:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id 1B6E6664
+ for <ar...@mbox-vm.apache.org>; Fri, 17 Nov 2017 08:40:36 +0000 (UTC)
+Received: (qmail 13228 invoked by uid 500); 17 Nov 2017 08:40:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 13217 invoked by uid 99); 17 Nov 2017 08:40:35 -0000
+Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 17 Nov 2017 08:40:35 +0000
+Received: from localhost (localhost [127.0.0.1])
+ by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 0478C18088F
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:33 +0000 (UTC)
+X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org
+X-Spam-Flag: NO
+X-Spam-Score: -1
+X-Spam-Level:
+X-Spam-Status: No, score=-1 tagged_above=-999 required=6.31
+ tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1,
+ RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-2.8] autolearn=disabled
+Received: from mx1-lw-us.apache.org ([10.40.0.8])
+ by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024)
+ with ESMTP id QNrCLGJBrxBw for <de...@maven.apache.org>;
+ Fri, 17 Nov 2017 08:40:31 +0000 (UTC)
+Received: from smtp.smtpout.orange.fr (smtp03.smtpout.orange.fr [80.12.242.125])
+ by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTPS id 796F95F569
+ for <de...@maven.apache.org>; Fri, 17 Nov 2017 08:40:29 +0000 (UTC)
+Received: from giga.localnet ([86.238.16.93])
+ by mwinf5d50 with ME
+ id awgN1w00K20Ufdy03wgNhg; Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-Helo: giga.localnet
+X-ME-Date: Fri, 17 Nov 2017 09:40:22 +0100
+X-ME-IP: 86.238.16.93
+From: =?ISO-8859-1?Q?Herv=E9?= BOUTEMY <he...@free.fr>
+To: Maven Developers List <de...@maven.apache.org>
+Subject: Re: Maven resolver branch consolidation
+Date: Fri, 17 Nov 2017 09:40:22 +0100
+Message-ID: <25...@giga>
+In-Reply-To: <20...@dd17332.kasserver.com>
+References: <20...@dd17332.kasserver.com> <16...@giga> <20...@dd17332.kasserver.com>
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="nextPart23989684.4Xbeelhfra"
+Content-Transfer-Encoding: 7Bit
+
+--nextPart23989684.4Xbeelhfra
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain; charset="iso-8859-1"
+
+on the second option, I was ready to just answer "not possible", but decide=
+d I=20
+could try at high level before answering...
+
+I took Maven core dependency tree [1], picked green color as the definition=
+ of=20
+Maven Artifact Resolver, put maven-resolver-provider in green + settings=20
+builder (since used by resolver ant tasks: that's a detail I didn't put in=
+=20
+latest resolver dependency tree)
+Then I extended green to every transitive dependency to have an independent=
+=20
+releasable reactor
+
+You'll find as a result the attached image.
+
+Analysis:
+=2D this splits Maven core in 2 parts: lower part on dependency resolution,=
+=20
+higher part on build
+=2D settings.xml and pom.xml are in dependency resolution
+
+Reaction: it could be for Maven 5 or 6, when consumer pom is strictly separ=
+ate=20
+from build pom...
+
+Regards,
+
+Herv=E9
+
+[1] http://maven.apache.org/ref/3.5.2/
+
+Le jeudi 16 novembre 2017, 18:13:15 CET Manfred Moser a =E9crit :
+> Thanks for the explanation and details Herve. Seems to be that to do this
+> cleanly we have to break the circle. From my limited knowledge there are
+> two ways to do that.
+>=20
+> 1. As stephen suggested.. get the resolver into maven core tree. That mak=
+es
+> core bigger again and ties the two projects into one release cycle.
+> Feasible but I am not a fan.
+>=20
+> 2. I am not sure if possible but .. could we get the maven resolver provi=
+der
+> out of maven core and into the resolver project and have it all together =
+in
+> there?
+>=20
+> In either case .. both of those seem rather large tasks so I will definit=
+ely
+> go ahead with demo branch merge first. I just have to redo the work I did
+> without the ant tasks in the tree. Stay tuned on that..
+>=20
+> Manfred
+>=20
+> Herv=E9 BOUTEMY wrote on 2017-11-16 05:49:
+> > feasible, but I really don't like it: separation is good.
+> >=20
+> > seriously, just merge demos and let ant-tasks separate, and we have a
+> > pretty good compromise on every aspect
+> > (or even drop ant tasks if really this is causing us too much headache.=
+=2E.)
+> >=20
+> > Regards,
+> >=20
+> > Herv=E9
+> >=20
+> > Le jeudi 16 novembre 2017, 10:03:07 CET Stephen Connolly a =E9crit :
+> >> On Thu 16 Nov 2017 at 07:51, Herv=E9 BOUTEMY <he...@free.fr> w=
+rote:
+> >> > I just pushed an update of dependencies image that shows the external
+> >> > maven-
+> >> > resolver-provider (in yellow) inside the reactor dependency graph (in
+> >> > blue)
+> >> >=20
+> >> > That shows the chicken and egg issue on releasing we'll have on API
+> >> > breaking
+> >> > change. People always building from source (like Debian) will have t=
+he
+> >> > issue
+> >> > also.
+> >> >=20
+> >> > For demos, which are not really published during the release (just as
+> >> > documentation), disabling the module in the build when necessary is
+> >> > sufficient,
+> >> > won't change many things. For ant tasks, disabling the module will n=
+ot
+> >> > publish
+> >> > the artifact: this will have a visible impact.
+> >>=20
+> >> Should we just bite the bullet and bring resolver in-tree as modules in
+> >> maven core... leaving demos and ant tasks here?
+> >>=20
+> >> > Regards,
+> >> >=20
+> >> > Herv=E9
+> >> >=20
+> >> > Le mercredi 15 novembre 2017, 23:05:14 CET Herv=E9 BOUTEMY a =E9crit=
+ :
+> >> > > it seems I have not been clear: I'll try to explain better
+> >> > >=20
+> >> > > 1. maven-resolver-ant-tasks depends on maven-resolver-provider (fr=
+om
+> >> >=20
+> >> > Maven
+> >> >=20
+> >> > > core)
+> >> > > 2. maven-resolver-provider (then Maven core) depends on
+> >> > > maven-resolver
+> >> > >=20
+> >> > > if we put maven-resolver-ant-tasks in the same reactor than
+> >> >=20
+> >> > maven-resolver,
+> >> >=20
+> >> > > we can't release any maven-resolver API change that breaks
+> >> >=20
+> >> > maven-resolver-
+> >> >=20
+> >> > > provider
+> >> > >=20
+> >> > > example: if we move maven-resolver code to org.apache.maven java
+> >> > > package
+> >> >=20
+> >> > in
+> >> >=20
+> >> > > maven-resolver 2.0.0-SNAPSHOT, we need maven-resolver-provider
+> >> > > 4.0.0-SNAPSHOT that uses maven-resolver 2.0.0-SNAPSHOT with this n=
+ew
+> >> > > java
+> >> > > package. Then try to release anything: you can't, unless you don't
+> >> > > try
+> >> > > to
+> >> > > release maven- resolver-ant-tasks
+> >> > >=20
+> >> > > (the consequence on version consistency is another way to describe
+> >> > > the
+> >> > > issue, but that is more subtle, then I chose to describe the most
+> >> > > visible
+> >> > > issue, with API breaking change)
+> >> > >=20
+> >> > > IMHO, another consequence could be: maven-resolver-ant-tasks would
+> >> >=20
+> >> > perhaps
+> >> >=20
+> >> > > better be versionned like maven-resolver-provider
+> >> > >=20
+> >> > >=20
+> >> > > Merging resolver-demos is really the great big idea: with that mer=
+ge,
+> >> > > modifying maven-rresolver can immediately be tested with demos:
+> >> > > that'll
+> >> >=20
+> >> > be
+> >> >=20
+> >> > > so much easier to make changes to maven-resolver code!
+> >> > >=20
+> >> > > Regards,
+> >> > >=20
+> >> > > Herv=E9
+> >> > >=20
+> >> > > Le mercredi 15 novembre 2017, 09:02:12 CET Michael Osipov a =E9cri=
+t :
+> >> > > > Why -1 on the Ant tasks?
+> >> > > >=20
+> >> > > > Am 2017-11-15 um 00:50 schrieb Herv=E9 BOUTEMY:
+> >> > > > > I answered on the mailing list and on the 2 Jira issues
+> >> > > > > In summary, +1 to merge demos, -1 to merge ant-tasks
+> >> > > > >=20
+> >> > > > > Regards,
+> >> > > > >=20
+> >> > > > > Herv=E9
+> >> > > > >=20
+> >> > > > > Le mardi 14 novembre 2017, 18:19:40 CET Manfred Moser a =E9cri=
+t :
+> >> > > > >> Any feedback or should I just go ahead with the cleanup?
+> >> > > > >>=20
+> >> > > > >> Manfred
+> >> > > > >>=20
+> >> > > > >> Manfred Moser wrote on 2017-11-08 21:35:
+> >> > > > >>> Hi all,
+> >> > > > >>>=20
+> >> > > > >>> I have started and made good progress on getting Maven resol=
+ver
+> >> > > > >>> all
+> >> > > > >>> into
+> >> > > > >>> the master branch instead of having master, demos and ant-ta=
+sks
+> >> > > > >>> in
+> >> > > > >>> separate branches.
+> >> > > > >>>=20
+> >> > > > >>> Details are tracked in
+> >> > > > >>> https://issues.apache.org/jira/browse/MRESOLVER-28
+> >> > > > >>>=20
+> >> > > > >>> All of it is now in a new branch called master-all for you to
+> >> > > > >>> see.
+> >> > > > >>>=20
+> >> > > > >>> I am now wondering what the next steps are. I added what I
+> >> > > > >>> think
+> >> > > > >>> should
+> >> > > > >>> happen next in the issue in a comment and would appreciate a=
+ny
+> >> >=20
+> >> > input
+> >> >=20
+> >> > > > >>> on
+> >> > > > >>> the current setup and next steps.
+> >> > > > >>>=20
+> >> > > > >>> Any help would be appreciated.
+> >> > > > >>>=20
+> >> > > > >>> manfred
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> >=20
+> >> > > > >> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > >> For additional commands, e-mail: dev-help@maven.apache.org
+> >> > > > >=20
+> >> > > > > --------------------------------------------------------------=
+=2D--
+> >> > > > > ---
+> >> > > > > -
+> >> > > > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> > >=20
+> >> > > ------------------------------------------------------------------=
+=2D--
+> >> > > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > ---------------------------------------------------------------------
+> >> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> >> > For additional commands, e-mail: dev-help@maven.apache.org
+> >> >=20
+> >> > --
+> >>=20
+> >> Sent from my phone
+> >=20
+> > ---------------------------------------------------------------------
+> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> > For additional commands, e-mail: dev-help@maven.apache.org
+>=20
+> ---------------------------------------------------------------------
+> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+> For additional commands, e-mail: dev-help@maven.apache.org
+
+
+
+--nextPart23989684.4Xbeelhfra
+Content-Type: text/plain; charset=us-ascii
+
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+--nextPart23989684.4Xbeelhfra--
+
+
+From dev-return-124732-archiver=mbox-vm.apache.org@maven.apache.org Mon Dec 4 11:39:36 2017
+Return-Path: <de...@maven.apache.org>
+X-Original-To: archiver@mbox-vm.apache.org
+Delivered-To: archiver@mbox-vm.apache.org
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+ by mbox-vm.apache.org (ASF Mail Server at mbox-vm.apache.org) with SMTP id EFBD61F5
+ for <ar...@mbox-vm.apache.org>; Mon, 4 Dec 2017 11:39:35 +0000 (UTC)
+Received: (qmail 14334 invoked by uid 500); 4 Dec 2017 11:39:35 -0000
+Mailing-List: contact dev-help@maven.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <ma...@maven.apache.org>
+List-Help: <ma...@maven.apache.org>
+List-Post: <ma...@maven.apache.org>
+List-Id: "Maven Developers List" <dev.maven.apache.org>
+Reply-To: "Maven Developers List" <de...@maven.apache.org>
+Delivered-To: mailing list dev@maven.apache.org
+Received: (qmail 14323 invoked by uid 99); 4 Dec 2017 11:39:35 -0000
+Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70)
+ by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 04 Dec 2017 11:39:35 +0000
+From: GitBox <gi...@apache.org>
+To: dev@maven.apache.org
+Subject: [GitHub] slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+Message-ID: <15...@gitbox.apache.org>
+
+slachiewicz commented on issue #6: [DOXIA-566] Upgrade dependences and plugin versions
+URL: https://github.com/apache/maven-doxia/pull/6#issuecomment-348937905
+
+
+ ok, plugin updates removed
+
+----------------------------------------------------------------
+This is an automated message from the Apache Git Service.
+To respond to the message, please log on GitHub and use the
+URL above to go to the specific comment.
+
+For queries about this service, please contact Infrastructure at:
+users@infra.apache.org
+
+
+With regards,
+Apache Git Services
+
+---------------------------------------------------------------------
+To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
+For additional commands, e-mail: dev-help@maven.apache.org
+
+
diff --git a/yaml/gens-maven_duplicates_2017.yaml b/yaml/gens-maven_duplicates_2017.yaml
new file mode 100644
index 0000000..76be76f
--- /dev/null
+++ b/yaml/gens-maven_duplicates_2017.yaml
@@ -0,0 +1,98 @@
+generators:
+ corpus/maven_duplicates_2017_mboxvm.mbox:
+ corpus/maven_duplicates_2017_mailarchivesao.mbox:
+ corpus/maven_duplicates_2017_listsao_1.mbox:
+ corpus/maven_duplicates_2017_listsao_2.mbox:
+ cluster:
+ - index: 0
+ message-id: <15...@gitbox.apache.org>
+ generated: r6b926a05fe41e4945b8ea111b7972da24d43fec3f2585c253de05852@<dev.maven.apache.org>
+ - index: 1
+ message-id: <15...@gitbox.apache.org>
+ generated: rb86ca3173cff6cfa8e822d6cece928adccab96a7100daa1d9785e63c@<dev.maven.apache.org>
+ - index: 2
+ message-id: <15...@gitbox.apache.org>
+ generated: r806fee0f67e68802a0aa7985bfc5c3f4b861dcc63476b85119449208@<dev.maven.apache.org>
+ - index: 3
+ message-id: <15...@gitbox.apache.org>
+ generated: r3024faffa184172cd13673ef50d24da7939c8ec70b8e73e919f4d7da@<dev.maven.apache.org>
+ - index: 4
+ message-id: <15...@gitbox.apache.org>
+ generated: r54d251d198a68c95a685a00e54b96d15ee51d08b97419cd5bbbed71c@<dev.maven.apache.org>
+ - index: 5
+ message-id: <15...@gitbox.apache.org>
+ generated: r6b5a61dd092797b6942054879914f579630f036a9873e94ee3492b26@<dev.maven.apache.org>
+ - index: 6
+ message-id: <15...@gitbox.apache.org>
+ generated: r6d9bcb35c7bcf13efa3a5c66d97964e11c31a1f2601fbd9f0037102a@<dev.maven.apache.org>
+ - index: 7
+ message-id: <15...@gitbox.apache.org>
+ generated: r61223196fbf0682a40fa7c1cc937156a404acca58bb335e5d7d0d40f@<dev.maven.apache.org>
+ - index: 8
+ message-id: <25...@giga>
+ generated: ra11f879fc3cd71aaf44543fa7d0a7ca25f6609b2f8f8fb075b2b19ff@<dev.maven.apache.org>
+ - index: 9
+ message-id: <15...@gitbox.apache.org>
+ generated: ra204ba60c1acc0a7a5fe4d87265f141b6dab823dad2eed3c75a66170@<dev.maven.apache.org>
+ medium:
+ - index: 0
+ message-id: <15...@gitbox.apache.org>
+ generated: 37e1ac9eacdbc1f8ac445665be687d4aa434d533b372f9d6f017c0e0@<dev.maven.apache.org>
+ - index: 1
+ message-id: <15...@gitbox.apache.org>
+ generated: a46b94e671bb3160db744941de41e39fcaeeae19a1e11fce63bb16c0@<dev.maven.apache.org>
+ - index: 2
+ message-id: <15...@gitbox.apache.org>
+ generated: f0caabc4d906e93e79b4b71d640ccb611e9eb30ac41e5571c751c1c9@<dev.maven.apache.org>
+ - index: 3
+ message-id: <15...@gitbox.apache.org>
+ generated: 6a30a67d75e7beb405d48f4a8da5ff5d0ce94733f9f8c905a0fa1a06@<dev.maven.apache.org>
+ - index: 4
+ message-id: <15...@gitbox.apache.org>
+ generated: 5baea34629b362bf827382e7cf2339d4aa6e692b64f86d47b6fc60ed@<dev.maven.apache.org>
+ - index: 5
+ message-id: <15...@gitbox.apache.org>
+ generated: b3b6942c10bf382c6112b01f26ee793af6deca0ce3c86c75a4a4cd8f@<dev.maven.apache.org>
+ - index: 6
+ message-id: <15...@gitbox.apache.org>
+ generated: 537115d45c99e7e8e724236b5d5b3638465bbaafd4b813351fdec122@<dev.maven.apache.org>
+ - index: 7
+ message-id: <15...@gitbox.apache.org>
+ generated: d0bd0d9cd5698eea59dd9349fd5ba32386a7e22db65f190458f9800b@<dev.maven.apache.org>
+ - index: 8
+ message-id: <25...@giga>
+ generated: 0d353ab32b0450743c2a19990c89be333ce55e0d449755984d51634b@<dev.maven.apache.org>
+ - index: 9
+ message-id: <15...@gitbox.apache.org>
+ generated: cdf59fdea0b7b4d61aa7c0c4159bc48a853c3b3a48d17b2e662cae29@<dev.maven.apache.org>
+ dkim:
+ - index: 0
+ message-id: <15...@gitbox.apache.org>
+ generated: 6522437pd2nq3mg6
+ - index: 1
+ message-id: <15...@gitbox.apache.org>
+ generated: y6qdt3x5rxybpl78
+ - index: 2
+ message-id: <15...@gitbox.apache.org>
+ generated: 6hfr0544373h9cn7
+ - index: 3
+ message-id: <15...@gitbox.apache.org>
+ generated: p0mkn1pqddnxcfqq
+ - index: 4
+ message-id: <15...@gitbox.apache.org>
+ generated: 69bvsoyb47gtdgof
+ - index: 5
+ message-id: <15...@gitbox.apache.org>
+ generated: xrwgnhvl1hqstmwt
+ - index: 6
+ message-id: <15...@gitbox.apache.org>
+ generated: hqkcgrbpcmwp1m49
+ - index: 7
+ message-id: <15...@gitbox.apache.org>
+ generated: 1vgmpvp0b3d72blk
+ - index: 8
+ message-id: <25...@giga>
+ generated: 7njfxq79slq6gl9x
+ - index: 9
+ message-id: <15...@gitbox.apache.org>
+ generated: 8j9gh1brs127y93h
diff --git a/yaml/pars-maven_duplicates_2017.yaml b/yaml/pars-maven_duplicates_2017.yaml
new file mode 100644
index 0000000..bb1a018
--- /dev/null
+++ b/yaml/pars-maven_duplicates_2017.yaml
@@ -0,0 +1,47 @@
+args:
+ parse_html: false
+parsing:
+ corpus/maven_duplicates_2017_mboxvm.mbox:
+ corpus/maven_duplicates_2017_mailarchivesao.mbox:
+ corpus/maven_duplicates_2017_listsao_1.mbox:
+ corpus/maven_duplicates_2017_listsao_2.mbox:
+ - index: 0
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: 35ab1447f47949c944253a2f58fdae1aeb40963e70042114cbfbafd248de8b5c
+ attachments: []
+ - index: 1
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: 980b08eb0dbf2abcbfcfb0e71a7f63728f97fe97826abc3039bd98355f27b6b6
+ attachments: []
+ - index: 2
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: 7b47b467b85ae04a7bfcfc385c831dd9b16280d1b45dba7b60095f2590f9eae2
+ attachments: []
+ - index: 3
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: e229a172c716f5bc283eaa48ac22c16f16ffe2ede0240368f7f43239b707ec4f
+ attachments: []
+ - index: 4
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: 7a326786c7284cbf9641bc04d93748870c3341ff1d821272f957d0ede89862ec
+ attachments: []
+ - index: 5
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: d31432c06b605f8f76d4cfc70a6a68a42f1301a5aba32b13c3a7bcbc34b72fb2
+ attachments: []
+ - index: 6
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: 356e84053af0a5d2a7622c87745ea0cae5511c63bb802d3f1e77923c7155cdd1
+ attachments: []
+ - index: 7
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: 86feb9dd02fea5337da1be2bb7611babc806e7933d2c128d9cc44ab375ee502f
+ attachments: []
+ - index: 8
+ message-id: <25...@giga>
+ body_sha3_256: 58b63e42fd350b09d927a26977607e31c35bb3616b110d25eba678f1143ef123
+ attachments: []
+ - index: 9
+ message-id: <15...@gitbox.apache.org>
+ body_sha3_256: 9c942f0cf01914029d8348cd3015bf38e50017d5846c089befbda9c7534558f7
+ attachments: []