From a6b8131b517bb780d4d8cd36e53154269cee3ae0 Mon Sep 17 00:00:00 2001 From: Henning Schmiedehausen Date: Thu, 26 Jan 2017 12:28:48 -0800 Subject: [PATCH] implements MRELEASE-979: Allow VersionPolicies to manage Branch and Tag names Introduces a new policy, NamingPolicy which allows managing branch and tag names. This is similar but independent from the existing VersionPolicy implementations. --- .../release/policy/naming/NamingPolicy.java | 37 +++++ .../policy/naming/NamingPolicyRequest.java | 92 +++++++++++++ .../policy/naming/NamingPolicyResult.java | 44 ++++++ maven-release-manager/pom.xml | 2 +- .../src/main/components-fragment.xml | 8 ++ .../shared/release/config/ReleaseUtils.java | 4 + .../release/phase/InputVariablesPhase.java | 126 ++++++++++++------ .../release/policies/DefaultNamingPolicy.java | 50 +++++++ .../src/main/mdo/release-descriptor.mdo | 25 ++-- .../phase/BranchInputVariablesPhaseTest.java | 13 ++ .../phase/InputVariablesPhaseTest.java | 49 +++++++ .../plugins/release/BranchReleaseMojo.java | 9 ++ .../plugins/release/PrepareReleaseMojo.java | 9 ++ .../plugins/release/UpdateVersionsMojo.java | 19 ++- 14 files changed, 432 insertions(+), 55 deletions(-) create mode 100644 maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicy.java create mode 100644 maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyRequest.java create mode 100644 maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyResult.java create mode 100644 maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicy.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicy.java new file mode 100644 index 000000000..c45b656e7 --- /dev/null +++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicy.java @@ -0,0 +1,37 @@ +package org.apache.maven.shared.release.policy.naming; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.shared.release.policy.PolicyException; + +/** + * API for branch and tag naming. Used by maven-release-plugin to suggest names for tags and branches. + * + * @since 3.0.0 (MRELEASE-979) + */ +public interface NamingPolicy +{ + /** + * Calculation of the name used for branching or tagging. + */ + NamingPolicyResult getName( NamingPolicyRequest request ) + throws PolicyException; + +} diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyRequest.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyRequest.java new file mode 100644 index 000000000..6af5ca8bc --- /dev/null +++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyRequest.java @@ -0,0 +1,92 @@ +package org.apache.maven.shared.release.policy.naming; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * + * @since 3.0.0 (MRELEASE-979) + */ +public class NamingPolicyRequest +{ + + /** + * Artifact release version for which the branch or tag is created. + */ + private String version; + + /** + * Proposed name for the branch or tag. + */ + private String name; + + /** + * true if branch operation, false for tag operation. + */ + private boolean branch; + + /** + * Generated (from scmTagFormat and project settings) name proposal. + */ + private String proposal; + + public String getVersion() + { + return version; + } + + public NamingPolicyRequest setVersion( String version ) + { + this.version = version; + return this; + } + + public String getName() + { + return name; + } + + public NamingPolicyRequest setName( String name ) + { + this.name = name; + return this; + } + + public String getProposal() + { + return proposal; + } + + public NamingPolicyRequest setProposal( String proposal ) + { + this.proposal = proposal; + return this; + } + + public boolean isBranch() + { + return branch; + } + + public NamingPolicyRequest setBranch( boolean branch ) + { + this.branch = branch; + return this; + } +} diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyResult.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyResult.java new file mode 100644 index 000000000..411e8b724 --- /dev/null +++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/naming/NamingPolicyResult.java @@ -0,0 +1,44 @@ +package org.apache.maven.shared.release.policy.naming; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * + * @since 3.0.0 (MRELEASE-979) + */ +public class NamingPolicyResult +{ + /** + * The tag or branch name to use. + */ + private String name; + + public String getName() + { + return name; + } + + public NamingPolicyResult setName( String name ) + { + this.name = name; + return this; + } + +} diff --git a/maven-release-manager/pom.xml b/maven-release-manager/pom.xml index 122b05f99..883179a88 100644 --- a/maven-release-manager/pom.xml +++ b/maven-release-manager/pom.xml @@ -211,7 +211,7 @@ - 2.5.1 + 3.0.0 false true diff --git a/maven-release-manager/src/main/components-fragment.xml b/maven-release-manager/src/main/components-fragment.xml index 6841932d8..5880c75f0 100644 --- a/maven-release-manager/src/main/components-fragment.xml +++ b/maven-release-manager/src/main/components-fragment.xml @@ -238,6 +238,10 @@ org.apache.maven.shared.release.scm.ScmRepositoryConfigurator + + org.apache.maven.shared.release.policy.naming.NamingPolicy + namingPolicies + @@ -255,6 +259,10 @@ org.apache.maven.shared.release.scm.ScmRepositoryConfigurator + + org.apache.maven.shared.release.policy.naming.NamingPolicy + namingPolicies + diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java index 522fef4ad..80c59320a 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java @@ -124,6 +124,9 @@ public static ReleaseDescriptor merge( ReleaseDescriptor mergeInto, ReleaseDescr mergeInto.setProjectVersionPolicyId( mergeDefault( mergeInto.getProjectVersionPolicyId(), toBeMerged.getProjectVersionPolicyId() ) ); + mergeInto.setProjectNamingPolicyId( + mergeDefault( mergeInto.getProjectNamingPolicyId(), toBeMerged.getProjectNamingPolicyId() ) ); + return mergeInto; } @@ -163,6 +166,7 @@ public static ReleaseDescriptor copyPropertiesToReleaseDescriptor( Properties pr releaseDescriptor.setPreparationGoals( properties.getProperty( "preparationGoals" ) ); releaseDescriptor.setCompletionGoals( properties.getProperty( "completionGoals" ) ); releaseDescriptor.setProjectVersionPolicyId( properties.getProperty( "projectVersionPolicyId" ) ); + releaseDescriptor.setProjectNamingPolicyId( properties.getProperty( "projectNamingPolicyId" ) ); String snapshotReleasePluginAllowedStr = properties.getProperty( "exec.snapshotReleasePluginAllowed" ); releaseDescriptor.setSnapshotReleasePluginAllowed( snapshotReleasePluginAllowedStr == null ? false diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java index 23f925a58..a45c8b4ca 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/InputVariablesPhase.java @@ -29,6 +29,10 @@ import org.apache.maven.shared.release.ReleaseResult; import org.apache.maven.shared.release.config.ReleaseDescriptor; import org.apache.maven.shared.release.env.ReleaseEnvironment; +import org.apache.maven.shared.release.policy.PolicyException; +import org.apache.maven.shared.release.policy.naming.NamingPolicy; +import org.apache.maven.shared.release.policy.naming.NamingPolicyRequest; +import org.apache.maven.shared.release.policy.naming.NamingPolicyResult; import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException; import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator; import org.apache.maven.shared.release.util.ReleaseUtil; @@ -44,6 +48,7 @@ import org.codehaus.plexus.util.StringUtils; import java.util.List; +import java.util.Map; import java.util.Properties; /** @@ -65,6 +70,11 @@ public class InputVariablesPhase */ private boolean branchOperation; + /** + * Component used for custom or default naming policy + */ + private Map namingPolicies; + /** * Tool that gets a configured SCM repository from release configuration. */ @@ -114,56 +124,75 @@ public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnviro String tag = releaseDescriptor.getScmReleaseLabel(); - if ( tag == null ) + // Must get default version from mapped versions, as the project will be the incorrect snapshot + String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ); + String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key ); + if ( releaseVersion == null ) { - // Must get default version from mapped versions, as the project will be the incorrect snapshot - String key = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ); - String releaseVersion = (String) releaseDescriptor.getReleaseVersions().get( key ); - if ( releaseVersion == null ) - { - throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" ); - } - - String defaultTag; - String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat(); - if ( scmTagNameFormat != null ) - { - Interpolator interpolator = new StringSearchInterpolator( "@{", "}" ); - List possiblePrefixes = java.util.Arrays.asList( "project", "pom" ); - Properties values = new Properties(); - values.setProperty( "artifactId", project.getArtifactId() ); - values.setProperty( "groupId", project.getGroupId() ); - values.setProperty( "version", releaseVersion ); - interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) ); - RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes ); - try - { - defaultTag = interpolator.interpolate( scmTagNameFormat, recursionInterceptor ); - } - catch ( InterpolationException e ) - { - throw new ReleaseExecutionException( - "Could not interpolate specified tag name format: " + scmTagNameFormat, e ); - } - } - else - { - defaultTag = project.getArtifactId() + "-" + releaseVersion; - } + throw new ReleaseExecutionException( "Project tag cannot be selected if version is not yet mapped" ); + } - ScmProvider provider = null; + String defaultTag; + String scmTagNameFormat = releaseDescriptor.getScmTagNameFormat(); + if ( scmTagNameFormat != null ) + { + Interpolator interpolator = new StringSearchInterpolator( "@{", "}" ); + List possiblePrefixes = java.util.Arrays.asList( "project", "pom" ); + Properties values = new Properties(); + values.setProperty( "artifactId", project.getArtifactId() ); + values.setProperty( "groupId", project.getGroupId() ); + values.setProperty( "version", releaseVersion ); + interpolator.addValueSource( new PrefixedPropertiesValueSource( possiblePrefixes, values, true ) ); + RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( possiblePrefixes ); try { - provider = getScmProvider( releaseDescriptor, releaseEnvironment ); + defaultTag = interpolator.interpolate( scmTagNameFormat, recursionInterceptor ); } - catch ( ReleaseScmRepositoryException e ) + catch ( InterpolationException e ) { throw new ReleaseExecutionException( - "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e ); + "Could not interpolate specified tag name format: " + scmTagNameFormat, e ); } + } + else + { + defaultTag = project.getArtifactId() + "-" + releaseVersion; + } - defaultTag = provider.sanitizeTagName( defaultTag ); + ScmProvider provider = null; + try + { + provider = getScmProvider( releaseDescriptor, releaseEnvironment ); + } + catch ( ReleaseScmRepositoryException e ) + { + throw new ReleaseExecutionException( + "No scm provider can be found for url: " + releaseDescriptor.getScmSourceUrl(), e ); + } + + defaultTag = provider.sanitizeTagName( defaultTag ); + + String policyTag = null; + + try + { + NamingPolicyRequest request = new NamingPolicyRequest() + .setBranch( branchOperation ) + .setVersion( releaseVersion ) + .setName( tag ) + .setProposal( defaultTag ); + + policyTag = resolveTagOrBranchName( request, releaseDescriptor.getProjectNamingPolicyId() ); + } + catch ( PolicyException e ) + { + throw new ReleaseExecutionException( e.getMessage(), e ); + } + tag = StringUtils.isEmpty( policyTag ) ? tag : policyTag; + + if ( tag == null ) + { if ( releaseDescriptor.isInteractive() ) { try @@ -197,14 +226,29 @@ else if ( branchOperation ) { tag = defaultTag; } - releaseDescriptor.setScmReleaseLabel( tag ); } + releaseDescriptor.setScmReleaseLabel( tag ); + result.setResultCode( ReleaseResult.SUCCESS ); return result; } + private String resolveTagOrBranchName( NamingPolicyRequest request, String policyId ) + throws PolicyException + { + NamingPolicy policy = namingPolicies.get( policyId ); + if ( policy == null ) + { + throw new PolicyException( "Policy '" + policyId + "' is unknown, available: " + namingPolicies.keySet() ); + } + + NamingPolicyResult result = policy.getName( request ); + + return ( result == null || result.getName() == null ) ? request.getName() : result.getName(); + } + public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects ) throws ReleaseExecutionException diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java new file mode 100644 index 000000000..487197781 --- /dev/null +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/policies/DefaultNamingPolicy.java @@ -0,0 +1,50 @@ +package org.apache.maven.shared.release.policies; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.shared.release.policy.PolicyException; +import org.apache.maven.shared.release.policy.naming.NamingPolicy; +import org.apache.maven.shared.release.policy.naming.NamingPolicyRequest; +import org.apache.maven.shared.release.policy.naming.NamingPolicyResult; +import org.codehaus.plexus.component.annotations.Component; + +/** + * Implements backwards compatible naming policy. Returns the branch + * or tag name chosen by the release manager as is without any changes. + * If the name was null, returns null. + */ +@Component( role = NamingPolicy.class, hint = "default" ) +public class DefaultNamingPolicy + implements NamingPolicy +{ + + public NamingPolicyResult getName( NamingPolicyRequest request ) + throws PolicyException + { + if ( request == null ) + { + return null; + } + else + { + return new NamingPolicyResult().setName( request.getName() ); + } + } +} diff --git a/maven-release-manager/src/main/mdo/release-descriptor.mdo b/maven-release-manager/src/main/mdo/release-descriptor.mdo index 0e6fe352e..f62b0ffd1 100644 --- a/maven-release-manager/src/main/mdo/release-descriptor.mdo +++ b/maven-release-manager/src/main/mdo/release-descriptor.mdo @@ -443,6 +443,15 @@ The role-hint for the VersionPolicy implementation used to calculate the project versions. + + projectNamingPolicyId + 3.0.0+ + String + default + + The role-hint for the NamingPolicy implementation used to calculate the project branch and tag names. + + remoteTagging @@ -869,7 +878,7 @@ { return true; } - + if ( thisScm.getConnection() != null ? !thisScm.getConnection().equals( thatScm.getConnection() ) : thatScm.getConnection() != null ) { @@ -888,15 +897,15 @@ { return false; } - + if ( thisScm instanceof org.apache.maven.shared.release.scm.IdentifiedScm && thatScm instanceof org.apache.maven.shared.release.scm.IdentifiedScm ) { - org.apache.maven.shared.release.scm.IdentifiedScm thisIdentifiedScm = (org.apache.maven.shared.release.scm.IdentifiedScm) thisScm; - org.apache.maven.shared.release.scm.IdentifiedScm thatIdentifiedScm = (org.apache.maven.shared.release.scm.IdentifiedScm) thatScm; - if ( thisIdentifiedScm.getId() != null ? !thisIdentifiedScm.getId().equals( thatIdentifiedScm.getId() ) : thatIdentifiedScm.getId() != null ) - { - return false; - } + org.apache.maven.shared.release.scm.IdentifiedScm thisIdentifiedScm = (org.apache.maven.shared.release.scm.IdentifiedScm) thisScm; + org.apache.maven.shared.release.scm.IdentifiedScm thatIdentifiedScm = (org.apache.maven.shared.release.scm.IdentifiedScm) thatScm; + if ( thisIdentifiedScm.getId() != null ? !thisIdentifiedScm.getId().equals( thatIdentifiedScm.getId() ) : thatIdentifiedScm.getId() != null ) + { + return false; + } } } diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java index d730bd6a9..4a2f9e77a 100644 --- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java +++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/BranchInputVariablesPhaseTest.java @@ -71,6 +71,7 @@ public void testInputVariablesInteractive() ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -137,8 +138,10 @@ public void testInputVariablesNonInteractiveConfigured() List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setInteractive( false ); releaseDescriptor.setScmReleaseLabel( "tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); // execute phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -148,8 +151,10 @@ public void testInputVariablesNonInteractiveConfigured() // prepare releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setInteractive( false ); releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); // execute phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -172,7 +177,10 @@ public void testInputVariablesInteractiveConfigured() List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmReleaseLabel( "tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -182,7 +190,10 @@ public void testInputVariablesInteractiveConfigured() // prepare releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -209,6 +220,7 @@ public void testPrompterException() ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute try @@ -226,6 +238,7 @@ public void testPrompterException() releaseDescriptor = new ReleaseDescriptor(); releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute try diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java index 0a777534e..5e3c3eea2 100644 --- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java +++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/InputVariablesPhaseTest.java @@ -37,9 +37,13 @@ import org.apache.maven.shared.release.ReleaseExecutionException; import org.apache.maven.shared.release.config.ReleaseDescriptor; import org.apache.maven.shared.release.env.DefaultReleaseEnvironment; +import org.apache.maven.shared.release.policy.PolicyException; import org.codehaus.plexus.components.interactivity.Prompter; import org.codehaus.plexus.components.interactivity.PrompterException; +import org.hamcrest.CoreMatchers; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; /** * Test the variable input phase. @@ -51,6 +55,9 @@ public class InputVariablesPhaseTest { private InputVariablesPhase phase; + @Rule + public ExpectedException expectedException = ExpectedException.none(); + public void setUp() throws Exception { @@ -73,6 +80,7 @@ public void testInputVariablesInteractive() ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -84,6 +92,7 @@ public void testInputVariablesInteractive() releaseDescriptor = new ReleaseDescriptor(); releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -176,8 +185,10 @@ public void testInputVariablesNonInteractiveConfigured() List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setInteractive( false ); releaseDescriptor.setScmReleaseLabel( "tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); // execute phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -187,8 +198,10 @@ public void testInputVariablesNonInteractiveConfigured() // prepare releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setInteractive( false ); releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); // execute phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -206,12 +219,16 @@ public void testInputVariablesInteractiveConfigured() { // prepare Prompter mockPrompter = mock( Prompter.class ); + phase.setPrompter( mockPrompter ); List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmReleaseLabel( "tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -221,7 +238,10 @@ public void testInputVariablesInteractiveConfigured() // prepare releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); @@ -248,6 +268,7 @@ public void testPrompterException() ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute try @@ -265,6 +286,7 @@ public void testPrompterException() releaseDescriptor = new ReleaseDescriptor(); releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + releaseDescriptor.setInteractive( true ); // execute try @@ -359,6 +381,33 @@ public void testCustomTagFormat() verifyNoMoreInteractions( mockPrompter ); } + /** + * MRELEASE-979: Test that a PolicyException is thrown when using an unknown naming policy hint. + * @throws Exception + */ + @Test + public void testNonExistentNamingPolicy() + throws Exception + { + expectedException.expect( ReleaseExecutionException.class ); + expectedException.expectCause( CoreMatchers.isA( PolicyException.class ) ); + + Prompter mockPrompter = mock( Prompter.class ); + phase.setPrompter( mockPrompter ); + + List reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) ); + ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.setInteractive( false ); + releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" ); + releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" ); + + releaseDescriptor.setProjectNamingPolicyId( "UNKNOWN" ); + + // test + phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects ); + } + + @Test public void testBranchOperation() throws Exception diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java index cc3b9245e..03aa31be7 100644 --- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java +++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java @@ -198,6 +198,14 @@ public class BranchReleaseMojo @Parameter( defaultValue = "default", property = "projectVersionPolicyId" ) private String projectVersionPolicyId; + /** + * The role-hint for the NamingPolicy implementation used to calculate the project branch and tag names. + * + * @since 3.0.0 + */ + @Parameter( defaultValue = "default", property = "projectNamingPolicyId" ) + private String projectNamingPolicyId; + /** * {@inheritDoc} */ @@ -222,6 +230,7 @@ public void execute() config.setDefaultDevelopmentVersion( developmentVersion ); config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeBranch ); config.setProjectVersionPolicyId( projectVersionPolicyId ); + config.setProjectNamingPolicyId( projectNamingPolicyId ); // Create a config containing values from the session properties (ie command line properties with cli). ReleaseDescriptor sysPropertiesConfig diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java index 2c54bae96..852f61cd1 100644 --- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java +++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java @@ -225,6 +225,14 @@ public class PrepareReleaseMojo @Parameter( defaultValue = "default", property = "projectVersionPolicyId" ) private String projectVersionPolicyId; + /** + * The role-hint for the NamingPolicy implementation used to calculate the project branch and tag names. + * + * @since 3.0.0 + */ + @Parameter( defaultValue = "default", property = "projectNamingPolicyId" ) + private String projectNamingPolicyId; + /** * {@inheritDoc} */ @@ -265,6 +273,7 @@ protected void prepareRelease( boolean generateReleasePoms ) config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeTag ); config.setWaitBeforeTagging( waitBeforeTagging ); config.setProjectVersionPolicyId( projectVersionPolicyId ); + config.setProjectNamingPolicyId( projectNamingPolicyId ); if ( checkModificationExcludeList != null ) { diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/UpdateVersionsMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/UpdateVersionsMojo.java index e3ebb9252..2650c1666 100644 --- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/UpdateVersionsMojo.java +++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/UpdateVersionsMojo.java @@ -38,7 +38,7 @@ * without making other modifications to the SCM such as tagging. For more info see http://maven.apache.org/plugins/maven-release-plugin/examples/update-versions.html. - * + * * @author Paul Gier * @version $Id$ * @since 2.0 @@ -51,7 +51,7 @@ public class UpdateVersionsMojo /** * Whether to automatically assign submodules the parent version. If set to false, the user will be prompted for the * version of each submodules. - * + * * @since 2.0 */ @Parameter( defaultValue = "false", property = "autoVersionSubmodules" ) @@ -59,7 +59,7 @@ public class UpdateVersionsMojo /** * Whether to add a schema to the POM if it was previously missing on release. - * + * * @since 2.0 */ @Parameter( defaultValue = "true", property = "addSchema" ) @@ -67,7 +67,7 @@ public class UpdateVersionsMojo /** * Default version to use for new local working copy. - * + * * @since 2.0 */ @Parameter( property = "developmentVersion" ) @@ -83,7 +83,7 @@ public class UpdateVersionsMojo /** * Whether to use "edit" mode on the SCM, to lock the file for editing during SCM operations. - * + * * @since 2.5.2 */ @Parameter( defaultValue = "false", property = "useEditMode" ) @@ -97,6 +97,14 @@ public class UpdateVersionsMojo @Parameter( defaultValue = "default", property = "projectVersionPolicyId" ) private String projectVersionPolicyId; + /** + * The role-hint for the NamingPolicy implementation used to calculate the project branch and tag names. + * + * @since 3.0.0 + */ + @Parameter( defaultValue = "default", property = "projectNamingPolicyId" ) + private String projectNamingPolicyId; + /** * {@inheritDoc} */ @@ -110,6 +118,7 @@ public void execute() config.setScmUseEditMode( useEditMode ); config.setUpdateDependencies( updateDependencies ); config.setProjectVersionPolicyId( projectVersionPolicyId ); + config.setProjectNamingPolicyId( projectNamingPolicyId ); Map originalScmInfo = new HashMap(); originalScmInfo.put( ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ),