You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2020/01/08 21:33:30 UTC

[maven-release] branch master updated: [MRELEASE-835] Automatically resolve snapshot dependencies in release:prepare

This is an automated email from the ASF dual-hosted git repository.

rfscholte pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-release.git


The following commit(s) were added to refs/heads/master by this push:
     new ec43b59  [MRELEASE-835] Automatically resolve snapshot dependencies in release:prepare
ec43b59 is described below

commit ec43b594ff00003c280b90954862dcf32ccaa4fe
Author: Thorsten Heit <th...@gmx.de>
AuthorDate: Wed Jan 8 21:33:19 2020 +0000

    [MRELEASE-835] Automatically resolve snapshot dependencies in release:prepare
---
 .../shared/release/config/ReleaseDescriptor.java   |  17 ++++
 .../config/PropertiesReleaseDescriptorStore.java   |   5 +
 .../release/config/ReleaseDescriptorBuilder.java   |   6 ++
 .../maven/shared/release/config/ReleaseUtils.java  |   5 +
 .../phase/CheckDependencySnapshotsPhase.java       | 103 +++++++++++++++++----
 .../src/main/mdo/release-descriptor.mdo            |  24 ++++-
 .../src/it/projects/prepare/MRELEASE-835/pom.xml   |  71 ++++++++++++++
 .../it/projects/prepare/MRELEASE-835/verify.groovy |  28 ++++++
 .../maven/plugins/release/PrepareReleaseMojo.java  |  22 +++++
 9 files changed, 264 insertions(+), 17 deletions(-)

diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java
index a6d03c2..8044004 100644
--- a/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java
+++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java
@@ -464,4 +464,21 @@ public interface ReleaseDescriptor
     void setScmRelativePathProjectDirectory( String scmRelativePathProjectDirectory );
 
     void setScmSourceUrl( String scmUrl );
+
+    /**
+     * Returns whether unresolved SNAPSHOT dependencies should automatically be resolved.
+     * If this is set, then this specifies the default answer to be used when unresolved SNAPSHOT
+     * dependencies should automatically be resolved ( 0:All 1:Project Dependencies 2:Plugins
+     * 3:Reports 4:Extensions ). Possible values are:
+     * <ul>
+     * <li>"all" or "0": resolve all kinds of snapshots, ie. project, plugin, report and extension dependencies </li>
+     * <li>"dependencies" or "1": resolve project dependencies</li>
+     * <li>"plugins" or "2": resolve plugin dependencis</li>
+     * <li>"reports" or "3": resolve report dependencies</li>
+     * <li>"extensions" or "4": resolve extension dependencies</li>
+     * </ul>
+     * 
+     * @return String
+     */
+    String getAutoResolveSnapshots();
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
index 262b21d..f1272de 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
@@ -256,6 +256,11 @@ public class PropertiesReleaseDescriptorStore
             properties.setProperty( "workItem", config.getWorkItem() );
         }
 
+        if ( config.getAutoResolveSnapshots() != null )
+        {
+            properties.setProperty( "autoResolveSnapshots", config.getAutoResolveSnapshots() );
+        }
+
         // others boolean properties are not written to the properties file because the value from the caller is always
         // used
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
index 745dc4d..629a897 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java
@@ -440,6 +440,12 @@ public class ReleaseDescriptorBuilder
         return this;
     }
 
+    public ReleaseDescriptorBuilder setAutoResolveSnapshots( String autoResolveSnapshots )
+    {
+        releaseDescriptor.setAutoResolveSnapshots( autoResolveSnapshots );
+        return this;
+    }
+
     BuilderReleaseDescriptor build()
     {
         return releaseDescriptor;
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
index bc48cc5..bcaf758 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
@@ -170,6 +170,11 @@ public class ReleaseUtils
         {
             builder.setWorkItem( properties.getProperty( "workItem" ) );
         }
+        if ( properties.containsKey( "autoResolveSnapshots" ) )
+        {
+            String resolve = properties.getProperty( "autoResolveSnapshots" );
+            builder.setAutoResolveSnapshots( resolve );
+        }
 
         loadResolvedDependencies( properties, builder );
 
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
index b19b446..55821c0 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
@@ -144,7 +144,7 @@ public class CheckDependencySnapshotsPhase
         if ( !usedSnapshotDependencies.isEmpty() || !usedSnapshotReports.isEmpty()
                         || !usedSnapshotExtensions.isEmpty() || !usedSnapshotPlugins.isEmpty() )
         {
-            if ( releaseDescriptor.isInteractive() )
+            if ( releaseDescriptor.isInteractive() || null != releaseDescriptor.getAutoResolveSnapshots() )
             {
                 resolveSnapshots( usedSnapshotDependencies, usedSnapshotReports, usedSnapshotExtensions,
                                   usedSnapshotPlugins, releaseDescriptor );
@@ -365,10 +365,19 @@ public class CheckDependencySnapshotsPhase
     {
         try
         {
+            String autoResolveSnapshots = releaseDescriptor.getAutoResolveSnapshots();
             if ( resolveSnapshot == null )
             {
                 prompter.showMessage( RESOLVE_SNAPSHOT_MESSAGE );
-                resolveSnapshot = prompter.prompt( RESOLVE_SNAPSHOT_PROMPT, Arrays.asList( "yes", "no" ), "no" );
+                if ( autoResolveSnapshots != null )
+                {
+                    resolveSnapshot = "yes";
+                    prompter.showMessage( RESOLVE_SNAPSHOT_PROMPT + " " + resolveSnapshot );
+                }
+                else
+                {
+                    resolveSnapshot = prompter.prompt( RESOLVE_SNAPSHOT_PROMPT, Arrays.asList( "yes", "no" ), "no" );
+                }
             }
 
             if ( resolveSnapshot.toLowerCase( Locale.ENGLISH ).startsWith( "y" ) )
@@ -376,38 +385,81 @@ public class CheckDependencySnapshotsPhase
                 if ( resolveSnapshotType == null )
                 {
                     prompter.showMessage( RESOLVE_SNAPSHOT_TYPE_MESSAGE );
-                    resolveSnapshotType =
-                        prompter.prompt( RESOLVE_SNAPSHOT_TYPE_PROMPT, Arrays.asList( "0", "1", "2", "3" ), "1" );
+                    int defaultAnswer = -1;
+                    if ( autoResolveSnapshots != null )
+                    {
+                        if ( "all".equalsIgnoreCase( autoResolveSnapshots ) )
+                        {
+                            defaultAnswer = 0;
+                        }
+                        else if ( "dependencies".equalsIgnoreCase( autoResolveSnapshots ) )
+                        {
+                            defaultAnswer = 1;
+                        }
+                        else if ( "plugins".equalsIgnoreCase( autoResolveSnapshots ) )
+                        {
+                            defaultAnswer = 2;
+                        }
+                        else if ( "reports".equalsIgnoreCase( autoResolveSnapshots ) )
+                        {
+                            defaultAnswer = 3;
+                        }
+                        else if ( "extensions".equalsIgnoreCase( autoResolveSnapshots ) )
+                        {
+                            defaultAnswer = 4;
+                        }
+                        else
+                        {
+                            try
+                            {
+                                defaultAnswer = Integer.parseInt( autoResolveSnapshots );
+                            }
+                            catch ( NumberFormatException e )
+                            {
+                                throw new ReleaseExecutionException( e.getMessage(), e );
+                            }
+                        }
+                    }
+                    if ( defaultAnswer >= 0 && defaultAnswer <= 4 )
+                    {
+                        prompter.showMessage( RESOLVE_SNAPSHOT_TYPE_PROMPT + " " + autoResolveSnapshots );
+                        resolveSnapshotType = Integer.toString( defaultAnswer );
+                    }
+                    else
+                    {
+                        resolveSnapshotType =
+                            prompter.prompt( RESOLVE_SNAPSHOT_TYPE_PROMPT, Arrays.asList( "0", "1", "2", "3" ), "1" );
+                    }
                 }
 
                 switch ( Integer.parseInt( resolveSnapshotType.toLowerCase( Locale.ENGLISH ) ) )
                 {
                     // all
                     case 0:
-                        processSnapshot( projectDependencies, releaseDescriptor );
-                        processSnapshot( pluginDependencies, releaseDescriptor );
-                        processSnapshot( reportDependencies, releaseDescriptor );
-                        processSnapshot( extensionDependencies, releaseDescriptor );
+                        processSnapshot( projectDependencies, releaseDescriptor, autoResolveSnapshots );
+                        processSnapshot( pluginDependencies, releaseDescriptor, autoResolveSnapshots );
+                        processSnapshot( reportDependencies, releaseDescriptor, autoResolveSnapshots );
+                        processSnapshot( extensionDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
                         // project dependencies
                     case 1:
-                        processSnapshot( projectDependencies, releaseDescriptor );
+                        processSnapshot( projectDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
                         // plugins
                     case 2:
-                        processSnapshot( pluginDependencies, releaseDescriptor );
+                        processSnapshot( pluginDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
                         // reports
                     case 3:
-                        processSnapshot( reportDependencies, releaseDescriptor );
+                        processSnapshot( reportDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
                         // extensions
                     case 4:
-                        processSnapshot( extensionDependencies, releaseDescriptor );
+                        processSnapshot( extensionDependencies, releaseDescriptor, autoResolveSnapshots );
                         break;
 
                     default:
@@ -420,7 +472,8 @@ public class CheckDependencySnapshotsPhase
         }
     }
 
-    private void processSnapshot( Set<Artifact> snapshotSet, ReleaseDescriptor releaseDescriptor )
+    private void processSnapshot( Set<Artifact> snapshotSet, ReleaseDescriptor releaseDescriptor,
+                                  String autoResolveSnapshots )
         throws PrompterException, VersionParseException
     {
         Iterator<Artifact> iterator = snapshotSet.iterator();
@@ -435,8 +488,17 @@ public class CheckDependencySnapshotsPhase
 
             prompter.showMessage(
                 "Dependency '" + versionlessKey + "' is a snapshot (" + currentArtifact.getVersion() + ")\n" );
-            String result = prompter.prompt( "Which release version should it be set to?",
-                                             versionInfo.getReleaseVersionString() );
+            String message = "Which release version should it be set to?";
+            String result;
+            if ( null != autoResolveSnapshots )
+            {
+                result = versionInfo.getReleaseVersionString();
+                prompter.showMessage( message + " " + result );
+            }
+            else
+            {
+                result = prompter.prompt( message, versionInfo.getReleaseVersionString() );
+            }
             
             releaseDescriptor.addDependencyReleaseVersion( versionlessKey, result );
 
@@ -456,7 +518,16 @@ public class CheckDependencySnapshotsPhase
                 nextVersion = versionInfo.toString();
             }
 
-            result = prompter.prompt( "What version should the dependency be reset to for development?", nextVersion );
+            message = "What version should the dependency be reset to for development?";
+            if ( null != autoResolveSnapshots )
+            {
+                result = nextVersion;
+                prompter.showMessage( message + " " + result );
+            }
+            else
+            {
+                result = prompter.prompt( message, nextVersion );
+            }
             
             releaseDescriptor.addDependencyDevelopmentVersion( versionlessKey, result );
         }
diff --git a/maven-release-manager/src/main/mdo/release-descriptor.mdo b/maven-release-manager/src/main/mdo/release-descriptor.mdo
index b63c4b4..6bf44f2 100644
--- a/maven-release-manager/src/main/mdo/release-descriptor.mdo
+++ b/maven-release-manager/src/main/mdo/release-descriptor.mdo
@@ -563,6 +563,26 @@
           </description>
         </field>
 
+        <field>
+          <name>autoResolveSnapshots</name>
+          <version>3.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[Specifies whether unresolved SNAPSHOT dependencies are automatically resolved.
+            If set, it is used as the answer to use when being asked how unresolved SNAPSHOT 
+            dependencies should be resolved:
+            <ul>
+            <li>"all" or "0": resolve all kinds of snapshots, ie. project, plugin, report and extension dependencies</li>
+            <li>"dependencies" or "1": resolve project dependencies</li>
+            <li>"plugins" or "2": resolve plugin dependencies</li>
+            <li>"reports" or "3": resolve report dependencies</li>
+            <li>"extensions" or "4": resolve extension dependencies</li>
+            </ul>
+            Additionally this implies that the default values for the dependency's release and next
+            development version are used.]]>
+          </description>
+        </field>
+
         <!-- Announcement Information
 
         Announcement related info, this can be a second part of the process.
@@ -798,7 +818,8 @@
              !java.util.Objects.equals( performGoals, that.getPerformGoals() ) ||
              !java.util.Objects.equals( defaultReleaseVersion, that.getDefaultReleaseVersion() ) ||
              !java.util.Objects.equals( workItem, that.getWorkItem() ) ||
-             !java.util.Objects.equals( scmReleasedPomRevision, that.getScmReleasedPomRevision() )
+             !java.util.Objects.equals( scmReleasedPomRevision, that.getScmReleasedPomRevision() ) ||
+             !java.util.Objects.equals( autoResolveSnapshots, that.getAutoResolveSnapshots() )
            )
         {
             return false;
@@ -1054,6 +1075,7 @@
         result = 29 * result + java.util.Objects.hashCode( defaultReleaseVersion );
         result = 29 * result + java.util.Objects.hashCode( scmReleasedPomRevision );
         result = 29 * result + java.util.Objects.hashCode( workItem );
+        result = 29 * result + java.util.Objects.hashCode( autoResolveSnapshots );
 
         return result;
     }
diff --git a/maven-release-plugin/src/it/projects/prepare/MRELEASE-835/pom.xml b/maven-release-plugin/src/it/projects/prepare/MRELEASE-835/pom.xml
new file mode 100644
index 0000000..38bd07e
--- /dev/null
+++ b/maven-release-plugin/src/it/projects/prepare/MRELEASE-835/pom.xml
@@ -0,0 +1,71 @@
+<?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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.plugins.release.its</groupId>
+  <artifactId>mrelease-835</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <scm>
+    <connection>scm:dummy|nul</connection>
+    <developerConnection>scm:dummy|nul</developerConnection>
+  </scm>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-release-plugin</artifactId>
+        <version>@project.version@</version>
+        <configuration>
+          <autoResolveSnapshots>dependencies</autoResolveSnapshots>
+          <arguments>-Dflag -Dfoo=bar</arguments>
+          <mavenExecutorId>invoker</mavenExecutorId>
+          <goals>validate</goals>
+          <preparationGoals>validate</preparationGoals>
+          <completionGoals>verify</completionGoals>
+        </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>org.apache.maven.its.release</groupId>
+            <artifactId>maven-scm-provider-dummy</artifactId>
+            <version>1.0</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>test</groupId>
+      <artifactId>dependency</artifactId>
+      <version>1.2.3-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>test</groupId>
+      <artifactId>dependency.test</artifactId>
+      <version>2.3.4-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/maven-release-plugin/src/it/projects/prepare/MRELEASE-835/verify.groovy b/maven-release-plugin/src/it/projects/prepare/MRELEASE-835/verify.groovy
new file mode 100644
index 0000000..027cc50
--- /dev/null
+++ b/maven-release-plugin/src/it/projects/prepare/MRELEASE-835/verify.groovy
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+File buildLog = new File( basedir, 'build.log' )
+assert buildLog.exists()
+
+assert 1 == buildLog.getText().count("[DEBUG]   (f) autoResolveSnapshots = dependencies")
+
+File pomXmlNext = new File( basedir, 'pom.xml.next' )
+assert pomXmlNext.exists()
+assert 1 == pomXmlNext.getText().count("<version>1.2.3</version>")
+assert 1 == pomXmlNext.getText().count("<version>2.3.4</version>")
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
index 1c3e057..9e601c0 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
@@ -280,6 +280,27 @@ public class PrepareReleaseMojo
             property = "scmDevelopmentCommitComment" )
     private String scmDevelopmentCommitComment = "@{prefix} prepare for next development iteration";
 
+    /**
+     * Specifies whether unresolved SNAPSHOT dependencies should automatically be resolved.
+     * If this is set, then this specifies the default answer to be used when unresolved SNAPSHOT
+     * dependencies should automatically be resolved ( 0:All 1:Project Dependencies 2:Plugins
+     * 3:Reports 4:Extensions ). Possible values are:
+     * <ul>
+     * <li>"all" or "0": resolve all kinds of snapshots, ie. project, plugin, report and extension dependencies </li>
+     * <li>"dependencies" or "1": resolve project dependencies</li>
+     * <li>"plugins" or "2": resolve plugin dependencis</li>
+     * <li>"reports" or "3": resolve report dependencies</li>
+     * <li>"extensions" or "4": resolve extension dependencies</li>
+     * </ul>
+     * 
+     * @since 3.0.0
+     */
+    @Parameter( property = "autoResolveSnapshots" )
+    private String autoResolveSnapshots;
+
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void execute()
         throws MojoExecutionException, MojoFailureException
@@ -321,6 +342,7 @@ public class PrepareReleaseMojo
         config.setProjectNamingPolicyId( projectTagNamingPolicyId );
         config.setScmDevelopmentCommitComment( scmDevelopmentCommitComment );
         config.setScmReleaseCommitComment( scmReleaseCommitComment );
+        config.setAutoResolveSnapshots( autoResolveSnapshots );
 
         if ( checkModificationExcludeList != null )
         {