You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ev...@apache.org on 2007/02/20 01:04:05 UTC

svn commit: r509391 - in /maven/release/trunk/maven-release-manager/src: main/java/org/apache/maven/shared/release/config/ main/java/org/apache/maven/shared/release/phase/ main/mdo/ test/java/org/apache/maven/shared/release/config/ test/java/org/apache...

Author: evenisse
Date: Mon Feb 19 16:04:04 2007
New Revision: 509391

URL: http://svn.apache.org/viewvc?view=rev&rev=509391
Log:
Allow to set the version of dependencies in the release process then set dependencies versions to snapshots if they was snapshots before the release.
Submitted by: Pete Marvin King

Modified:
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
    maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
    maven/release/trunk/maven-release-manager/src/test/resources/release.properties

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java Mon Feb 19 16:04:04 2007
@@ -30,9 +30,12 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Properties;
+import java.util.Set;
 
 /**
  * Read and write release configuration and state from a properties file.
@@ -95,6 +98,8 @@
         releaseDescriptor.setPomFileName( properties.getProperty( "exec.pomFileName" ) );
         releaseDescriptor.setPreparationGoals( properties.getProperty( "preparationGoals" ) );
 
+        loadResolvedDependencies( properties, releaseDescriptor );
+
         // boolean properties are not written to the properties file because the value from the caller is always used
 
         for ( Iterator i = properties.keySet().iterator(); i.hasNext(); )
@@ -253,6 +258,12 @@
             }
         }
 
+        if ( ( config.getResolvedSnapshotDependencies() != null ) &&
+            ( config.getResolvedSnapshotDependencies().size() > 0 ) )
+        {
+            processResolvedDependencies( properties, config.getResolvedSnapshotDependencies() );
+        }
+
         OutputStream outStream = null;
         //noinspection OverlyBroadCatchBlock
         try
@@ -273,8 +284,82 @@
 
     }
 
+    private void processResolvedDependencies( Properties prop, Map resolvedDependencies )
+    {
+        Set entries = resolvedDependencies.entrySet();
+        Iterator iterator = entries.iterator();
+        Entry currentEntry;
+
+        while ( iterator.hasNext() )
+        {
+            currentEntry = (Entry) iterator.next();
+
+            Map versionMap = (Map) currentEntry.getValue();
+
+            prop.setProperty( "dependency." + currentEntry.getKey() + ".release",
+                              (String) versionMap.get( ReleaseDescriptor.RELEASE_KEY ) );
+            prop.setProperty( "dependency." + currentEntry.getKey() + ".development",
+                              (String) versionMap.get( ReleaseDescriptor.DEVELOPMENT_KEY ) );
+        }
+    }
+
     private static File getDefaultReleasePropertiesFile( ReleaseDescriptor mergeDescriptor )
     {
         return new File( mergeDescriptor.getWorkingDirectory(), "release.properties" );
+    }
+
+    private void loadResolvedDependencies( Properties prop, ReleaseDescriptor descriptor )
+    {
+        Map resolvedDependencies = new HashMap();
+
+        Set entries = prop.entrySet();
+        Iterator iterator = entries.iterator();
+        String propertyName;
+        Entry currentEntry;
+
+        while ( iterator.hasNext() )
+        {
+            currentEntry = (Entry) iterator.next();
+            propertyName = (String) currentEntry.getKey();
+
+            if ( propertyName.startsWith( "dependency." ) )
+            {
+                Map versionMap;
+                String artifactVersionlessKey;
+                int startIndex;
+                int endIndex;
+                String versionType;
+
+                versionMap = new HashMap();
+                startIndex = propertyName.lastIndexOf( "dependency." );
+
+                if ( propertyName.indexOf( ".development" ) != -1 )
+                {
+                    endIndex = propertyName.indexOf( ".development" );
+                    versionType = ReleaseDescriptor.DEVELOPMENT_KEY;
+                }
+                else
+                {
+                    endIndex = propertyName.indexOf( ".release" );
+                    versionType = ReleaseDescriptor.RELEASE_KEY;
+                }
+
+                artifactVersionlessKey = propertyName.substring( startIndex, endIndex );
+
+                if ( resolvedDependencies.containsKey( artifactVersionlessKey ) )
+                {
+                    versionMap = (Map) resolvedDependencies.get( artifactVersionlessKey );
+                }
+                else
+                {
+                    versionMap = new HashMap();
+                    resolvedDependencies.put( artifactVersionlessKey, versionMap );
+                }
+
+                versionMap.put( versionType, currentEntry.getValue() );
+            }
+        }
+
+        descriptor.setResolvedSnapshotDependencies( resolvedDependencies );
     }
 }

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java Mon Feb 19 16:04:04 2007
@@ -207,6 +207,7 @@
         Namespace namespace = rootElement.getNamespace();
         Map mappedVersions = getNextVersionMap( releaseDescriptor );
         Map originalVersions = getOriginalVersionMap( releaseDescriptor, reactorProjects );
+        Map resolvedSnapshotDependencies = releaseDescriptor.getResolvedSnapshotDependencies();
         Element properties = rootElement.getChild( "properties", namespace );
 
         String parentVersion = rewriteParent( project, rootElement, namespace, mappedVersions, originalVersions );
@@ -215,8 +216,8 @@
 
         rewriteVersion( rootElement, namespace, mappedVersions, projectId, project, parentVersion );
 
-        rewriteDependencies( project.getDependencies(), rootElement, mappedVersions, originalVersions, projectId,
-                             properties, result );
+        rewriteDependencies( project.getDependencies(), rootElement, mappedVersions, resolvedSnapshotDependencies,
+                             originalVersions, projectId, properties, releaseDescriptor, result );
 
         if ( project.getDependencyManagement() != null )
         {
@@ -224,7 +225,8 @@
             if ( dependencyRoot != null )
             {
                 rewriteDependencies( project.getDependencyManagement().getDependencies(), dependencyRoot,
-                                     mappedVersions, originalVersions, projectId, properties, result );
+                                     mappedVersions, resolvedSnapshotDependencies, originalVersions, projectId,
+                                     properties, releaseDescriptor, result );
             }
         }
 
@@ -233,19 +235,19 @@
             Element buildRoot = rootElement.getChild( "build", namespace );
             if ( buildRoot != null )
             {
-                rewritePlugins( project.getBuildPlugins(), buildRoot, mappedVersions, originalVersions, projectId,
-                                properties, result );
+                rewritePlugins( project.getBuildPlugins(), buildRoot, mappedVersions, resolvedSnapshotDependencies,
+                                originalVersions, projectId, properties, result );
                 if ( project.getPluginManagement() != null )
                 {
                     Element pluginsRoot = buildRoot.getChild( "pluginManagement", namespace );
                     if ( pluginsRoot != null )
                     {
                         rewritePlugins( project.getPluginManagement().getPlugins(), pluginsRoot, mappedVersions,
-                                        originalVersions, projectId, properties, result );
+                                        resolvedSnapshotDependencies, originalVersions, projectId, properties, result );
                     }
                 }
-                rewriteExtensions( project.getBuildExtensions(), buildRoot, mappedVersions, originalVersions, projectId,
-                                   properties, result );
+                rewriteExtensions( project.getBuildExtensions(), buildRoot, mappedVersions,
+                                   resolvedSnapshotDependencies, originalVersions, projectId, properties, result );
             }
         }
 
@@ -254,8 +256,8 @@
             Element pluginsRoot = rootElement.getChild( "reporting", namespace );
             if ( pluginsRoot != null )
             {
-                rewriteReportPlugins( project.getReportPlugins(), pluginsRoot, mappedVersions, originalVersions,
-                                      projectId, properties, result );
+                rewriteReportPlugins( project.getReportPlugins(), pluginsRoot, mappedVersions,
+                                      resolvedSnapshotDependencies, originalVersions, projectId, properties, result );
             }
         }
 
@@ -321,7 +323,8 @@
     }
 
     private void rewriteDependencies( List dependencies, Element dependencyRoot, Map mappedVersions,
-                                      Map originalVersions, String projectId, Element properties, ReleaseResult result )
+                                      Map resolvedSnapshotDependencies, Map originalVersions, String projectId,
+                                      Element properties, ReleaseDescriptor releaseDescriptor, ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         if ( dependencies != null )
@@ -330,15 +333,15 @@
             {
                 Dependency dep = (Dependency) i.next();
 
-                updateDomVersion( dep.getGroupId(), dep.getArtifactId(), mappedVersions, dep.getVersion(),
-                                  originalVersions, "dependencies", "dependency", dependencyRoot, projectId,
-                                  properties, result );
+                updateDomVersion( dep.getGroupId(), dep.getArtifactId(), mappedVersions, resolvedSnapshotDependencies,
+                                  dep.getVersion(), originalVersions, "dependencies", "dependency", dependencyRoot,
+                                  projectId, properties, result );
             }
         }
     }
 
-    private void rewritePlugins( List plugins, Element pluginRoot, Map mappedVersions, Map originalVersions,
-                                 String projectId, Element properties, ReleaseResult result )
+    private void rewritePlugins( List plugins, Element pluginRoot, Map mappedVersions, Map resolvedSnapshotDependencies,
+                                 Map originalVersions, String projectId, Element properties, ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         if ( plugins != null )
@@ -350,16 +353,17 @@
                 // We can ignore plugins whose version is assumed, they are only written into the release pom
                 if ( plugin.getVersion() != null )
                 {
-                    updateDomVersion( plugin.getGroupId(), plugin.getArtifactId(), mappedVersions, plugin.getVersion(),
-                                      originalVersions, "plugins", "plugin", pluginRoot, projectId,
-                                      properties, result );
+                    updateDomVersion( plugin.getGroupId(), plugin.getArtifactId(), mappedVersions,
+                                      resolvedSnapshotDependencies, plugin.getVersion(), originalVersions, "plugins",
+                                      "plugin", pluginRoot, projectId, properties, result );
                 }
             }
         }
     }
 
-    private void rewriteExtensions( List extensions, Element extensionRoot, Map mappedVersions, Map originalVersions,
-                                    String projectId, Element properties, ReleaseResult result )
+    private void rewriteExtensions( List extensions, Element extensionRoot, Map mappedVersions,
+                                    Map resolvedSnapshotDependencies, Map originalVersions, String projectId,
+                                    Element properties, ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         if ( extensions != null )
@@ -369,14 +373,15 @@
                 Extension extension = (Extension) i.next();
 
                 updateDomVersion( extension.getGroupId(), extension.getArtifactId(), mappedVersions,
-                                  extension.getVersion(), originalVersions, "extensions", "extension", extensionRoot,
-                                  projectId, properties, result );
+                                  resolvedSnapshotDependencies, extension.getVersion(), originalVersions, "extensions",
+                                  "extension", extensionRoot, projectId, properties, result );
             }
         }
     }
 
-    private void rewriteReportPlugins( List plugins, Element pluginRoot, Map mappedVersions, Map originalVersions,
-                                       String projectId, Element properties, ReleaseResult result )
+    private void rewriteReportPlugins( List plugins, Element pluginRoot, Map mappedVersions,
+                                       Map resolvedSnapshotDependencies, Map originalVersions, String projectId,
+                                       Element properties, ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         if ( plugins != null )
@@ -388,28 +393,38 @@
                 // We can ignore plugins whose version is assumed, they are only written into the release pom
                 if ( plugin.getVersion() != null )
                 {
-                    updateDomVersion( plugin.getGroupId(), plugin.getArtifactId(), mappedVersions, plugin.getVersion(),
-                                      originalVersions, "plugins", "plugin", pluginRoot, projectId,
-                                      properties, result );
+                    updateDomVersion( plugin.getGroupId(), plugin.getArtifactId(), mappedVersions,
+                                      resolvedSnapshotDependencies, plugin.getVersion(), originalVersions, "plugins",
+                                      "plugin", pluginRoot, projectId, properties, result );
                 }
             }
         }
     }
 
-    private void updateDomVersion( String groupId, String artifactId, Map mappedVersions, String version,
-                                   Map originalVersions, String groupTagName, String tagName, Element dependencyRoot,
-                                   String projectId, Element properties, ReleaseResult result )
+    private void updateDomVersion( String groupId, String artifactId, Map mappedVersions,
+                                   Map resolvedSnapshotDepedencies, String version, Map originalVersions,
+                                   String groupTagName, String tagName, Element dependencyRoot, String projectId,
+                                   Element properties, ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         String key = ArtifactUtils.versionlessKey( groupId, artifactId );
         String mappedVersion = (String) mappedVersions.get( key );
+        String resolvedSnapshotVersion = getResolvedSnapshotVersion( key, resolvedSnapshotDepedencies );
 
         Object originalVersion = originalVersions.get( key );
+
+        // workaround 
+        if ( originalVersion == null )
+        {
+            originalVersion = getOriginalResolvedSnapshotVersion( key, resolvedSnapshotDepedencies );
+        }
+
         if ( version.equals( originalVersion ) )
         {
-            if ( mappedVersion != null )
+            if ( ( mappedVersion != null ) || ( resolvedSnapshotVersion != null ) )
             {
-                logInfo( result, "Updating " + artifactId + " to " + mappedVersion );
+                logInfo( result, "Updating " + artifactId + " to " +
+                    ( ( mappedVersion != null ) ? mappedVersion : resolvedSnapshotVersion ) );
 
                 try
                 {
@@ -435,6 +450,12 @@
                         // avoid if in management
                         if ( versionElement != null )
                         {
+                            if ( mappedVersion == null )
+                            {
+                                versionElement.setText( resolvedSnapshotVersion );
+                                return;
+                            }
+
                             String versionText = versionElement.getTextTrim();
 
                             // avoid if it was not originally set to the original value (it may be an expression), unless mapped version differs
@@ -443,8 +464,8 @@
                             {
                                 versionElement.setText( mappedVersion );
                             }
-                            else if ( versionText.matches( "\\$\\{project.+\\}" )
-                                || versionText.matches( "\\$\\{pom.+\\}" ) )
+                            else if ( versionText.matches( "\\$\\{project.+\\}" ) ||
+                                versionText.matches( "\\$\\{pom.+\\}" ) )
                             {
                                 logInfo( result, "Ignoring artifact version update for expression: " + versionText );
                                 //ignore... we cannot update this expression
@@ -475,8 +496,8 @@
                                 else
                                 {
                                     // the expression used to define the version of this artifact may be inherited
-                                    throw new ReleaseFailureException( "The version could not be updated: " +
-                                        versionText );
+                                    throw new ReleaseFailureException(
+                                        "The version could not be updated: " + versionText );
                                 }
                             }
                             else
@@ -623,6 +644,8 @@
         return result;
     }
 
+    protected abstract String getResolvedSnapshotVersion( String artifactVersionlessKey, Map resolvedSnapshots );
+
     protected abstract Map getOriginalVersionMap( ReleaseDescriptor releaseDescriptor, List reactorProjects );
 
     protected abstract Map getNextVersionMap( ReleaseDescriptor releaseDescriptor );
@@ -631,6 +654,20 @@
                                           ReleaseDescriptor releaseDescriptor, String projectId,
                                           ScmRepository scmRepository, ReleaseResult result )
         throws ReleaseExecutionException;
+
+    protected String getOriginalResolvedSnapshotVersion( String artifactVersionlessKey, Map resolvedSnapshots )
+    {
+        Map versionsMap = (Map) resolvedSnapshots.get( artifactVersionlessKey );
+
+        if ( versionsMap != null )
+        {
+            return (String) ( versionsMap.get( ReleaseDescriptor.ORIGINAL_VERSION ) );
+        }
+        else
+        {
+            return null;
+        }
+    }
 
     protected Element rewriteElement( String name, String value, Element root, Namespace namespace )
     {

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java Mon Feb 19 16:04:04 2007
@@ -29,12 +29,16 @@
 import org.apache.maven.shared.release.ReleaseFailureException;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.apache.maven.shared.release.versions.DefaultVersionInfo;
+import org.apache.maven.shared.release.versions.VersionInfo;
+import org.apache.maven.shared.release.versions.VersionParseException;
 import org.codehaus.plexus.components.interactivity.Prompter;
 import org.codehaus.plexus.components.interactivity.PrompterException;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -51,6 +55,26 @@
 public class CheckDependencySnapshotsPhase
     extends AbstractReleasePhase
 {
+    public static final String RESOLVE_SNAPSHOT_MESSAGE = "There are still some remaining snapshot dependencies.";
+
+    public static final String RESOLVE_SNAPSHOT_PROMPT = "Do you want to resolve them now?";
+
+    public static final String RESOLVE_SNAPSHOT_TYPE_MESSAGE = "Dependency type to resolve,";
+
+    public static final String RESOLVE_SNAPSHOT_TYPE_PROMPT =
+        "specify the selection number ( 0:All 1:Project Dependencies 2:Plugins 3:Reports 4:Extensions ):";
+
+    public static final String RESOLVE_ALL_SNAPSHOT_MESSAGE = "Resolve All Snapshots.";
+
+    public static final String RESOLVE_ALL_PROJECT_DEPENDENCIES_SNAPSHOT_MESSAGE =
+        "Resolve Project Dependency Snapshots.";
+
+    public static final String RESOLVE_ALL_REPORTS_SNAPSHOT_MESSAGE = "Resolve Report Dependency Snapshots.";
+
+    public static final String RESOLVE_ALL_EXTENSIONS_SNAPSHOT_MESSAGE = "Resolve Extension Dependency Snapshots.";
+
+    public static final String RESOLVE_ALL_PLUGIN_SNAPSHOT_MESSAGE = "Resolve Plugin Dependency Snapshots.";
+
     /**
      * Component used to prompt for input.
      */
@@ -86,6 +110,9 @@
         throws ReleaseFailureException, ReleaseExecutionException
     {
         Set snapshotDependencies = new HashSet();
+        Set snapshotReportDependencies = new HashSet();
+        Set snapshotExtensionsDependencies = new HashSet();
+        Set snapshotPluginDependencies = new HashSet();
 
         if ( project.getParentArtifact() != null )
         {
@@ -149,7 +176,7 @@
 
                 if ( addToFailures )
                 {
-                    snapshotDependencies.add( artifact );
+                    snapshotPluginDependencies.add( artifact );
                 }
             }
         }
@@ -160,7 +187,8 @@
 
             if ( checkArtifact( artifact, originalVersions ) )
             {
-                snapshotDependencies.add( artifact );
+                //snapshotDependencies.add( artifact );
+                snapshotReportDependencies.add( artifact );
             }
         }
 
@@ -170,32 +198,33 @@
 
             if ( checkArtifact( artifact, originalVersions ) )
             {
-                snapshotDependencies.add( artifact );
+                snapshotExtensionsDependencies.add( artifact );
             }
         }
 
-        if ( !snapshotDependencies.isEmpty() )
+        if ( !snapshotDependencies.isEmpty() || !snapshotReportDependencies.isEmpty() ||
+            !snapshotExtensionsDependencies.isEmpty() || !snapshotPluginDependencies.isEmpty() )
         {
-            List snapshotsList = new ArrayList( snapshotDependencies );
-
-            Collections.sort( snapshotsList );
-
-            StringBuffer message = new StringBuffer();
-
-            for ( Iterator i = snapshotsList.iterator(); i.hasNext(); )
+            if ( releaseDescriptor.isInteractive() )
             {
-                Artifact artifact = (Artifact) i.next();
+                resolveSnapshots( snapshotDependencies, snapshotReportDependencies, snapshotExtensionsDependencies,
+                                  snapshotPluginDependencies, releaseDescriptor );
+            }
 
-                message.append( "    " );
+            if ( !snapshotDependencies.isEmpty() || !snapshotReportDependencies.isEmpty() ||
+                !snapshotExtensionsDependencies.isEmpty() || !snapshotPluginDependencies.isEmpty() )
+            {
+                StringBuffer message = new StringBuffer();
 
-                message.append( artifact );
+                printSnapshotDependencies( snapshotDependencies, message );
+                printSnapshotDependencies( snapshotReportDependencies, message );
+                printSnapshotDependencies( snapshotExtensionsDependencies, message );
+                printSnapshotDependencies( snapshotPluginDependencies, message );
+                message.append( "in project '" + project.getName() + "' (" + project.getId() + ")" );
 
-                message.append( "\n" );
+                throw new ReleaseFailureException(
+                    "Can't release project due to non released dependencies :\n" + message );
             }
-
-            message.append( "in project '" + project.getName() + "' (" + project.getId() + ")" );
-
-            throw new ReleaseFailureException( "Can't release project due to non released dependencies :\n" + message );
         }
     }
 
@@ -219,5 +248,132 @@
     public void setPrompter( Prompter prompter )
     {
         this.prompter = prompter;
+    }
+
+    private StringBuffer printSnapshotDependencies( Set snapshotsSet, StringBuffer message )
+    {
+        List snapshotsList = new ArrayList( snapshotsSet );
+
+        Collections.sort( snapshotsList );
+
+        for ( Iterator i = snapshotsList.iterator(); i.hasNext(); )
+        {
+            Artifact artifact = (Artifact) i.next();
+
+            message.append( "    " );
+
+            message.append( artifact );
+
+            message.append( "\n" );
+        }
+
+        return message;
+    }
+
+    private void resolveSnapshots( Set projectDependencies, Set reportDependencies, Set extensionDependencies,
+                                   Set pluginDependencies, ReleaseDescriptor releaseDescriptor )
+        throws ReleaseExecutionException
+    {
+        try
+        {
+            prompter.showMessage( RESOLVE_SNAPSHOT_MESSAGE );
+            String result =
+                prompter.prompt( RESOLVE_SNAPSHOT_PROMPT, Arrays.asList( new String[]{"yes", "no"} ), "no" );
+
+            if ( result.toLowerCase().startsWith( "y" ) )
+            {
+                Set snapshotSet = new HashSet();
+                Map resolvedSnapshots = null;
+                prompter.showMessage( RESOLVE_SNAPSHOT_TYPE_MESSAGE );
+                result = prompter.prompt( RESOLVE_SNAPSHOT_TYPE_PROMPT,
+                                          Arrays.asList( new String[]{"0", "1", "2", "3"} ), "1" );
+
+                switch ( Integer.parseInt( result.toLowerCase() ) )
+                {
+                    // all
+                    case 0:
+                        prompter.showMessage( RESOLVE_ALL_SNAPSHOT_MESSAGE );
+                        snapshotSet.addAll( projectDependencies );
+                        snapshotSet.addAll( reportDependencies );
+                        snapshotSet.addAll( extensionDependencies );
+                        snapshotSet.addAll( pluginDependencies );
+                        resolvedSnapshots = processSnapshot( snapshotSet );
+                        break;
+
+                        // project dependencies
+                    case 1:
+                        prompter.showMessage( RESOLVE_ALL_PROJECT_DEPENDENCIES_SNAPSHOT_MESSAGE );
+                        resolvedSnapshots = processSnapshot( projectDependencies );
+                        break;
+
+                        // plugins
+                    case 2:
+                        prompter.showMessage( RESOLVE_ALL_PLUGIN_SNAPSHOT_MESSAGE );
+                        resolvedSnapshots = processSnapshot( pluginDependencies );
+                        break;
+
+                        // reports
+                    case 3:
+                        prompter.showMessage( RESOLVE_ALL_REPORTS_SNAPSHOT_MESSAGE );
+                        resolvedSnapshots = processSnapshot( reportDependencies );
+                        break;
+
+                        // extensions
+                    case 4:
+                        prompter.showMessage( RESOLVE_ALL_EXTENSIONS_SNAPSHOT_MESSAGE );
+                        resolvedSnapshots = processSnapshot( extensionDependencies );
+                        break;
+                }
+
+                releaseDescriptor.setResolvedSnapshotDependencies( resolvedSnapshots );
+            }
+        }
+        catch ( PrompterException e )
+        {
+            throw new ReleaseExecutionException( e.getMessage(), e );
+        }
+        catch ( VersionParseException e )
+        {
+            throw new ReleaseExecutionException( e.getMessage(), e );
+        }
+    }
+
+    private Map processSnapshot( Set snapshotSet )
+        throws PrompterException, VersionParseException
+    {
+        Map resolvedSnapshots = new HashMap();
+        Iterator iterator = snapshotSet.iterator();
+        Artifact currentArtifact;
+        String result;
+        VersionInfo version;
+
+        while ( iterator.hasNext() )
+        {
+            currentArtifact = (Artifact) iterator.next();
+            version = new DefaultVersionInfo( currentArtifact.getVersion() );
+
+            result = prompter.prompt( "'" + ArtifactUtils.versionlessKey( currentArtifact ) + "' set to release?",
+                                      Arrays.asList( new String[]{"yes", "no"} ), "yes" );
+
+            if ( result.toLowerCase().startsWith( "y" ) )
+            {
+                VersionInfo nextDevelopmentVersion;
+                Map versionMap = new HashMap();
+
+                iterator.remove();
+                result = prompter.prompt( "What is the next development version?", Collections.singletonList(
+                    version.getNextVersion().getSnapshotVersionString() ),
+                                                                                   version.getNextVersion().getSnapshotVersionString() );
+
+                nextDevelopmentVersion = new DefaultVersionInfo( result );
+                versionMap.put( ReleaseDescriptor.ORIGINAL_VERSION, version.toString() );
+                versionMap.put( ReleaseDescriptor.DEVELOPMENT_KEY, nextDevelopmentVersion.getSnapshotVersionString() );
+                versionMap.put( ReleaseDescriptor.RELEASE_KEY, version.getReleaseVersionString() );
+
+                resolvedSnapshots.put( ArtifactUtils.versionlessKey( currentArtifact ), versionMap );
+            }
+        }
+
+        return resolvedSnapshots;
     }
 }

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java Mon Feb 19 16:04:04 2007
@@ -101,4 +101,18 @@
     {
         return releaseDescriptor.getDevelopmentVersions();
     }
+
+    protected String getResolvedSnapshotVersion( String artifactVersionlessKey, Map resolvedSnapshotsMap )
+    {
+        Map versionsMap = (Map) resolvedSnapshotsMap.get( artifactVersionlessKey );
+
+        if ( versionsMap != null )
+        {
+            return (String) ( versionsMap.get( ReleaseDescriptor.DEVELOPMENT_KEY ) );
+        }
+        else
+        {
+            return null;
+        }
+    }
 }

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java Mon Feb 19 16:04:04 2007
@@ -162,4 +162,18 @@
     {
         return releaseDescriptor.getReleaseVersions();
     }
-}
\ No newline at end of file
+
+    protected String getResolvedSnapshotVersion( String artifactVersionlessKey, Map resolvedSnapshotsMap )
+    {
+        Map versionsMap = (Map) resolvedSnapshotsMap.get( artifactVersionlessKey );
+
+        if ( versionsMap != null )
+        {
+            return (String) ( versionsMap.get( ReleaseDescriptor.RELEASE_KEY ) );
+        }
+        else
+        {
+            return null;
+        }
+    }
+}

Modified: maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo (original)
+++ maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo Mon Feb 19 16:04:04 2007
@@ -161,6 +161,18 @@
           </description>
         </field>
         <field>
+          <name>resolvedSnapshotDependencies</name>
+          <version>1.0.0</version>
+          <type>Map</type>
+          <association stash.keyType="String">
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+          <description>
+            A map of resolved snapshot dependencies versions.
+          </description>
+        </field>
+        <field>
           <name>originalScmInfo</name>
           <version>1.0.0</version>
           <type>Map</type>
@@ -257,6 +269,31 @@
         <codeSegment>
           <version>1.0.0</version>
           <code><![CDATA[
+    public static final String DEVELOPMENT_KEY = "dev";
+    
+    public static final String RELEASE_KEY = "rel";
+    
+    public static final String ORIGINAL_VERSION = "original";
+                        
+    /**
+     * Map a given snapshot dependency to a specified version from when it is released.
+     *
+     */
+    public void mapResolvedSnapshotDependencies( String artifactName, String releaseVersion, String developmentVersion )
+    {
+        if (resolvedSnapshotDependencies == null) {
+            resolvedSnapshotDependencies = new java.util.HashMap();
+        } else {
+            assert !resolvedSnapshotDependencies.containsKey( artifactName );
+        }
+
+        java.util.Map versionsMap = new java.util.HashMap();
+
+        versionsMap.put( DEVELOPMENT_KEY, developmentVersion );
+        versionsMap.put( RELEASE_KEY, releaseVersion );
+        resolvedSnapshotDependencies.put( artifactName, versionsMap );
+    }
+          
     /**
      * Map a given project to a specified version from when it is released.
      *
@@ -333,6 +370,34 @@
             }
         }
         return originalVersions;
+    }
+
+    /**
+     * Retrieve the release version for the resolved snapshot dependency.
+     *
+     */
+    public String getDependencyDevelopmentVersion( String artifactConflictId )
+    {
+        if ( ( resolvedSnapshotDependencies == null ) && ( resolvedSnapshotDependencies.containsKey( artifactConflictId ) ) )
+        {
+            java.util.Map versionMap = ( java.util.Map ) resolvedSnapshotDependencies.get( artifactConflictId );
+            return ( String ) versionMap.get( DEVELOPMENT_KEY );
+        }
+        return null;
+    }
+
+    /**
+     * Retrieve the release version for the resolved snapshot dependency.
+     *
+     */
+    public String getDependencyReleaseVersion( String artifactConflictId )
+    {
+        if ( ( resolvedSnapshotDependencies == null ) && ( resolvedSnapshotDependencies.containsKey( artifactConflictId ) ) )
+        {
+            java.util.Map versionMap = ( java.util.Map ) resolvedSnapshotDependencies.get( artifactConflictId );
+            return ( String ) versionMap.get( RELEASE_KEY );
+        }
+        return null;
     }
 
     public boolean equals( Object obj )

Modified: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java (original)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStoreTest.java Mon Feb 19 16:04:04 2007
@@ -319,6 +319,7 @@
         assertTrue( "Expected no release version mappings", config.getReleaseVersions().isEmpty() );
         assertTrue( "Expected no dev version mappings", config.getDevelopmentVersions().isEmpty() );
         assertTrue( "Expected no scm mappings", config.getOriginalScmInfo().isEmpty() );
+        assertNotNull( "Expected resolved snapshot dependencies map", config.getResolvedSnapshotDependencies() );
     }
 
     public ReleaseDescriptor createMergeConfiguration()
@@ -369,6 +370,8 @@
         scm.setTag( null );
         scm.setDeveloperConnection( null );
         expected.mapOriginalScmInfo( "groupId:artifactId2", scm );
+        expected.mapResolvedSnapshotDependencies( "external:artifactId", "1.0", "1.1-SNAPSHOT" );
+
         return expected;
     }
 

Modified: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java (original)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java Mon Feb 19 16:04:04 2007
@@ -30,6 +30,8 @@
 import org.jmock.core.stub.ThrowStub;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Stack;
 
 /**
  * Test the dependency snapshot check phase.
@@ -117,6 +119,8 @@
         Mock mockPrompter = new Mock( Prompter.class );
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "no" ) );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "no" ) );
         phase.setPrompter( (Prompter) mockPrompter.proxy() );
 
         try
@@ -133,6 +137,8 @@
         mockPrompter.reset();
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "no" ) );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "no" ) );
 
         try
         {
@@ -183,6 +189,8 @@
         Mock mockPrompter = new Mock( Prompter.class );
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "donkey" ) );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "no" ) );
         phase.setPrompter( (Prompter) mockPrompter.proxy() );
 
         try
@@ -199,6 +207,8 @@
         mockPrompter.reset();
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
         mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "donkey" ) );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( new ReturnStub( "no" ) );
 
         try
         {
@@ -258,8 +268,14 @@
     public void testSnapshotDependenciesInProjectOnlyMismatchedVersion()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "internal-differing-snapshot-dependencies" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -272,6 +288,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -332,6 +350,8 @@
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "external-managed-snapshot-dependency" );
 
+        releaseDescriptor.setInteractive( false );
+
         try
         {
             phase.execute( releaseDescriptor, null, reactorProjects );
@@ -355,12 +375,14 @@
         }
     }
 
-    public void testSnapshotDependenciesOutsideProjectOnly()
+    public void testSnapshotDependenciesOutsideProjectOnlyNonInteractive()
         throws Exception
     {
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "external-snapshot-dependencies" );
 
+        releaseDescriptor.setInteractive( false );
+
         try
         {
             phase.execute( releaseDescriptor, null, reactorProjects );
@@ -384,11 +406,82 @@
         }
     }
 
+    public void testSnapshotDependenciesOutsideProjectOnlyInteractiveWithSnapshotsResolved()
+        throws Exception
+    {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
+        ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
+        List reactorProjects = createDescriptorFromProjects( "external-snapshot-dependencies" );
+        Mock mockPrompter;
+        Stack responseStack = new Stack();
+
+        responseStack.push( "yes" );
+        responseStack.push( "1" );
+        responseStack.push( "yes" );
+        responseStack.push( "1.1-SNAPSHOT" );
+        mockPrompter = createMockPrompter( "prompt", responseStack );
+
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+
+        phase.setPrompter( (Prompter) mockPrompter.proxy() );
+
+        try
+        {
+            phase.execute( releaseDescriptor, null, reactorProjects );
+        }
+        catch ( ReleaseFailureException e )
+        {
+            fail( e.getMessage() );
+        }
+
+        // validate
+        Map versionsMap = (Map) releaseDescriptor.getResolvedSnapshotDependencies().get( "external:artifactId" );
+
+        assertNotNull( versionsMap );
+        assertEquals( "1.1-SNAPSHOT", versionsMap.get( ReleaseDescriptor.DEVELOPMENT_KEY ) );
+        assertEquals( "1.0", versionsMap.get( ReleaseDescriptor.RELEASE_KEY ) );
+
+        releaseDescriptor = new ReleaseDescriptor();
+
+        responseStack.push( "yes" );
+        responseStack.push( "1" );
+        responseStack.push( "yes" );
+        responseStack.push( "1.1-SNAPSHOT" );
+        mockPrompter = createMockPrompter( "prompt", responseStack );
+
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+
+        phase.setPrompter( (Prompter) mockPrompter.proxy() );
+
+        try
+        {
+            phase.simulate( releaseDescriptor, null, reactorProjects );
+        }
+        catch ( ReleaseFailureException e )
+        {
+            fail( e.getMessage() );
+        }
+    }
+
     public void testSnapshotDependenciesInsideAndOutsideProject()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "internal-and-external-snapshot-dependencies" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -401,6 +494,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -444,8 +539,14 @@
     public void testSnapshotReportPluginsOutsideProjectOnly()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "external-snapshot-report-plugins" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -458,6 +559,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -473,8 +576,14 @@
     public void testSnapshotReportPluginsInsideAndOutsideProject()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "internal-and-external-snapshot-report-plugins" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -487,6 +596,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -572,8 +683,14 @@
     public void testSnapshotExternalManagedPlugin()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "external-managed-snapshot-plugin" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -586,6 +703,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -601,8 +720,14 @@
     public void testSnapshotPluginsOutsideProjectOnly()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "external-snapshot-plugins" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -615,6 +740,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -630,8 +757,14 @@
     public void testSnapshotPluginsInsideAndOutsideProject()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "internal-and-external-snapshot-plugins" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -644,6 +777,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -659,8 +794,14 @@
     public void testSnapshotExternalParent()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "external-snapshot-parent/child" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -673,6 +814,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -702,8 +845,14 @@
     public void testSnapshotExternalExtension()
         throws Exception
     {
+        CheckDependencySnapshotsPhase phase =
+            (CheckDependencySnapshotsPhase) lookup( ReleasePhase.ROLE, "check-dependency-snapshots" );
+
         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
         List reactorProjects = createDescriptorFromProjects( "external-snapshot-extension" );
+        Mock noPrompter = createNoMockPrompter();
+
+        phase.setPrompter( (Prompter) noPrompter.proxy() );
 
         try
         {
@@ -716,6 +865,8 @@
             assertTrue( true );
         }
 
+        resetNoMockPrompter( noPrompter );
+
         try
         {
             phase.simulate( releaseDescriptor, null, reactorProjects );
@@ -762,4 +913,57 @@
         return createReactorProjects( "check-dependencies/", path, true );
     }
 
+    private Mock createNoMockPrompter()
+    {
+        return createYesNoMockPrompter( false );
+    }
+
+    private Mock createYesMockPrompter()
+    {
+        return createYesNoMockPrompter( true );
+    }
+
+    private Mock createYesNoMockPrompter( boolean yes )
+    {
+        Mock mockPrompter = new Mock( Prompter.class );
+
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will(
+            new ReturnStub( ( yes ) ? "yes" : "no" ) );
+
+        return mockPrompter;
+    }
+
+    private Mock resetNoMockPrompter( Mock mockPrompter )
+    {
+        return resetYesNoMockPrompter( mockPrompter, false );
+    }
+
+    private Mock resetYesMockPrompter( Mock mockPrompter )
+    {
+        return resetYesNoMockPrompter( mockPrompter, true );
+    }
+
+    private Mock resetYesNoMockPrompter( Mock mockPrompter, boolean yes )
+    {
+        mockPrompter.reset();
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "showMessage" );
+        mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will(
+            new ReturnStub( ( yes ) ? "yes" : "no" ) );
+
+        return mockPrompter;
+    }
+
+    private Mock createMockPrompter( String methodName, Stack responseStack )
+    {
+        Mock mockPrompter = new Mock( Prompter.class );
+
+        while ( !responseStack.empty() )
+        {
+            mockPrompter.expects( new InvokeOnceMatcher() ).method( methodName ).will(
+                new ReturnStub( responseStack.pop() ) );
+        }
+
+        return mockPrompter;
+    }
 }

Modified: maven/release/trunk/maven-release-manager/src/test/resources/release.properties
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/resources/release.properties?view=diff&rev=509391&r1=509390&r2=509391
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/resources/release.properties (original)
+++ maven/release/trunk/maven-release-manager/src/test/resources/release.properties Mon Feb 19 16:04:04 2007
@@ -42,4 +42,7 @@
 project.scm.groupId\:artifactId1.tag=tag
 
 project.scm.groupId\:artifactId2.connection=connection2
-project.scm.groupId\:artifactId2.url=url2
\ No newline at end of file
+project.scm.groupId\:artifactId2.url=url2
+
+dependency.external\:artifactId.development=1.1-SNAPSHOT
+dependency.external\:artifactId.release=1.0