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