Author: brett Date: Wed Apr 26 01:49:51 2006 New Revision: 397148 URL: http://svn.apache.org/viewcvs?rev=397148&view=rev Log: [MRELEASE-98] mapping and input of dev/release versions
Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/MapVersionsPhase.java (with props) maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.java (with props) maven/plugins/trunk/maven-release-plugin/src/test/resources/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.xml (with props) Modified: maven/plugins/trunk/maven-release-plugin/pom.xml maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/DefaultReleaseManager.java maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStore.java maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/ReleaseConfiguration.java maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStoreTest.java maven/plugins/trunk/maven-release-plugin/src/test/resources/release.properties Modified: maven/plugins/trunk/maven-release-plugin/pom.xml URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/pom.xml?rev=397148&r1=397147&r2=397148&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/pom.xml (original) +++ maven/plugins/trunk/maven-release-plugin/pom.xml Wed Apr 26 01:49:51 2006 @@ -113,6 +113,13 @@ <build> <plugins> <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.4</source> + <target>1.4</target> + </configuration> + </plugin> + <plugin> <artifactId>maven-surefire-plugin</artifactId> <configuration> <childDelegation>false</childDelegation> Modified: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/DefaultReleaseManager.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/DefaultReleaseManager.java?rev=397148&r1=397147&r2=397148&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/DefaultReleaseManager.java (original) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/DefaultReleaseManager.java Wed Apr 26 01:49:51 2006 @@ -59,7 +59,7 @@ */ private ReleaseConfigurationStore configStore; - // TODO: config - release pom generation, interactive, tag, use edit mode + // TODO: config - tag public void prepare( ReleaseConfiguration releaseConfiguration ) throws ReleaseExecutionException @@ -80,10 +80,6 @@ { config = releaseConfiguration; } - - // TODO: move these to phases? Into the rewriting, or as a separate phase? Separate phase sounds best to be able to rearrange - // - walk through modules, map out values, prompt as necessary - for development versions - // - walk through modules, map out values, prompt as necessary - for release versions // Later, it would be a good idea to introduce a proper workflow tool so that the release can be made up of a // more flexible set of steps. Modified: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStore.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStore.java?rev=397148&r1=397147&r2=397148&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStore.java (original) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStore.java Wed Apr 26 01:49:51 2006 @@ -26,6 +26,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Iterator; +import java.util.Map; import java.util.Properties; /** @@ -83,6 +85,23 @@ releaseConfiguration.setPassphrase( properties.getProperty( "scm.passphrase" ) ); releaseConfiguration.setTagBase( properties.getProperty( "scm.tagBase" ) ); + // 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(); ) + { + String property = (String) i.next(); + if ( property.startsWith( "project.rel." ) ) + { + releaseConfiguration.mapReleaseVersion( property.substring( "project.rel.".length() ), + properties.getProperty( property ) ); + } + else if ( property.startsWith( "project.dev." ) ) + { + releaseConfiguration.mapDevelopmentVersion( property.substring( "project.dev.".length() ), + properties.getProperty( property ) ); + } + } + if ( mergeConfiguration != null ) { releaseConfiguration.merge( mergeConfiguration ); @@ -102,6 +121,20 @@ properties.setProperty( "scm.privateKey", config.getPrivateKey() ); properties.setProperty( "scm.passphrase", config.getPassphrase() ); properties.setProperty( "scm.tagBase", config.getTagBase() ); + + // boolean properties are not written to the properties file because the value from the caller is always used + + for ( Iterator i = config.getReleaseVersions().entrySet().iterator(); i.hasNext(); ) + { + Map.Entry entry = (Map.Entry) i.next(); + properties.setProperty( "project.rel." + entry.getKey(), (String) entry.getValue() ); + } + + for ( Iterator i = config.getDevelopmentVersions().entrySet().iterator(); i.hasNext(); ) + { + Map.Entry entry = (Map.Entry) i.next(); + properties.setProperty( "project.dev." + entry.getKey(), (String) entry.getValue() ); + } OutputStream outStream = null; //noinspection OverlyBroadCatchBlock Modified: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/ReleaseConfiguration.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/ReleaseConfiguration.java?rev=397148&r1=397147&r2=397148&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/ReleaseConfiguration.java (original) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/config/ReleaseConfiguration.java Wed Apr 26 01:49:51 2006 @@ -19,7 +19,10 @@ import org.apache.maven.settings.Settings; import java.io.File; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Configuration used for the release. @@ -95,6 +98,32 @@ */ private boolean generateReleasePoms; + /** + * Whether the release process is interactive and the release manager should be prompted to confirm values, or + * whether the defaults are used regardless. + */ + private boolean interactive = true; + + /** + * A map of projects to versions to use when releasing the given projects. + */ + private Map releaseVersions = new HashMap(); + + /** + * A map of projects to versions to use when moving the given projects back into devlopment after release. + */ + private Map developmentVersions = new HashMap(); + + public boolean isInteractive() + { + return interactive; + } + + public void setInteractive( boolean interactive ) + { + this.interactive = interactive; + } + public boolean isGenerateReleasePoms() { return generateReleasePoms; @@ -225,6 +254,16 @@ this.generateReleasePoms = generateReleasePoms; } + public Map getReleaseVersions() + { + return Collections.unmodifiableMap( releaseVersions ); + } + + public Map getDevelopmentVersions() + { + return Collections.unmodifiableMap( developmentVersions ); + } + /** * Merge two configurations together. All SCM settings are overridden by the merge configuration, as are the * <code>settings</code> and <code>workingDirectory</code> fields. The <code>completedPhase</code> field is used as @@ -245,6 +284,7 @@ this.useEditMode = mergeConfiguration.useEditMode; this.addSchema = mergeConfiguration.addSchema; this.generateReleasePoms = mergeConfiguration.generateReleasePoms; + this.interactive = mergeConfiguration.interactive; // These must be overridden, as they are not stored this.settings = mergeOverride( this.settings, mergeConfiguration.settings ); @@ -253,6 +293,8 @@ // Not overridden - not configured from caller this.completedPhase = mergeDefault( this.completedPhase, mergeConfiguration.completedPhase ); + + // The version maps are never merged } private List mergeOverride( List thisValue, List mergeValue ) @@ -280,24 +322,6 @@ return thisValue != null ? thisValue : mergeValue; } - public int hashCode() - { - int result = completedPhase != null ? completedPhase.hashCode() : 0; - result = 29 * result + ( settings != null ? settings.hashCode() : 0 ); - result = 29 * result + ( tagBase != null ? tagBase.hashCode() : 0 ); - result = 29 * result + ( username != null ? username.hashCode() : 0 ); - result = 29 * result + ( password != null ? password.hashCode() : 0 ); - result = 29 * result + ( url != null ? url.hashCode() : 0 ); - result = 29 * result + ( privateKey != null ? privateKey.hashCode() : 0 ); - result = 29 * result + ( passphrase != null ? passphrase.hashCode() : 0 ); - result = 29 * result + ( workingDirectory != null ? workingDirectory.hashCode() : 0 ); - result = 29 * result + ( reactorProjects != null ? reactorProjects.hashCode() : 0 ); - result = 29 * result + ( useEditMode ? 1 : 0 ); - result = 29 * result + ( addSchema ? 1 : 0 ); - result = 29 * result + ( generateReleasePoms ? 1 : 0 ); - return result; - } - public boolean equals( Object obj ) { if ( this == obj ) @@ -315,11 +339,15 @@ { return false; } - if ( useEditMode != that.useEditMode ) + if ( generateReleasePoms != that.generateReleasePoms ) { return false; } - if ( generateReleasePoms != that.generateReleasePoms ) + if ( interactive != that.interactive ) + { + return false; + } + if ( useEditMode != that.useEditMode ) { return false; } @@ -327,6 +355,11 @@ { return false; } + if ( developmentVersions != null ? !developmentVersions.equals( that.developmentVersions ) + : that.developmentVersions != null ) + { + return false; + } if ( passphrase != null ? !passphrase.equals( that.passphrase ) : that.passphrase != null ) { return false; @@ -343,6 +376,10 @@ { return false; } + if ( releaseVersions != null ? !releaseVersions.equals( that.releaseVersions ) : that.releaseVersions != null ) + { + return false; + } if ( settings != null ? !settings.equals( that.settings ) : that.settings != null ) { return false; @@ -367,5 +404,52 @@ } return true; + } + + public int hashCode() + { + int result = completedPhase != null ? completedPhase.hashCode() : 0; + result = 29 * result + ( settings != null ? settings.hashCode() : 0 ); + result = 29 * result + ( tagBase != null ? tagBase.hashCode() : 0 ); + result = 29 * result + ( username != null ? username.hashCode() : 0 ); + result = 29 * result + ( password != null ? password.hashCode() : 0 ); + result = 29 * result + ( url != null ? url.hashCode() : 0 ); + result = 29 * result + ( privateKey != null ? privateKey.hashCode() : 0 ); + result = 29 * result + ( passphrase != null ? passphrase.hashCode() : 0 ); + result = 29 * result + ( workingDirectory != null ? workingDirectory.hashCode() : 0 ); + result = 29 * result + ( reactorProjects != null ? reactorProjects.hashCode() : 0 ); + result = 29 * result + ( useEditMode ? 1 : 0 ); + result = 29 * result + ( addSchema ? 1 : 0 ); + result = 29 * result + ( generateReleasePoms ? 1 : 0 ); + result = 29 * result + ( interactive ? 1 : 0 ); + result = 29 * result + ( releaseVersions != null ? releaseVersions.hashCode() : 0 ); + result = 29 * result + ( developmentVersions != null ? developmentVersions.hashCode() : 0 ); + return result; + } + + /** + * Map a given project to a specified version from when it is released. + * + * @param projectId the project's group and artifact ID + * @param nextVersion the version to map to + */ + public void mapReleaseVersion( String projectId, String nextVersion ) + { + assert !releaseVersions.containsKey( projectId ); + + releaseVersions.put( projectId, nextVersion ); + } + + /** + * Map a given project to a specified version from when it is incremented and placed back into development. + * + * @param projectId the project's group and artifact ID + * @param nextVersion the version to map to + */ + public void mapDevelopmentVersion( String projectId, String nextVersion ) + { + assert !developmentVersions.containsKey( projectId ); + + developmentVersions.put( projectId, nextVersion ); } } Added: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/MapVersionsPhase.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/MapVersionsPhase.java?rev=397148&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/MapVersionsPhase.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/MapVersionsPhase.java Wed Apr 26 01:49:51 2006 @@ -0,0 +1,136 @@ +package org.apache.maven.plugins.release.phase; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.maven.artifact.ArtifactUtils; +import org.apache.maven.plugins.release.ReleaseExecutionException; +import org.apache.maven.plugins.release.config.ReleaseConfiguration; +import org.apache.maven.plugins.release.versions.DefaultVersionInfo; +import org.apache.maven.plugins.release.versions.VersionInfo; +import org.apache.maven.plugins.release.versions.VersionParseException; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.components.interactivity.Prompter; +import org.codehaus.plexus.components.interactivity.PrompterException; +import org.codehaus.plexus.logging.AbstractLogEnabled; + +import java.util.Iterator; + +/** + * Map projects to their new versions after release / into the next development cycle. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Brett Porter</a> + */ +public class MapVersionsPhase + extends AbstractLogEnabled + implements ReleasePhase +{ + /** + * Whether to convert to a snapshot or a release. + */ + private boolean convertToSnapshot; + + /** + * Component used to prompt for input. + */ + private Prompter prompter; + + void setPrompter( Prompter prompter ) + { + this.prompter = prompter; + } + + public void execute( ReleaseConfiguration releaseConfiguration ) + throws ReleaseExecutionException + { + for ( Iterator i = releaseConfiguration.getReactorProjects().iterator(); i.hasNext(); ) + { + MavenProject project = (MavenProject) i.next(); + + String projectId = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ); + + VersionInfo version = null; + try + { + // TODO: make sure to test inherited version + version = new DefaultVersionInfo( project.getVersion() ); + } + catch ( VersionParseException e ) + { + String msg = "Error parsing version, cannot determine next version: " + e.getMessage(); + if ( releaseConfiguration.isInteractive() ) + { + getLogger().warn( msg ); + getLogger().debug( e.getMessage(), e ); + } + else + { + // cannot proceed without a next value in batch mode + throw new ReleaseExecutionException( msg, e ); + } + } + + try + { + if ( convertToSnapshot ) + { + String nextVersion = null; + if ( version != null ) + { + nextVersion = version.getNextVersion().getSnapshotVersionString(); + } + + if ( releaseConfiguration.isInteractive() ) + { + nextVersion = prompter.prompt( "What is the new development version for \"" + + project.getName() + "\"? (" + projectId + ")", nextVersion ); + } + + releaseConfiguration.mapDevelopmentVersion( projectId, nextVersion ); + } + else + { + String nextVersion = null; + if ( version != null ) + { + nextVersion = version.getReleaseVersionString(); + } + + if ( releaseConfiguration.isInteractive() ) + { + nextVersion = prompter.prompt( + "What is the release version for \"" + project.getName() + "\"? (" + projectId + ")", + nextVersion ); + } + + releaseConfiguration.mapReleaseVersion( projectId, nextVersion ); + } + } + catch ( PrompterException e ) + { + throw new ReleaseExecutionException( "Error reading version from input handler: " + e.getMessage(), e ); + } + } + } + + public void simulate( ReleaseConfiguration releaseConfiguration ) + throws ReleaseExecutionException + { + // It makes no modifications, so simulate is the same as execute + execute( releaseConfiguration ); + } + +} Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/MapVersionsPhase.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/phase/MapVersionsPhase.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml?rev=397148&r1=397147&r2=397148&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml (original) +++ maven/plugins/trunk/maven-release-plugin/src/main/resources/META-INF/plexus/components.xml Wed Apr 26 01:49:51 2006 @@ -18,6 +18,8 @@ <configuration> <phases> <phase>check-poms</phase> + <phase>map-release-versions</phase> + <phase>map-development-versions</phase> <phase>scm-check-modifications</phase> <phase>check-dependency-snapshots</phase> <phase>rewrite-poms-for-release</phase> @@ -34,6 +36,32 @@ <role>org.apache.maven.plugins.release.phase.ReleasePhase</role> <role-hint>check-poms</role-hint> <implementation>org.apache.maven.plugins.release.phase.CheckPomPhase</implementation> + </component> + <component> + <role>org.apache.maven.plugins.release.phase.ReleasePhase</role> + <role-hint>map-release-versions</role-hint> + <implementation>org.apache.maven.plugins.release.phase.MapVersionsPhase</implementation> + <configuration> + <convertToSnapshot>false</convertToSnapshot> + </configuration> + <requirements> + <requirement> + <role>org.codehaus.plexus.components.interactivity.Prompter</role> + </requirement> + </requirements> + </component> + <component> + <role>org.apache.maven.plugins.release.phase.ReleasePhase</role> + <role-hint>map-development-versions</role-hint> + <implementation>org.apache.maven.plugins.release.phase.MapVersionsPhase</implementation> + <configuration> + <convertToSnapshot>true</convertToSnapshot> + </configuration> + <requirements> + <requirement> + <role>org.codehaus.plexus.components.interactivity.Prompter</role> + </requirement> + </requirements> </component> <component> <role>org.apache.maven.plugins.release.phase.ReleasePhase</role> Modified: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStoreTest.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStoreTest.java?rev=397148&r1=397147&r2=397148&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStoreTest.java (original) +++ maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/config/PropertiesReleaseConfigurationStoreTest.java Wed Apr 26 01:49:51 2006 @@ -19,6 +19,7 @@ import org.codehaus.plexus.PlexusTestCase; import java.io.File; +import java.util.Map; /** * Test the properties store. @@ -53,6 +54,24 @@ assertEquals( "Expected tag base of 'tagBase'", "tagBase", config.getTagBase() ); assertNull( "Expected no workingDirectory", config.getWorkingDirectory() ); assertNull( "Expected no settings", config.getSettings() ); + assertFalse( "Expected default generateReleasePoms", config.isGenerateReleasePoms() ); + assertFalse( "Expected default useEditMode", config.isUseEditMode() ); + assertTrue( "Expected default interactive", config.isInteractive() ); + assertFalse( "Expected default addScema", config.isAddSchema() ); + + Map versions = config.getReleaseVersions(); + assertEquals( "Expected 2 version mappings", 2, versions.size() ); + assertTrue( "missing project mapping", versions.containsKey( "groupId:artifactId1" ) ); + assertEquals( "Incorrect version mapping", "2.0", versions.get( "groupId:artifactId1" ) ); + assertTrue( "missing project mapping", versions.containsKey( "groupId:artifactId2" ) ); + assertEquals( "Incorrect version mapping", "3.0", versions.get( "groupId:artifactId2" ) ); + + versions = config.getDevelopmentVersions(); + assertEquals( "Expected 2 version mappings", 2, versions.size() ); + assertTrue( "missing project mapping", versions.containsKey( "groupId:artifactId1" ) ); + assertEquals( "Incorrect version mapping", "2.1-SNAPSHOT", versions.get( "groupId:artifactId1" ) ); + assertTrue( "missing project mapping", versions.containsKey( "groupId:artifactId2" ) ); + assertEquals( "Incorrect version mapping", "3.0.1-SNAPSHOT", versions.get( "groupId:artifactId2" ) ); } public void testReadFromEmptyFile() @@ -109,14 +128,7 @@ assertFalse( "Check file doesn't exist", file.exists() ); store.setPropertiesFile( file ); - ReleaseConfiguration config = new ReleaseConfiguration(); - config.setCompletedPhase( "completed-phase-write" ); - config.setUrl( "url-write" ); - config.setUsername( "username-write" ); - config.setPassword( "password-write" ); - config.setPrivateKey( "private-key-write" ); - config.setPassphrase( "passphrase-write" ); - config.setTagBase( "tag-base" ); + ReleaseConfiguration config = createReleaseConfigurationForWriting(); store.write( config ); @@ -132,6 +144,17 @@ assertTrue( "Check file already exists", file.exists() ); store.setPropertiesFile( file ); + ReleaseConfiguration config = createReleaseConfigurationForWriting(); + + store.write( config ); + + ReleaseConfiguration rereadConfiguration = store.read(); + + assertEquals( "compare configuration", config, rereadConfiguration ); + } + + private ReleaseConfiguration createReleaseConfigurationForWriting() + { ReleaseConfiguration config = new ReleaseConfiguration(); config.setCompletedPhase( "completed-phase-write" ); config.setUrl( "url-write" ); @@ -141,11 +164,10 @@ config.setPassphrase( "passphrase-write" ); config.setTagBase( "tag-base" ); - store.write( config ); + config.mapReleaseVersion( "groupId:artifactId", "1.0" ); + config.mapDevelopmentVersion( "groupId:artifactId", "1.1-SNAPSHOT" ); - ReleaseConfiguration rereadConfiguration = store.read(); - - assertEquals( "compare configuration", config, rereadConfiguration ); + return config; } private static void assertDefaultReleaseConfiguration( ReleaseConfiguration config ) @@ -160,6 +182,14 @@ assertNull( "Expected no workingDirectory", config.getWorkingDirectory() ); assertNull( "Expected no settings", config.getSettings() ); + + assertFalse( "Expected no generateReleasePoms", config.isGenerateReleasePoms() ); + assertFalse( "Expected no useEditMode", config.isUseEditMode() ); + assertTrue( "Expected default interactive", config.isInteractive() ); + assertFalse( "Expected no addScema", config.isAddSchema() ); + + assertTrue( "Expected no release version mappings", config.getReleaseVersions().isEmpty() ); + assertTrue( "Expected no dev version mappings", config.getDevelopmentVersions().isEmpty() ); } public ReleaseConfiguration createMergeConfiguration() Added: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.java URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.java?rev=397148&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.java (added) +++ maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.java Wed Apr 26 01:49:51 2006 @@ -0,0 +1,308 @@ +package org.apache.maven.plugins.release.phase; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.maven.model.Model; +import org.apache.maven.plugins.release.ReleaseExecutionException; +import org.apache.maven.plugins.release.config.ReleaseConfiguration; +import org.apache.maven.plugins.release.versions.VersionParseException; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.PlexusTestCase; +import org.codehaus.plexus.components.interactivity.Prompter; +import org.codehaus.plexus.components.interactivity.PrompterException; +import org.jmock.cglib.Mock; +import org.jmock.core.constraint.IsAnything; +import org.jmock.core.constraint.IsEqual; +import org.jmock.core.constraint.IsNull; +import org.jmock.core.matcher.InvokeOnceMatcher; +import org.jmock.core.matcher.TestFailureMatcher; +import org.jmock.core.stub.ReturnStub; +import org.jmock.core.stub.ThrowStub; + +import java.util.Collections; +import java.util.List; + +/** + * Test the version mapping phase. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Brett Porter</a> + */ +public class MapVersionsPhaseTest + extends PlexusTestCase +{ + public void testMapReleaseVersionsInteractive() + throws Exception + { + MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.ROLE, "test-map-release-versions" ); + + Mock mockPrompter = new Mock( Prompter.class ); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).with( new IsAnything(), + new IsEqual( "1.0" ) ).will( + new ReturnStub( "2.0" ) ); + phase.setPrompter( (Prompter) mockPrompter.proxy() ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0-SNAPSHOT" ) ); + + ReleaseConfiguration releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + phase.execute( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ), + releaseConfiguration.getReleaseVersions() ); + + releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + mockPrompter.reset(); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).with( new IsAnything(), + new IsEqual( "1.0" ) ).will( + new ReturnStub( "2.0" ) ); + + phase.simulate( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0" ), + releaseConfiguration.getReleaseVersions() ); + } + + public void testMapReleaseVersionsNonInteractive() + throws Exception + { + MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.ROLE, "test-map-release-versions" ); + + Mock mockPrompter = new Mock( Prompter.class ); + mockPrompter.expects( new TestFailureMatcher( "prompter should not be called" ) ).method( "prompt" ); + phase.setPrompter( (Prompter) mockPrompter.proxy() ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0-SNAPSHOT" ) ); + + ReleaseConfiguration releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + releaseConfiguration.setInteractive( false ); + + phase.execute( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0" ), + releaseConfiguration.getReleaseVersions() ); + + mockPrompter.reset(); + mockPrompter.expects( new TestFailureMatcher( "prompter should not be called" ) ).method( "prompt" ); + + releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + releaseConfiguration.setInteractive( false ); + + phase.simulate( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.0" ), + releaseConfiguration.getReleaseVersions() ); + } + + public void testMapDevVersionsInteractive() + throws Exception + { + MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.ROLE, "test-map-development-versions" ); + + Mock mockPrompter = new Mock( Prompter.class ); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).with( new IsAnything(), + new IsEqual( "1.1-SNAPSHOT" ) ).will( + new ReturnStub( "2.0-SNAPSHOT" ) ); + phase.setPrompter( (Prompter) mockPrompter.proxy() ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); + + ReleaseConfiguration releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + phase.execute( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ), + releaseConfiguration.getDevelopmentVersions() ); + + releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + mockPrompter.reset(); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).with( new IsAnything(), + new IsEqual( "1.1-SNAPSHOT" ) ).will( + new ReturnStub( "2.0-SNAPSHOT" ) ); + + phase.simulate( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ), + releaseConfiguration.getDevelopmentVersions() ); + } + + public void testMapDevVersionsNonInteractive() + throws Exception + { + MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.ROLE, "test-map-development-versions" ); + + Mock mockPrompter = new Mock( Prompter.class ); + mockPrompter.expects( new TestFailureMatcher( "prompter should not be called" ) ).method( "prompt" ); + phase.setPrompter( (Prompter) mockPrompter.proxy() ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); + + ReleaseConfiguration releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + releaseConfiguration.setInteractive( false ); + + phase.execute( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.1-SNAPSHOT" ), + releaseConfiguration.getDevelopmentVersions() ); + + mockPrompter.reset(); + mockPrompter.expects( new TestFailureMatcher( "prompter should not be called" ) ).method( "prompt" ); + + releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + releaseConfiguration.setInteractive( false ); + + phase.simulate( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "1.1-SNAPSHOT" ), + releaseConfiguration.getDevelopmentVersions() ); + } + + public void testPrompterException() + throws Exception + { + MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.ROLE, "test-map-development-versions" ); + + Mock mockPrompter = new Mock( Prompter.class ); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( + new ThrowStub( new PrompterException( "..." ) ) ); + phase.setPrompter( (Prompter) mockPrompter.proxy() ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); + + ReleaseConfiguration releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + try + { + phase.execute( releaseConfiguration ); + + fail( "Expected an exception" ); + } + catch ( ReleaseExecutionException e ) + { + assertEquals( "check cause", PrompterException.class, e.getCause().getClass() ); + } + + releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + mockPrompter.reset(); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).will( + new ThrowStub( new PrompterException( "..." ) ) ); + + try + { + phase.simulate( releaseConfiguration ); + + fail( "Expected an exception" ); + } + catch ( ReleaseExecutionException e ) + { + assertEquals( "check cause", PrompterException.class, e.getCause().getClass() ); + } + } + + public void testInvalidVersionInteractive() + throws Exception + { + MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.ROLE, "test-map-development-versions" ); + + Mock mockPrompter = new Mock( Prompter.class ); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).with( new IsAnything(), new IsNull() ).will( + new ReturnStub( "2.0-SNAPSHOT" ) ); + phase.setPrompter( (Prompter) mockPrompter.proxy() ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "foo" ) ); + + ReleaseConfiguration releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + phase.execute( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ), + releaseConfiguration.getDevelopmentVersions() ); + + mockPrompter.reset(); + mockPrompter.expects( new InvokeOnceMatcher() ).method( "prompt" ).with( new IsAnything(), new IsNull() ).will( + new ReturnStub( "2.0-SNAPSHOT" ) ); + + releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + + phase.simulate( releaseConfiguration ); + + assertEquals( "Check mapped versions", Collections.singletonMap( "groupId:artifactId", "2.0-SNAPSHOT" ), + releaseConfiguration.getDevelopmentVersions() ); + } + + public void testInvalidVersionNonInteractive() + throws Exception + { + MapVersionsPhase phase = (MapVersionsPhase) lookup( ReleasePhase.ROLE, "test-map-development-versions" ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "foo" ) ); + + ReleaseConfiguration releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + releaseConfiguration.setInteractive( false ); + + try + { + phase.execute( releaseConfiguration ); + + fail( "Expected an exception" ); + } + catch ( ReleaseExecutionException e ) + { + assertEquals( "check cause", VersionParseException.class, e.getCause().getClass() ); + } + + releaseConfiguration = new ReleaseConfiguration(); + releaseConfiguration.setReactorProjects( reactorProjects ); + releaseConfiguration.setInteractive( false ); + + try + { + phase.simulate( releaseConfiguration ); + + fail( "Expected an exception" ); + } + catch ( ReleaseExecutionException e ) + { + assertEquals( "check cause", VersionParseException.class, e.getCause().getClass() ); + } + } + + private static MavenProject createProject( String artifactId, String version ) + { + Model model = new Model(); + model.setGroupId( "groupId" ); + model.setArtifactId( artifactId ); + model.setVersion( version ); + return new MavenProject( model ); + } + +} Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/plugins/trunk/maven-release-plugin/src/test/resources/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.xml URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/test/resources/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.xml?rev=397148&view=auto ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/test/resources/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.xml (added) +++ maven/plugins/trunk/maven-release-plugin/src/test/resources/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.xml Wed Apr 26 01:49:51 2006 @@ -0,0 +1,36 @@ +<!-- + ~ Copyright 2005-2006 The Apache Software Foundation. + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<component-set> + <components> + <component> + <role>org.apache.maven.plugins.release.phase.ReleasePhase</role> + <role-hint>test-map-development-versions</role-hint> + <implementation>org.apache.maven.plugins.release.phase.MapVersionsPhase</implementation> + <configuration> + <convertToSnapshot>true</convertToSnapshot> + </configuration> + </component> + <component> + <role>org.apache.maven.plugins.release.phase.ReleasePhase</role> + <role-hint>test-map-release-versions</role-hint> + <implementation>org.apache.maven.plugins.release.phase.MapVersionsPhase</implementation> + <configuration> + <convertToSnapshot>false</convertToSnapshot> + </configuration> + </component> + </components> +</component-set> Propchange: maven/plugins/trunk/maven-release-plugin/src/test/resources/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/plugins/trunk/maven-release-plugin/src/test/resources/org/apache/maven/plugins/release/phase/MapVersionsPhaseTest.xml ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/plugins/trunk/maven-release-plugin/src/test/resources/release.properties URL: http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-release-plugin/src/test/resources/release.properties?rev=397148&r1=397147&r2=397148&view=diff ============================================================================== --- maven/plugins/trunk/maven-release-plugin/src/test/resources/release.properties (original) +++ maven/plugins/trunk/maven-release-plugin/src/test/resources/release.properties Wed Apr 26 01:49:51 2006 @@ -21,3 +21,8 @@ scm.privateKey=private-key scm.passphrase=passphrase scm.tagBase=tagBase + +project.rel.groupId\:artifactId1=2.0 +project.rel.groupId\:artifactId2=3.0 +project.dev.groupId\:artifactId1=2.1-SNAPSHOT +project.dev.groupId\:artifactId2=3.0.1-SNAPSHOT