diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9c761915d..d7c9cd4e3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,6 +21,9 @@ updates: directory: "/" schedule: interval: "daily" + ignore: + # Ignore Maven Core updates + - dependency-name: "org.apache.maven:*" - package-ecosystem: "github-actions" directory: "/" schedule: diff --git a/maven-release-api/pom.xml b/maven-release-api/pom.xml index 9b833650f..1fe0f6c4a 100644 --- a/maven-release-api/pom.xml +++ b/maven-release-api/pom.xml @@ -52,6 +52,10 @@ <groupId>org.apache.maven</groupId> <artifactId>maven-settings</artifactId> </dependency> + <dependency> + <groupId>org.apache.maven.scm</groupId> + <artifactId>maven-scm-api</artifactId> + </dependency> <dependency> <groupId>org.eclipse.aether</groupId> <artifactId>aether-util</artifactId> diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java index 48ff5ac97..d265aa1cb 100644 --- a/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java +++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptor.java @@ -426,6 +426,13 @@ public interface ReleaseDescriptor */ String getProjectVersionPolicyId(); + /** + * Get the (optional) config for the VersionPolicy implementation used to calculate the project versions. + * + * @return String + */ + String getProjectVersionPolicyConfig(); + /** * Get the role-hint for the release Strategy implementation. * diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/version/VersionPolicyRequest.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/version/VersionPolicyRequest.java index 4001b8714..9c771089f 100644 --- a/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/version/VersionPolicyRequest.java +++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/policy/version/VersionPolicyRequest.java @@ -20,6 +20,8 @@ */ import org.apache.maven.artifact.repository.metadata.Metadata; +import org.apache.maven.scm.provider.ScmProvider; +import org.apache.maven.scm.repository.ScmRepository; /** * <p>VersionPolicyRequest class.</p> @@ -33,6 +35,12 @@ public class VersionPolicyRequest private Metadata metaData; + private ScmRepository scmRepository; + private ScmProvider scmProvider; + private String workingDirectory; + + private String config; + /** * <p>Getter for the field <code>version</code>.</p> * @@ -76,5 +84,93 @@ public VersionPolicyRequest setMetaData( Metadata metaData ) this.metaData = metaData; return this; } - + + /** + * <p>Getter for the field <code>scmRepository</code>.</p> + * + * @return a {@link ScmRepository} object + */ + public ScmRepository getScmRepository() + { + return scmRepository; + } + + /** + * <p>Setter for the field <code>scmRepository</code>.</p> + * + * @param scmRepository The {@link ScmRepository} where the history can be retrieved. + * @return a {@link org.apache.maven.shared.release.policy.version.VersionPolicyRequest} object + */ + public VersionPolicyRequest setScmRepository( ScmRepository scmRepository ) + { + this.scmRepository = scmRepository; + return this; + } + + /** + * <p>Getter for the field <code>scmProvider</code>.</p> + * + * @return a {@link ScmProvider} object + */ + public ScmProvider getScmProvider() + { + return scmProvider; + } + + /** + * <p>Setter for the field <code>scmProvider</code>.</p> + * + * @param scmProvider The {@link ScmProvider} where the history can be retrieved. + * @return a {@link org.apache.maven.shared.release.policy.version.VersionPolicyRequest} object + */ + public VersionPolicyRequest setScmProvider( ScmProvider scmProvider ) + { + this.scmProvider = scmProvider; + return this; + } + + /** + * <p>Getter for the field <code>workingDirectory</code>.</p> + * + * @return the {@link String} that contains the workingDirectory (can be null or empty). + */ + public String getWorkingDirectory() + { + return workingDirectory; + } + + /** + * <p>Setter for the field <code>workingDirectory</code>.</p> + * + * @param workingDirectory The {@link String} that contains the workingDirectory (can be null or empty). + * @return a {@link org.apache.maven.shared.release.policy.version.VersionPolicyRequest} object + */ + public VersionPolicyRequest setWorkingDirectory( String workingDirectory ) + { + this.workingDirectory = workingDirectory; + return this; + } + + /** + * <p>Getter for the field <code>config</code>.</p> + * + * @return the {@link String} that contains the config (can be null or empty). + */ + public String getConfig() + { + return config; + } + + /** + * <p>Setter for the field <code>config</code>.</p> + * + * @param config The {@link String} that contains the config (can be null or empty). + * @return a {@link org.apache.maven.shared.release.policy.version.VersionPolicyRequest} object + */ + public VersionPolicyRequest setConfig( String config ) + { + this.config = config; + return this; + } + } diff --git a/maven-release-api/src/main/java/org/apache/maven/shared/release/versions/VersionParseException.java b/maven-release-api/src/main/java/org/apache/maven/shared/release/versions/VersionParseException.java index 8d24cb112..010c8c4b3 100644 --- a/maven-release-api/src/main/java/org/apache/maven/shared/release/versions/VersionParseException.java +++ b/maven-release-api/src/main/java/org/apache/maven/shared/release/versions/VersionParseException.java @@ -34,4 +34,14 @@ public VersionParseException( String message ) { super( message ); } + + /** + * <p>Constructor for VersionParseException.</p> + * + * @param message a {@link java.lang.String} object + */ + public VersionParseException( String message, Exception e ) + { + super( message, e ); + } } diff --git a/maven-release-manager/pom.xml b/maven-release-manager/pom.xml index 60b10618b..b25440451 100644 --- a/maven-release-manager/pom.xml +++ b/maven-release-manager/pom.xml @@ -35,7 +35,7 @@ <dependency> <groupId>org.apache.maven.release</groupId> <artifactId>maven-release-api</artifactId> - <version>3.0.0-M6-SNAPSHOT</version> + <version>${project.version}</version> </dependency> <dependency> @@ -284,7 +284,7 @@ <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-maven-plugin</artifactId> - <version>1.3.8</version> + <version>${plexus-maven-plugin.version}</version> </plugin> </plugins> </reporting> diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java index fdacb6d2d..2a5148d62 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/PropertiesReleaseDescriptorStore.java @@ -269,6 +269,10 @@ public void write( BuilderReleaseDescriptor config, File file ) { properties.setProperty( "projectVersionPolicyId", config.getProjectVersionPolicyId() ); } + if ( config.getProjectVersionPolicyConfig() != null ) + { + properties.setProperty( "projectVersionPolicyConfig", config.getProjectVersionPolicyConfig() ); + } if ( config.getProjectNamingPolicyId() != null ) { properties.setProperty( "projectNamingPolicyId", config.getProjectNamingPolicyId() ); diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java index 6940d31da..5b81f7032 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseDescriptorBuilder.java @@ -401,6 +401,18 @@ public ReleaseDescriptorBuilder setProjectVersionPolicyId( String projectVersion return this; } + /** + * <p>setProjectVersionPolicyConfig.</p> + * + * @param setProjectVersionPolicyConfig a {@link java.lang.String} object + * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object + */ + public ReleaseDescriptorBuilder setProjectVersionPolicyConfig( String setProjectVersionPolicyConfig ) + { + releaseDescriptor.setProjectVersionPolicyConfig( setProjectVersionPolicyConfig ); + return this; + } + /** * <p>setPushChanges.</p> * 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 3847b52d0..2d24e35c2 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 @@ -156,6 +156,10 @@ public static void copyPropertiesToReleaseDescriptor( Properties properties, Rel { builder.setProjectVersionPolicyId( properties.getProperty( "projectVersionPolicyId" ) ); } + if ( properties.containsKey( "projectVersionPolicyConfig" ) ) + { + builder.setProjectVersionPolicyConfig( properties.getProperty( "projectVersionPolicyConfig" ) ); + } if ( properties.containsKey( "projectNamingPolicyId" ) ) { builder.setProjectNamingPolicyId( properties.getProperty( "projectNamingPolicyId" ) ); diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java index b75a4b1d8..a0a9ef8b3 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java @@ -27,6 +27,11 @@ import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.project.MavenProject; +import org.apache.maven.scm.manager.NoSuchScmProviderException; +import org.apache.maven.scm.provider.ScmProvider; +import org.apache.maven.scm.repository.ScmRepository; +import org.apache.maven.scm.repository.ScmRepositoryException; +import org.apache.maven.settings.Settings; import org.apache.maven.shared.release.ReleaseExecutionException; import org.apache.maven.shared.release.ReleaseResult; import org.apache.maven.shared.release.config.ReleaseDescriptor; @@ -34,8 +39,11 @@ import org.apache.maven.shared.release.policy.PolicyException; import org.apache.maven.shared.release.policy.version.VersionPolicy; import org.apache.maven.shared.release.policy.version.VersionPolicyRequest; +import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator; import org.apache.maven.shared.release.util.ReleaseUtil; import org.apache.maven.shared.release.versions.VersionParseException; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.components.interactivity.Prompter; import org.codehaus.plexus.components.interactivity.PrompterException; import org.codehaus.plexus.util.StringUtils; @@ -69,9 +77,16 @@ * @author <a href="mailto:brett@apache.org">Brett Porter</a> * @author Robert Scholte */ +@Component( role = ReleasePhase.class, hint = "map-release-versions" ) public abstract class AbstractMapVersionsPhase extends AbstractReleasePhase { + /** + * Tool that gets a configured SCM repository from release configuration. + */ + @Requirement + private ScmRepositoryConfigurator scmRepositoryConfigurator; + /** * Component used to prompt for input. */ @@ -280,14 +295,14 @@ else if ( releaseDescriptor.isBranchCreation() ) { suggestedVersion = resolveSuggestedVersion( baseVersion, - releaseDescriptor.getProjectVersionPolicyId() ); + releaseDescriptor ); } catch ( VersionParseException e ) { if ( releaseDescriptor.isInteractive() ) { suggestedVersion = - resolveSuggestedVersion( "1.0", releaseDescriptor.getProjectVersionPolicyId() ); + resolveSuggestedVersion( "1.0", releaseDescriptor ); } else { @@ -336,9 +351,10 @@ else if ( convertToSnapshot ) return nextVersion; } - private String resolveSuggestedVersion( String baseVersion, String policyId ) + private String resolveSuggestedVersion( String baseVersion, ReleaseDescriptor releaseDescriptor ) throws PolicyException, VersionParseException { + String policyId = releaseDescriptor.getProjectVersionPolicyId(); VersionPolicy policy = versionPolicies.get( policyId ); if ( policy == null ) { @@ -346,6 +362,28 @@ private String resolveSuggestedVersion( String baseVersion, String policyId ) } VersionPolicyRequest request = new VersionPolicyRequest().setVersion( baseVersion ); + + request.setConfig( releaseDescriptor.getProjectVersionPolicyConfig() ); + request.setWorkingDirectory( releaseDescriptor.getWorkingDirectory() ); + + if ( scmRepositoryConfigurator != null && releaseDescriptor.getScmSourceUrl() != null ) + { + try + { + ScmRepository repository = scmRepositoryConfigurator + .getConfiguredRepository( releaseDescriptor, new Settings() ); + + ScmProvider provider = scmRepositoryConfigurator + .getRepositoryProvider( repository ); + + request.setScmRepository( repository ); + request.setScmProvider( provider ); + } + catch ( ScmRepositoryException | NoSuchScmProviderException e ) + { + getLogger().warn( "Next Version will NOT be based on the version control: " + e.getMessage() ); + } + } return convertToSnapshot ? policy.getDevelopmentVersion( request ).getVersion() : policy.getReleaseVersion( request ).getVersion(); } diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java index ec45e7883..67d4aed6f 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java @@ -20,8 +20,10 @@ */ import java.io.File; +import java.util.List; import java.util.Map; +import org.apache.maven.project.MavenProject; import org.apache.maven.shared.release.ReleaseExecutionException; import org.apache.maven.shared.release.ReleaseResult; import org.apache.maven.shared.release.config.ReleaseDescriptor; @@ -51,7 +53,15 @@ protected AbstractRunGoalsPhase( Map<String, MavenExecutor> mavenExecutors ) } protected ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, - File workingDirectory, String additionalArguments ) + List<MavenProject> reactorProjects, boolean logArguments ) + throws ReleaseExecutionException + { + return execute( releaseDescriptor, releaseEnvironment, new File( releaseDescriptor.getWorkingDirectory() ), + getAdditionalArguments( releaseDescriptor ), logArguments ); + } + + protected ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, + File workingDirectory, String additionalArguments, boolean logArguments ) throws ReleaseExecutionException { ReleaseResult result = new ReleaseResult(); @@ -62,7 +72,11 @@ protected ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnv if ( !StringUtils.isEmpty( goals ) ) { logInfo( result, "Executing goals '" + goals + "'..." ); - // TODO add additionalArguments? + if ( logArguments && ( additionalArguments != null ) ) + { + // logging arguments may log secrets: should be activated only on dryRun + logInfo( result, " with additional arguments: " + additionalArguments ); + } MavenExecutor mavenExecutor = mavenExecutors.get( releaseEnvironment.getMavenExecutorId() ); diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java index 6d9051dd4..db481d7a9 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunCompleteGoalsPhase.java @@ -23,7 +23,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import java.io.File; import java.util.List; import java.util.Map; @@ -56,8 +55,7 @@ public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnviro List<MavenProject> reactorProjects ) throws ReleaseExecutionException { - return execute( releaseDescriptor, releaseEnvironment, new File( releaseDescriptor.getWorkingDirectory() ), - getAdditionalArguments( releaseDescriptor ) ); + return execute( releaseDescriptor, releaseEnvironment, reactorProjects, false ); } @Override @@ -70,7 +68,7 @@ public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvir logInfo( result, "Executing completion goals - since this is simulation mode it is running against the " + "original project, not the rewritten ones" ); - execute( releaseDescriptor, releaseEnvironment, reactorProjects ); + execute( releaseDescriptor, releaseEnvironment, reactorProjects, true ); return result; } diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java index 40cc1febc..4c0087883 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java @@ -99,11 +99,9 @@ private ReleaseResult runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvi { ReleaseResult result = new ReleaseResult(); - logDebug( result, "Additional arguments: " + additionalArguments ); - // TODO switch to Info? - - logInfo( result, "Executing perform goals '" + getGoals( releaseDescriptor ) + logInfo( result, "Simulating perform goals '" + getGoals( releaseDescriptor ) + "' - since this is simulation mode these goals are skipped." ); + logInfo( result, " with additional arguments: " + additionalArguments ); return result; } @@ -140,7 +138,7 @@ private ReleaseResult runLogic( ReleaseDescriptor releaseDescriptor, ReleaseEnvi } } - return execute( releaseDescriptor, releaseEnvironment, workDirectory, additionalArguments ); + return execute( releaseDescriptor, releaseEnvironment, workDirectory, additionalArguments, false ); } @Override diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java index a208c3e99..fa646ea39 100644 --- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java +++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPrepareGoalsPhase.java @@ -23,7 +23,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import java.io.File; import java.util.List; import java.util.Map; @@ -55,8 +54,7 @@ public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnviro List<MavenProject> reactorProjects ) throws ReleaseExecutionException { - return execute( releaseDescriptor, releaseEnvironment, new File( releaseDescriptor.getWorkingDirectory() ), - getAdditionalArguments( releaseDescriptor ) ); + return execute( releaseDescriptor, releaseEnvironment, reactorProjects, false ); } @Override @@ -69,7 +67,7 @@ public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvir logInfo( result, "Executing preparation goals - since this is simulation mode it is running against the " + "original project, not the rewritten ones" ); - execute( releaseDescriptor, releaseEnvironment, reactorProjects ); + execute( releaseDescriptor, releaseEnvironment, reactorProjects, true ); return result; } diff --git a/maven-release-manager/src/main/mdo/release-descriptor.mdo b/maven-release-manager/src/main/mdo/release-descriptor.mdo index 871637ace..f16b1993a 100644 --- a/maven-release-manager/src/main/mdo/release-descriptor.mdo +++ b/maven-release-manager/src/main/mdo/release-descriptor.mdo @@ -488,6 +488,15 @@ The role-hint for the VersionPolicy implementation used to calculate the project versions. </description> </field> + <field> + <name>projectVersionPolicyConfig</name> + <version>3.0.0+</version> + <type>String</type> + <description> + The optional config string for the VersionPolicy implementation used to calculate the project versions. + The format of this string depends on the specific VersionPolicy that is used. + </description> + </field> <field> <name>projectNamingPolicyId</name> <version>3.0.0+</version> diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java index be529f413..a4cca42e8 100644 --- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java +++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/AbstractReleaseTestCase.java @@ -38,7 +38,6 @@ import java.util.Map; import java.util.Objects; -import org.apache.commons.lang.SystemUtils; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; @@ -84,7 +83,7 @@ public abstract class AbstractReleaseTestCase protected ProjectBuilder projectBuilder; protected ArtifactRepository localRepository; - + private ArtifactFactory artifactFactory; protected ReleasePhase phase; @@ -96,7 +95,7 @@ public void setUp() super.setUp(); projectBuilder = lookup( ProjectBuilder.class ); - artifactFactory = lookup( ArtifactFactory.class ); + artifactFactory = lookup( ArtifactFactory.class ); ArtifactRepositoryLayout layout = lookup( ArtifactRepositoryLayout.class, "default" ); String localRepoPath = getTestFile( "target/local-repository" ).getAbsolutePath().replace( '\\', '/' ); @@ -113,7 +112,7 @@ protected List<MavenProject> createReactorProjects( String path, String subpath { return createReactorProjects( path, path, subpath ); } - + protected ReleaseDescriptorBuilder createReleaseDescriptorBuilder( List<MavenProject> reactorProjects ) { ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder(); @@ -305,7 +304,7 @@ protected void comparePomFiles( File expectedFile, File actualFile, boolean norm throws IOException { StringBuffer sb = new StringBuffer( "Check the transformed POM " + actualFile ); - sb.append( SystemUtils.LINE_SEPARATOR ); + sb.append( System.lineSeparator() ); final String remoteRepositoryURL = getRemoteRepositoryURL(); diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java index ba500676f..f040bac22 100644 --- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java +++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java @@ -151,7 +151,7 @@ public void testCommitAlternateMessage() Collections.singletonList( new ScmFile( rootProject.getFile().getPath(), ScmFileStatus.CHECKED_IN ) ) ) ); - ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE ); + ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class ); stub.setScmProvider( scmProviderMock ); // execute @@ -264,7 +264,7 @@ public void testCommitDevelopmentAlternateMessage() Collections.singletonList( new ScmFile( rootProject.getFile().getPath(), ScmFileStatus.CHECKED_IN ) ) ) ); - ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE ); + ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class ); stub.setScmProvider( scmProviderMock ); // execute @@ -548,4 +548,4 @@ private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder() builder.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() ); return builder; } -} \ No newline at end of file +} diff --git a/maven-release-manager/src/test/resources/pomfinder/pom1.xml b/maven-release-manager/src/test/resources/pomfinder/pom1.xml index e4c16d445..596b5c505 100644 --- a/maven-release-manager/src/test/resources/pomfinder/pom1.xml +++ b/maven-release-manager/src/test/resources/pomfinder/pom1.xml @@ -122,7 +122,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.2</version> + <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> @@ -193,7 +193,7 @@ <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-maven-plugin</artifactId> - <version>1.3.8</version> + <version>@plexus-maven-plugin.version@</version> <executions> <execution> <id>create-component-descriptor</id> diff --git a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/expected-release-pom.xml b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/expected-release-pom.xml index 84659e29e..c3fb2debd 100644 --- a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/expected-release-pom.xml +++ b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/expected-release-pom.xml @@ -67,7 +67,7 @@ under the License. <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-dependencies/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/expected-release-pom.xml b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/expected-release-pom.xml index 84659e29e..c3fb2debd 100644 --- a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/expected-release-pom.xml +++ b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/expected-release-pom.xml @@ -67,7 +67,7 @@ under the License. <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/generate-release-poms/internal-snapshot-extension/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/expected-release-pom.xml b/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/expected-release-pom.xml index 84659e29e..c3fb2debd 100644 --- a/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/expected-release-pom.xml +++ b/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/expected-release-pom.xml @@ -67,7 +67,7 @@ under the License. <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/pom.xml index fe46ed579..240c04985 100644 --- a/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/generate-release-poms/pom-with-namespace/subproject1/pom.xml @@ -29,7 +29,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/expected-pom.xml index 53c4eed8e..71b5fdbc6 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/expected-pom.xml @@ -92,7 +92,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-invoker-plugin</artifactId> - <version>1.2</version> + <version>${maven-invoker-plugin.version}</version> <configuration> <projectsDirectory>src/it</projectsDirectory> <pomIncludes> @@ -125,32 +125,6 @@ </execution> </executions> </plugin> - <!-- TODO: Remove this plugin execution once MINVOKER-43 is released --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-install-plugin</artifactId> - <executions> - <execution> - <id>it-preparation</id> - <phase>pre-integration-test</phase> - <goals> - <goal>install-file</goal> - </goals> - <configuration> - <file>${project.build.directory}/${project.build.finalName}.jar</file> - <groupId>${project.groupId}</groupId> - <artifactId>${project.artifactId}</artifactId> - <version>${project.version}</version> - <packaging>${project.packaging}</packaging> - <pomFile>${basedir}/pom.xml</pomFile> - <createChecksum>true</createChecksum> - <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath> - <!-- NOTE: must match identifier of real local repository or metadata lookup during ITs will misbehave --> - <localRepositoryId>local</localRepositoryId> - </configuration> - </execution> - </executions> - </plugin> </plugins> </build> </profile> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/pom.xml index b85fbbed9..d2a192a3b 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/basic-pom-namespace/pom.xml @@ -94,7 +94,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-invoker-plugin</artifactId> - <version>1.2</version> + <version>${maven-invoker-plugin.version}</version> <configuration> <projectsDirectory>src/it</projectsDirectory> <pomIncludes> @@ -127,32 +127,6 @@ </execution> </executions> </plugin> - <!-- TODO: Remove this plugin execution once MINVOKER-43 is released --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-install-plugin</artifactId> - <executions> - <execution> - <id>it-preparation</id> - <phase>pre-integration-test</phase> - <goals> - <goal>install-file</goal> - </goals> - <configuration> - <file>${project.build.directory}/${project.build.finalName}.jar</file> - <groupId>${project.groupId}</groupId> - <artifactId>${project.artifactId}</artifactId> - <version>${project.version}</version> - <packaging>${project.packaging}</packaging> - <pomFile>${basedir}/pom.xml</pomFile> - <createChecksum>true</createChecksum> - <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath> - <!-- NOTE: must match identifier of real local repository or metadata lookup during ITs will misbehave --> - <localRepositoryId>local</localRepositoryId> - </configuration> - </execution> - </executions> - </plugin> </plugins> </build> </profile> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/expected-pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-dependencies/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/expected-pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/internal-snapshot-extension/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/expected-pom.xml index e7527c36f..aae9a8339 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/pom.xml index fe46ed579..240c04985 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-branch/pom-with-namespace/subproject1/pom.xml @@ -29,7 +29,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/expected-pom.xml index b2cc4e3ff..ef7f396a2 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/pom.xml index ca188f0c5..edf62b7ff 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies-without-dependencies-version-update/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/expected-pom.xml index b2cc4e3ff..ef7f396a2 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/pom.xml index ca188f0c5..edf62b7ff 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-dependencies/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/expected-pom.xml index b2cc4e3ff..ef7f396a2 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/pom.xml index ca188f0c5..edf62b7ff 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/internal-snapshot-extension/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/expected-pom.xml index ce6629d01..2882e78be 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/pom.xml index f847350fe..bd6195d50 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-development/pom-with-namespace/subproject1/pom.xml @@ -29,7 +29,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/expected-pom.xml index 9da9aa3a6..5b1a2d141 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/expected-pom.xml @@ -92,7 +92,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-invoker-plugin</artifactId> - <version>1.2</version> + <version>${maven-invoker-plugin.version}</version> <configuration> <projectsDirectory>src/it</projectsDirectory> <pomIncludes> @@ -125,32 +125,6 @@ </execution> </executions> </plugin> - <!-- TODO: Remove this plugin execution once MINVOKER-43 is released --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-install-plugin</artifactId> - <executions> - <execution> - <id>it-preparation</id> - <phase>pre-integration-test</phase> - <goals> - <goal>install-file</goal> - </goals> - <configuration> - <file>${project.build.directory}/${project.build.finalName}.jar</file> - <groupId>${project.groupId}</groupId> - <artifactId>${project.artifactId}</artifactId> - <version>${project.version}</version> - <packaging>${project.packaging}</packaging> - <pomFile>${basedir}/pom.xml</pomFile> - <createChecksum>true</createChecksum> - <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath> - <!-- NOTE: must match identifier of real local repository or metadata lookup during ITs will misbehave --> - <localRepositoryId>local</localRepositoryId> - </configuration> - </execution> - </executions> - </plugin> </plugins> </build> </profile> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/pom.xml index b85fbbed9..d2a192a3b 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/basic-pom-namespace/pom.xml @@ -94,7 +94,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-invoker-plugin</artifactId> - <version>1.2</version> + <version>${maven-invoker-plugin.version}</version> <configuration> <projectsDirectory>src/it</projectsDirectory> <pomIncludes> @@ -127,32 +127,6 @@ </execution> </executions> </plugin> - <!-- TODO: Remove this plugin execution once MINVOKER-43 is released --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-install-plugin</artifactId> - <executions> - <execution> - <id>it-preparation</id> - <phase>pre-integration-test</phase> - <goals> - <goal>install-file</goal> - </goals> - <configuration> - <file>${project.build.directory}/${project.build.finalName}.jar</file> - <groupId>${project.groupId}</groupId> - <artifactId>${project.artifactId}</artifactId> - <version>${project.version}</version> - <packaging>${project.packaging}</packaging> - <pomFile>${basedir}/pom.xml</pomFile> - <createChecksum>true</createChecksum> - <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath> - <!-- NOTE: must match identifier of real local repository or metadata lookup during ITs will misbehave --> - <localRepositoryId>local</localRepositoryId> - </configuration> - </execution> - </executions> - </plugin> </plugins> </build> </profile> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/expected-pom.xml index ca188f0c5..edf62b7ff 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-dependencies/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/expected-pom.xml index ca188f0c5..edf62b7ff 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/pom.xml index 8e2e0791d..e600f8c10 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/internal-snapshot-extension/subproject1/pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/expected-pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/expected-pom.xml index 36944d8f8..882256243 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/expected-pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/expected-pom.xml @@ -28,7 +28,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/pom.xml b/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/pom.xml index fe46ed579..240c04985 100644 --- a/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/pom.xml +++ b/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-namespace/subproject1/pom.xml @@ -29,7 +29,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/pom.xml b/maven-release-plugin/pom.xml index 7e8a7174f..af4a89779 100644 --- a/maven-release-plugin/pom.xml +++ b/maven-release-plugin/pom.xml @@ -42,7 +42,7 @@ <dependency> <groupId>org.apache.maven.release</groupId> <artifactId>maven-release-manager</artifactId> - <version>3.0.0-M6-SNAPSHOT</version> + <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> @@ -81,13 +81,19 @@ <dependency> <groupId>org.apache.maven.release</groupId> <artifactId>maven-release-oddeven-policy</artifactId> - <version>3.0.0-M6-SNAPSHOT</version> + <version>${project.version}</version> <optional>true</optional> </dependency> <dependency> <groupId>org.apache.maven.release</groupId> <artifactId>maven-release-semver-policy</artifactId> - <version>3.0.0-M6-SNAPSHOT</version> + <version>${project.version}</version> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.apache.maven.release</groupId> + <artifactId>maven-release-ccsemver-policy</artifactId> + <version>${project.version}</version> <optional>true</optional> </dependency> @@ -109,7 +115,7 @@ <dependency> <groupId>org.apache.maven.plugin-testing</groupId> <artifactId>maven-plugin-testing-harness</artifactId> - <version>3.3.0</version> + <version>${maven-plugin-testing-harness.version}</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/branch/MRELEASE-458/pom.xml b/maven-release-plugin/src/it/projects/branch/MRELEASE-458/pom.xml index 46954b51c..9ac637fb5 100644 --- a/maven-release-plugin/src/it/projects/branch/MRELEASE-458/pom.xml +++ b/maven-release-plugin/src/it/projects/branch/MRELEASE-458/pom.xml @@ -49,7 +49,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/branch/MRELEASE-694/pom.xml b/maven-release-plugin/src/it/projects/branch/MRELEASE-694/pom.xml index e84c5ea17..96886a6b8 100644 --- a/maven-release-plugin/src/it/projects/branch/MRELEASE-694/pom.xml +++ b/maven-release-plugin/src/it/projects/branch/MRELEASE-694/pom.xml @@ -54,7 +54,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>2.4.2</version> + <version>@project.version@</version> <configuration> <autoVersionSubmodules>true</autoVersionSubmodules> <updateBranchVersions>true</updateBranchVersions> diff --git a/maven-release-plugin/src/it/projects/perform/MRELEASE-459/pom.xml b/maven-release-plugin/src/it/projects/perform/MRELEASE-459/pom.xml index 06c2cb264..a11d00245 100644 --- a/maven-release-plugin/src/it/projects/perform/MRELEASE-459/pom.xml +++ b/maven-release-plugin/src/it/projects/perform/MRELEASE-459/pom.xml @@ -21,7 +21,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.apache.maven.plugin.release.its</groupId> - <artifactId>mrelease-759</artifactId> + <artifactId>mrelease-459</artifactId> <version>1.0-SNAPSHOT</version> <scm> diff --git a/maven-release-plugin/src/it/projects/perform/MRELEASE-459/verify.groovy b/maven-release-plugin/src/it/projects/perform/MRELEASE-459/verify.groovy index b6a4bbf3b..7f09bf2fa 100644 --- a/maven-release-plugin/src/it/projects/perform/MRELEASE-459/verify.groovy +++ b/maven-release-plugin/src/it/projects/perform/MRELEASE-459/verify.groovy @@ -20,11 +20,11 @@ File buildLog = new File( basedir, 'build.log' ) assert buildLog.exists() -def addArgsExpr = /\Q[DEBUG] Additional arguments: \E(?:-Dhttps.protocols=TLSv1.2 )?-P(.+)\Q-DperformRelease=true -f pom.xml\E/ +def addArgsExpr = /\Q[INFO] with additional arguments: \E(?:-Dhttps.protocols=TLSv1.2 )?-P(.+)\Q-DperformRelease=true -f pom.xml\E/ def matcher = ( buildLog.getText() =~ addArgsExpr ) -// M2: [DEBUG] Additional arguments: -P custom-release -DperformRelease=true -f pom.xml -// M3: [DEBUG] Additional arguments: -P it-repo,it-repo,custom-release -DperformRelease=true -f pom.xml +// M2: [INFO] with additional arguments: -P custom-release -DperformRelease=true -f pom.xml +// M3: [INFO] with additional arguments: -P it-repo,it-repo,custom-release -DperformRelease=true -f pom.xml assert matcher.find() assert matcher.getCount() == 1 diff --git a/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-a/pom.xml b/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-a/pom.xml index 522ad946c..5aa9413ca 100644 --- a/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-a/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-a/pom.xml @@ -32,7 +32,7 @@ under the License. <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-parent/pom.xml b/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-parent/pom.xml index 9d7f7438d..4a4f49492 100644 --- a/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-parent/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/MRELEASE-1053/module-parent/pom.xml @@ -52,7 +52,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/ccsemver-policy/pom.xml b/maven-release-plugin/src/it/projects/prepare/ccsemver-policy/pom.xml new file mode 100644 index 000000000..5384a26a1 --- /dev/null +++ b/maven-release-plugin/src/it/projects/prepare/ccsemver-policy/pom.xml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.maven.plugin.release.it</groupId> + <artifactId>ccsemver-policy</artifactId> + <version>1.0-SNAPSHOT</version> + <scm> + <connection>scm:dummytags|nul</connection> + <developerConnection>scm:dummytags|nul</developerConnection> + </scm> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-release-plugin</artifactId> + <version>@project.version@</version> + <configuration> + <allowReleasePluginSnapshot>true</allowReleasePluginSnapshot> + <allowTimestampedSnapshots>true</allowTimestampedSnapshots> + <pushChanges>false</pushChanges> + <remoteTagging>false</remoteTagging> + + <scmCommentPrefix>ci(Release): </scmCommentPrefix> + <scmReleaseCommitComment>ci(Release): Version @{releaseLabel}</scmReleaseCommitComment> + <tagNameFormat>v@{project.version}</tagNameFormat> + + <projectVersionPolicyId>CCSemVerVersionPolicy</projectVersionPolicyId> + + <!-- projectVersionPolicyConfig is an XML structure: --> + <!-- versionTag: A regex with 1 capture group that MUST extract the project.version from the SCM tag. --> + <!-- minorRules: A list regexes that will be matched against all lines in each commit message since --> + <!-- the last tag. If matched the next version is at least a MINOR update. --> + <!-- majorRules: A list regexes that will be matched against all lines in each commit message since --> + <!-- the last tag. If matched the next version is at least a MAJOR update. --> + <!-- If a match is found the commit will trigger either a minor or major version increase --> + <!-- instead of only a patch increase. --> + <projectVersionPolicyConfig> + <![CDATA[ + <cCSemverConfig> + <versionTag>^v([0-9]+(?:\.[0-9]+(?:\.[0-9]+)?)?)$</versionTag> + <majorRules> + <majorRule>^[a-zA-Z]+!(?:\([a-zA-Z0-9_-]+\))?: .*$</majorRule> + <majorRule>^BREAKING CHANGE:.*$</majorRule> + </majorRules> + <minorRules> + <minorRule>^feat(?:\([a-zA-Z0-9_-]+\))?: .*$</minorRule> + </minorRules> + </cCSemverConfig> + ]]> + </projectVersionPolicyConfig> + + </configuration> + <dependencies> + <dependency> + <groupId>org.apache.maven.its.release</groupId> + <artifactId>maven-scm-provider-dummy</artifactId> + <version>1.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven.release</groupId> + <artifactId>maven-release-ccsemver-policy</artifactId> + <version>@project.version@</version> + </dependency> + </dependencies> + </plugin> + </plugins> + </build> +</project> diff --git a/maven-release-plugin/src/it/projects/prepare/ccsemver-policy/verify.groovy b/maven-release-plugin/src/it/projects/prepare/ccsemver-policy/verify.groovy new file mode 100644 index 000000000..476b00fec --- /dev/null +++ b/maven-release-plugin/src/it/projects/prepare/ccsemver-policy/verify.groovy @@ -0,0 +1,39 @@ + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +File buildLog = new File( basedir, 'build.log' ) +assert buildLog.exists() +assert 1 == buildLog.getText().count("[INFO] From SCM tag with version 1.2.3 doing a MINOR version increase based on commit messages to version 1.3.0") +assert 1 == buildLog.getText().count("[INFO] Full run would be commit 1 files with message: 'ci(Release): Version v1.3.0'") + +// The pom based version is NOT related to what the actual version will be. +File pomXml = new File( basedir, 'pom.xml' ) +assert pomXml.exists() +assert new XmlSlurper().parse( pomXml ).version.text() == "1.0-SNAPSHOT" + +// The actual version is based upon the tags and commit messages. +File pomXmlTag = new File( basedir, 'pom.xml.tag' ) +assert pomXmlTag.exists() +assert new XmlSlurper().parse( pomXmlTag ).version.text() == "1.3.0" + +// The next development version should be standard +File pomXmlNext = new File( basedir, 'pom.xml.next' ) +assert pomXmlNext.exists() +assert new XmlSlurper().parse( pomXmlNext ).version.text() == "1.3.1-SNAPSHOT" diff --git a/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-a/pom.xml b/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-a/pom.xml index 061222fcf..b39c1d020 100644 --- a/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-a/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-a/pom.xml @@ -34,7 +34,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-b/pom.xml b/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-b/pom.xml index 81563eab0..aea806962 100644 --- a/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-b/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/flat-multi-module/module-b/pom.xml @@ -34,7 +34,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/flat-multi-module/parent-project/pom.xml b/maven-release-plugin/src/it/projects/prepare/flat-multi-module/parent-project/pom.xml index 8c27df667..b13e86a37 100644 --- a/maven-release-plugin/src/it/projects/prepare/flat-multi-module/parent-project/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/flat-multi-module/parent-project/pom.xml @@ -51,7 +51,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-a/pom.xml b/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-a/pom.xml index fa942cb22..23881d890 100644 --- a/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-a/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-a/pom.xml @@ -33,7 +33,7 @@ under the License. <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-b/pom.xml b/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-b/pom.xml index eafd261c4..38df9354b 100644 --- a/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-b/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/regular-multi-module/module-b/pom.xml @@ -33,7 +33,7 @@ under the License. <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/regular-multi-module/pom.xml b/maven-release-plugin/src/it/projects/prepare/regular-multi-module/pom.xml index 083c8df6a..be9cb9578 100644 --- a/maven-release-plugin/src/it/projects/prepare/regular-multi-module/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/regular-multi-module/pom.xml @@ -51,7 +51,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>3.8.1</version> + <version>@junit.version@</version> <scope>test</scope> </dependency> </dependencies> diff --git a/maven-release-plugin/src/it/projects/prepare/semver-policy/pom.xml b/maven-release-plugin/src/it/projects/prepare/semver-policy/pom.xml index df9eec731..53059f7ab 100644 --- a/maven-release-plugin/src/it/projects/prepare/semver-policy/pom.xml +++ b/maven-release-plugin/src/it/projects/prepare/semver-policy/pom.xml @@ -21,7 +21,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.maven.plugin.release.it</groupId> - <artifactId>oddversion-policy</artifactId> + <artifactId>semver-policy</artifactId> <version>1.0-SNAPSHOT</version> <scm> <connection>scm:dummy|nul</connection> diff --git a/maven-release-plugin/src/it/setup/maven-project-naming-stub-policy/pom.xml b/maven-release-plugin/src/it/setup/maven-project-naming-stub-policy/pom.xml index 5a5a96edb..202e58e36 100644 --- a/maven-release-plugin/src/it/setup/maven-project-naming-stub-policy/pom.xml +++ b/maven-release-plugin/src/it/setup/maven-project-naming-stub-policy/pom.xml @@ -38,7 +38,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>2.0.2</version> + <version>@maven-compiler-plugin.version@</version> <configuration> <encoding>UTF-8</encoding> </configuration> @@ -46,7 +46,7 @@ <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-component-metadata</artifactId> - <version>1.7.1</version> + <version>@plexus-component-metadata.version@</version> <executions> <execution> <id>process-classes</id> diff --git a/maven-release-plugin/src/it/setup/maven-project-version-stub-policy/pom.xml b/maven-release-plugin/src/it/setup/maven-project-version-stub-policy/pom.xml index 9d3852782..0adfb8adf 100644 --- a/maven-release-plugin/src/it/setup/maven-project-version-stub-policy/pom.xml +++ b/maven-release-plugin/src/it/setup/maven-project-version-stub-policy/pom.xml @@ -43,7 +43,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>2.0.2</version> + <version>@maven-compiler-plugin.version@</version> <configuration> <encoding>UTF-8</encoding> </configuration> @@ -51,7 +51,7 @@ <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-component-metadata</artifactId> - <version>1.7.1</version> + <version>@plexus-component-metadata.version@</version> <executions> <execution> <id>process-classes</id> diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-dummy/pom.xml b/maven-release-plugin/src/it/setup/maven-scm-provider-dummy/pom.xml index 9cfbe221f..cef28e667 100644 --- a/maven-release-plugin/src/it/setup/maven-scm-provider-dummy/pom.xml +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-dummy/pom.xml @@ -32,7 +32,7 @@ <dependency> <groupId>org.apache.maven.scm</groupId> <artifactId>maven-scm-api</artifactId> - <version>1.1</version> + <version>@scmVersion@</version> </dependency> </dependencies> @@ -41,7 +41,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>2.0.2</version> + <version>@maven-compiler-plugin.version@</version> <configuration> <encoding>UTF-8</encoding> </configuration> @@ -49,7 +49,7 @@ <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-maven-plugin</artifactId> - <version>1.3.8</version> + <version>@plexus-maven-plugin.version@</version> <executions> <execution> <goals> diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-dummy/src/main/java/org/apache/maven/scm/provider/dummy/DummyTagsScmProvider.java b/maven-release-plugin/src/it/setup/maven-scm-provider-dummy/src/main/java/org/apache/maven/scm/provider/dummy/DummyTagsScmProvider.java new file mode 100644 index 000000000..ccae94a12 --- /dev/null +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-dummy/src/main/java/org/apache/maven/scm/provider/dummy/DummyTagsScmProvider.java @@ -0,0 +1,110 @@ +package org.apache.maven.scm.provider.dummy; + +/* + * 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.scm.ChangeSet; +import org.apache.maven.scm.CommandParameters; +import org.apache.maven.scm.ScmFileSet; +import org.apache.maven.scm.ScmResult; +import org.apache.maven.scm.command.changelog.ChangeLogScmRequest; +import org.apache.maven.scm.command.changelog.ChangeLogScmResult; +import org.apache.maven.scm.command.changelog.ChangeLogSet; +import org.apache.maven.scm.command.status.StatusScmResult; +import org.apache.maven.scm.provider.AbstractScmProvider; +import org.apache.maven.scm.provider.ScmProviderRepository; + +import java.util.Arrays; +import java.util.Date; + +/** + * A dummy SCM provider used to provide commit messages and tags for testing the Conventional Commits Version Policy. + * + * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="dummytags" + * @author Niels Basjes + */ +public class DummyTagsScmProvider + extends AbstractScmProvider +{ + + public String getScmType() + { + return "dummytags"; + } + + public ScmProviderRepository makeProviderScmRepository( String scmSpecificUrl, char delimiter ) + { + return new DummyScmProviderRepository(); + } + + @Override + protected StatusScmResult status( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) + { + return new StatusScmResult( "", "", "", true ); + } + + private ChangeSet changeSet(String comment, String... tags) + { + ChangeSet changeSet = new ChangeSet(); + changeSet.setComment( comment ); + changeSet.setAuthor( "Someone <someone@example.nl>" ); + changeSet.setTags( Arrays.asList( tags ) ); + return changeSet; + } + + @Override + public ChangeLogScmResult changeLog(ChangeLogScmRequest request) + { + Date from = new Date( 39817800000L ); + Date to = new Date( 1644768534785L ); + ChangeLogSet changeLogSet = new ChangeLogSet( + Arrays.asList( + changeSet( "Commit 19" ), + changeSet( "Commit 18" ), + changeSet( "Commit 17" ), + changeSet( "Commit 16" ), + changeSet( "Commit 15", "tag 1", "tag 2" ), + changeSet( "feat(it): This is a new feature." ), // For Conventional Commits. + changeSet( "Commit 13" ), + changeSet( "Commit 12", "tag 3" ), + changeSet( "Commit 11" ), + changeSet( "Commit 10" ), + changeSet( "Commit 9" ), + changeSet( "Commit 8" ), + changeSet( "Commit 7" ), + changeSet( "Commit 6", "tag 4" ), + changeSet( "Commit 5" ), + changeSet( "Commit 4" ), + changeSet( "Commit 3" ), + changeSet( "Commit 2", "v1.2.3" ), // For Conventional Commits. + changeSet( "Commit 1" ), + changeSet( "Commit 0" ) + ), from, to + ); + + ScmResult scmResult = new ScmResult( + "No command", + "Special for CCSemVer testing", + "No command output", + true + ); + return new ChangeLogScmResult( changeLogSet, scmResult ); + } + +} diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/pom.xml b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/pom.xml index 26cef6f39..d6039ae48 100644 --- a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/pom.xml +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/pom.xml @@ -34,7 +34,7 @@ <dependency> <groupId>org.apache.maven.scm</groupId> <artifactId>maven-scm-api</artifactId> - <version>1.1</version> + <version>@scmVersion@</version> </dependency> </dependencies> @@ -43,7 +43,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>2.0.2</version> + <version>@maven-compiler-plugin.version@</version> <configuration> <encoding>UTF-8</encoding> </configuration> @@ -51,7 +51,7 @@ <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-maven-plugin</artifactId> - <version>1.3.8</version> + <version>@plexus-maven-plugin.version@</version> <executions> <execution> <goals> diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckInCommand.java b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckInCommand.java index 22c6d8af3..ec4456e07 100644 --- a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckInCommand.java +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckInCommand.java @@ -35,6 +35,8 @@ import org.apache.maven.scm.command.checkin.CheckInScmResult; import org.apache.maven.scm.provider.ScmProviderRepository; import org.codehaus.plexus.util.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A dummy check-in command. @@ -44,6 +46,7 @@ class StubCheckInCommand extends AbstractCommand { + private static final Logger logger = LoggerFactory.getLogger( StubCheckInCommand.class ); protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) @@ -58,7 +61,7 @@ protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet File workingCopyRoot = stubRepo.getWorkingCopyRoot( fileSet ); File repoRoot = stubRepo.getRoot(); - getLogger().info( "Committing: " + workingCopyRoot + " > " + repoRoot ); + logger.info( "Committing: " + workingCopyRoot + " > " + repoRoot ); List paths = stubRepo.getPaths( workingCopyRoot, fileSet ); @@ -68,7 +71,7 @@ protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet File srcFile = new File( workingCopyRoot, path ); File dstFile = new File( repoRoot, path ); - getLogger().info( " " + path ); + logger.info( " " + path ); if ( dstFile.isDirectory() ) { diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckOutCommand.java b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckOutCommand.java index 9296f4f4a..2c2e74385 100644 --- a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckOutCommand.java +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubCheckOutCommand.java @@ -39,6 +39,8 @@ import org.apache.maven.scm.command.checkout.CheckOutScmResult; import org.apache.maven.scm.provider.ScmProviderRepository; import org.codehaus.plexus.util.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A dummy check-out command. @@ -48,6 +50,7 @@ class StubCheckOutCommand extends AbstractCommand { + private static final Logger logger = LoggerFactory.getLogger( StubCheckOutCommand.class ); protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) @@ -75,7 +78,7 @@ else if ( version instanceof ScmBranch ) revRoot = stubRepo.getRoot(); } - getLogger().info( "Checking out: " + revRoot + " > " + workingCopyRoot ); + logger.info( "Checking out: " + revRoot + " > " + workingCopyRoot ); if ( workingCopyRoot.isFile() ) { @@ -100,7 +103,7 @@ else if ( version instanceof ScmBranch ) File srcFile = new File( revRoot, path ); File dstFile = new File( workingCopyRoot, path ); - getLogger().info( " " + path ); + logger.info( " " + path ); if ( srcFile.isDirectory() ) { diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubScmProvider.java b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubScmProvider.java index b9172ec97..7c858a4d0 100644 --- a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubScmProvider.java +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubScmProvider.java @@ -58,8 +58,6 @@ protected ScmResult executeCommand( Command command, ScmProviderRepository repos CommandParameters parameters ) throws ScmException { - command.setLogger( getLogger() ); - return command.execute( repository, fileSet, parameters ); } diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubStatusCommand.java b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubStatusCommand.java index a682d844c..9ef66e5be 100644 --- a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubStatusCommand.java +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubStatusCommand.java @@ -29,6 +29,8 @@ import org.apache.maven.scm.command.AbstractCommand; import org.apache.maven.scm.command.status.StatusScmResult; import org.apache.maven.scm.provider.ScmProviderRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A dummy status command. @@ -38,6 +40,7 @@ class StubStatusCommand extends AbstractCommand { + private static final Logger logger = LoggerFactory.getLogger( StubStatusCommand.class ); protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) diff --git a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubTagCommand.java b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubTagCommand.java index 537e026a4..6137b5266 100644 --- a/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubTagCommand.java +++ b/maven-release-plugin/src/it/setup/maven-scm-provider-stub/src/main/java/org/apache/maven/scm/provider/stub/StubTagCommand.java @@ -36,6 +36,8 @@ import org.apache.maven.scm.command.tag.TagScmResult; import org.apache.maven.scm.provider.ScmProviderRepository; import org.codehaus.plexus.util.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A dummy tag command. @@ -45,6 +47,7 @@ class StubTagCommand extends AbstractCommand { + private static final Logger logger = LoggerFactory.getLogger( StubTagCommand.class ); protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) @@ -61,7 +64,7 @@ protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet String tagName = parameters.getString( CommandParameter.TAG_NAME ); File tagRoot = new File( stubRepo.getTagBase(), tagName ); - getLogger().info( "Tagging: " + repoRoot + " > " + tagRoot ); + logger.info( "Tagging: " + repoRoot + " > " + tagRoot ); if ( tagRoot.exists() ) { @@ -80,7 +83,7 @@ protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet File srcFile = new File( repoRoot, path ); File dstFile = new File( tagRoot, path ); - getLogger().info( " " + path ); + logger.info( " " + path ); if ( srcFile.isDirectory() ) { diff --git a/maven-release-plugin/src/it/setup/maven-wagon-provider-dummy/pom.xml b/maven-release-plugin/src/it/setup/maven-wagon-provider-dummy/pom.xml index b2d9a0e15..5bbf8d75e 100644 --- a/maven-release-plugin/src/it/setup/maven-wagon-provider-dummy/pom.xml +++ b/maven-release-plugin/src/it/setup/maven-wagon-provider-dummy/pom.xml @@ -43,7 +43,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>2.0.2</version> + <version>@maven-compiler-plugin.version@</version> <configuration> <encoding>UTF-8</encoding> </configuration> @@ -51,7 +51,7 @@ <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-maven-plugin</artifactId> - <version>1.3.8</version> + <version>@plexus-maven-plugin.version@</version> <executions> <execution> <goals> 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 7e67b80eb..0ffb4e4cc 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 @@ -200,6 +200,14 @@ public class BranchReleaseMojo @Parameter( defaultValue = "default", property = "projectVersionPolicyId" ) private String projectVersionPolicyId; + /** + * Optional config for the VersionPolicy implementation used to calculate the project versions. + * + * @since 3.0.0-M6 + */ + @Parameter( property = "projectVersionPolicyConfig" ) + private String projectVersionPolicyConfig; + /** * The role-hint for the {@link org.apache.maven.shared.release.policy.naming.NamingPolicy} * implementation used to calculate the project names. @@ -260,6 +268,7 @@ public void execute() config.setDefaultDevelopmentVersion( developmentVersion ); config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeBranch ); config.setProjectVersionPolicyId( projectVersionPolicyId ); + config.setProjectVersionPolicyConfig( projectVersionPolicyConfig ); config.setProjectNamingPolicyId( projectBranchNamingPolicyId ); config.setScmBranchCommitComment( scmBranchCommitComment ); config.setPinExternals( pinExternals ); 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 d65c2f2ee..6f85b6d8e 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 @@ -240,6 +240,14 @@ public class PrepareReleaseMojo @Parameter( defaultValue = "default", property = "projectVersionPolicyId" ) private String projectVersionPolicyId; + /** + * Optional config for the VersionPolicy implementation used to calculate the project versions. + * + * @since 3.0.0-M6 + */ + @Parameter( property = "projectVersionPolicyConfig" ) + private String projectVersionPolicyConfig; + /** * The role-hint for the {@link org.apache.maven.shared.release.policy.naming.NamingPolicy} * implementation used to calculate the project branch and tag names. @@ -382,6 +390,7 @@ protected void prepareRelease( boolean generateReleasePoms ) config.setSuppressCommitBeforeTagOrBranch( suppressCommitBeforeTag ); config.setWaitBeforeTagging( waitBeforeTagging ); config.setProjectVersionPolicyId( projectVersionPolicyId ); + config.setProjectVersionPolicyConfig( projectVersionPolicyConfig ); config.setProjectNamingPolicyId( projectTagNamingPolicyId ); config.setScmDevelopmentCommitComment( scmDevelopmentCommitComment ); config.setScmReleaseCommitComment( scmReleaseCommitComment ); 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 60f657dfd..29f6dfe9d 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 @@ -93,6 +93,14 @@ public class UpdateVersionsMojo @Parameter( defaultValue = "default", property = "projectVersionPolicyId" ) private String projectVersionPolicyId; + /** + * Optional config for the VersionPolicy implementation used to calculate the project versions. + * + * @since 3.0.0-M6 + */ + @Parameter( property = "projectVersionPolicyConfig" ) + private String projectVersionPolicyConfig; + @Override public void execute() throws MojoExecutionException, MojoFailureException @@ -104,6 +112,7 @@ public void execute() config.setScmUseEditMode( useEditMode ); config.setUpdateDependencies( updateDependencies ); config.setProjectVersionPolicyId( projectVersionPolicyId ); + config.setProjectVersionPolicyConfig( projectVersionPolicyConfig ); config.addOriginalScmInfo( ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ), project.getScm() ); diff --git a/maven-release-plugin/src/site/apt/examples/generate-release-poms.apt b/maven-release-plugin/src/site/apt/examples/generate-release-poms.apt index c722143b3..3bd05f35f 100644 --- a/maven-release-plugin/src/site/apt/examples/generate-release-poms.apt +++ b/maven-release-plugin/src/site/apt/examples/generate-release-poms.apt @@ -30,16 +30,16 @@ Generate Release POMs To generate POMs with resolved information (e.g. version numbers) to check the values that the Release Plugin will use, execute the <<<prepare-with-pom>>> goal. Resolved values will be saved in <<<release-pom.xml>>>. -+------- +------- mvn release:prepare-with-pom -+------- +------- This relies on <<<release.properties>>> being present from a previous release preparation. If this is not the case, you need to give the goal the name of the URL and optional tag to perform the release from. For example: -+------- +------- mvn release:prepare-with-pom -DconnectionUrl=scm:svn:https://svn.apache.org/repos/asf/maven/plugins/tags/maven-release-plugin-2.0 -+------- +------- After the release is complete, the <<<release.properties>>> and other release files will be removed from the checkout. diff --git a/maven-release-plugin/src/site/apt/examples/non-interactive-release.apt b/maven-release-plugin/src/site/apt/examples/non-interactive-release.apt index 70fd16304..fbb634dff 100644 --- a/maven-release-plugin/src/site/apt/examples/non-interactive-release.apt +++ b/maven-release-plugin/src/site/apt/examples/non-interactive-release.apt @@ -88,11 +88,11 @@ mvn --batch-mode -Dtag=my-proj-1.2 -Dproject.rel.org.myCompany:projectA=1.2 \ and the release and SNAPSHOT versions follow the same conventions as they do on the command line. ------------ ++----------- scm.tag=my-proj-1.2 project.rel.org.myCompany\:projectA=1.2 project.dev.org.myCompany\:projectA=1.3-SNAPSHOT ------------ ++----------- <<Note:>> Remember to escape the colon with a backslash, otherwise the property will not be interpreted correctly. diff --git a/maven-release-plugin/src/site/apt/examples/perform-release.apt.vm b/maven-release-plugin/src/site/apt/examples/perform-release.apt.vm index bb772cca2..002c9fa31 100644 --- a/maven-release-plugin/src/site/apt/examples/perform-release.apt.vm +++ b/maven-release-plugin/src/site/apt/examples/perform-release.apt.vm @@ -31,7 +31,7 @@ Perform a Release * Checkout from an SCM URL with optional tag - * Run the predefined Maven goals to release the project (by default, <<<deploy site-deploy>>>) + * Run the perform Maven goals to release the project (by default, <<<deploy site-deploy>>>), eventually with release profile(s) active [] @@ -58,7 +58,7 @@ mvn org.apache.maven.plugins:maven-release-plugin:${project.version}:perform -Dc at release-time) by setting a comma separated list of profiles names in the <<<releaseProfiles>>> parameter. The goals and profiles required to release the project can then be configured in the POM: -------- ++------- <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> @@ -70,6 +70,8 @@ mvn org.apache.maven.plugins:maven-release-plugin:${project.version}:perform -Dc <releaseProfiles>release</releaseProfiles> </configuration> </plugin> -------- ++------- + + Maven Release Plugin 2.x also activated a default profile by default, but not Maven Release Plugin 3.x: see {{{../migrate.html}migrate documentation}} for more details. After the release is complete, the <<<release.properties>>> and other release files will be removed from the checkout. diff --git a/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm b/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm index a9ae5ef28..d7cf6a4a5 100644 --- a/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm +++ b/maven-release-plugin/src/site/apt/examples/prepare-release.apt.vm @@ -38,7 +38,7 @@ Prepare a Release * Transform the SCM information in the POM to include the final destination of the tag - * Run the project tests against the modified POMs to confirm everything is in working order + * Run the project tests (preparation goals) against the modified POMs to confirm everything is in working order * Commit the modified POMs @@ -97,10 +97,10 @@ mvn release:prepare-with-pom * Overriding the default tag name format - By default, if you do not specify a tag name, a default tag name of <<<artifactId>>>-<<<version>>> will be - suggested (and if running non-interactively used). + By default, if you do not specify a tag name, a default tag name of <<<artifactId-version>>> will be + suggested (and used if running non-interactively). - You can specify the exact tag name to use from the command line by passing the <<<tag>>> property, but if you + You can override proposed value with the exact tag name to use from the command line by passing the <<<tag>>> property (<<<-Dtag=my-tag>>>). If you want to have the tag name generated, but just change the default pattern, you can use the <<<tagNameFormat>>> configuration option. @@ -143,4 +143,4 @@ mvn release:prepare-with-pom [] - The <<<project.>>> prefix is optional and may be omitted. \ No newline at end of file + The <<<project.>>> prefix is optional and may be omitted. diff --git a/maven-release-plugin/src/site/apt/examples/run-goals-before-commit.apt.vm b/maven-release-plugin/src/site/apt/examples/run-goals-before-commit.apt.vm index 00563ff3e..1e77265eb 100644 --- a/maven-release-plugin/src/site/apt/examples/run-goals-before-commit.apt.vm +++ b/maven-release-plugin/src/site/apt/examples/run-goals-before-commit.apt.vm @@ -27,7 +27,7 @@ Run Additional Goals Before Commit - To run additional goals after release preparation but before committing, specify them using the <<<preparationGoals>>> + To run additional goals after release preparation (tag) but before committing with new -SNAPSHOT version, specify them using the <<<preparationGoals>>> property. +----- diff --git a/maven-release-plugin/src/site/apt/index.apt b/maven-release-plugin/src/site/apt/index.apt index 832be4f46..25d2de3d9 100644 --- a/maven-release-plugin/src/site/apt/index.apt +++ b/maven-release-plugin/src/site/apt/index.apt @@ -30,7 +30,7 @@ Maven Release Plugin This plugin is used to release a project with Maven, saving a lot of repetitive, manual work. Releasing a project is made in two steps: prepare and perform. - <<Note: Maven 3 users are encouraged to use at least {{{http://maven.apache.org/download.html}Maven-3.0.4}} due to some settings related issues.>> + <<Note: Maven 3 users are encouraged to use at least {{{/download.html}Maven-3.0.4}} due to some settings related issues.>> * Goals Overview @@ -67,7 +67,7 @@ Maven Release Plugin entire debug logs, POMs or most preferably little demo projects attached to the issue are very much appreciated. Of course, patches are welcome, too. Contributors can check out the project from our {{{./scm.html}source repository}} and will find supplementary information in the - {{{http://maven.apache.org/guides/development/guide-helping.html}guide to helping with Maven}}. + {{{/guides/development/guide-helping.html}guide to helping with Maven}}. * Examples diff --git a/maven-release-plugin/src/site/apt/upgrade.apt.vm b/maven-release-plugin/src/site/apt/migrate.apt.vm similarity index 88% rename from maven-release-plugin/src/site/apt/upgrade.apt.vm rename to maven-release-plugin/src/site/apt/migrate.apt.vm index 93f66930a..27925cae0 100644 --- a/maven-release-plugin/src/site/apt/upgrade.apt.vm +++ b/maven-release-plugin/src/site/apt/migrate.apt.vm @@ -1,5 +1,5 @@ ------ - Upgrading Maven Release Plugin From 2 to 3 + Migrate Maven Release Plugin From 2 to 3 ------ ------ 2022-04-24 @@ -25,7 +25,7 @@ ~~ NOTE: For help with the syntax of this file, see: ~~ http://maven.apache.org/doxia/references/apt-format.html -Upgrading Maven Release Plugin From 2 to 3 +Migrate Maven Release Plugin From 2 to 3 * Context: Maven 3 and Maven 4 @@ -46,8 +46,9 @@ Upgrading Maven Release Plugin From 2 to 3 * for internal projects, just configure the <<<maven-source-plugin>>> for example - * for projects published to Maven Central repository, you'll need to add also <<<maven-javadoc-plugin>>> and <<<maven-gpg-plugin>>>: see - {{{https://central.sonatype.org/publish/publish-maven/}the documentation}} + * for projects {{{/repository/guide-central-repository-upload.html}published to Maven Central repository}}, you'll need to add also <<<maven-javadoc-plugin>>> and <<<maven-gpg-plugin>>>: see + {{{https://central.sonatype.org/publish/publish-maven/}the documentation}}. \ + Notice: if you already published to Maven Central, there is a good chance the configuration has already been done in a parent POM. [] diff --git a/maven-release-plugin/src/site/apt/usage.apt.vm b/maven-release-plugin/src/site/apt/usage.apt.vm index 633474ad0..1e609d442 100644 --- a/maven-release-plugin/src/site/apt/usage.apt.vm +++ b/maven-release-plugin/src/site/apt/usage.apt.vm @@ -30,7 +30,7 @@ Usage * Prepare your project to use the maven-release-plugin - To be able to make a solid start with the maven-release-plugin, there are 2 things you should include in our pom: + To be able to make a solid start with the maven-release-plugin, there are 2 things you should include in your pom: * the <<<scm>>>-section with a <<<developerConnection>>> @@ -40,14 +40,14 @@ Usage The <<<developerConnection>>> contains the URL of the Source Control Management system pointing to the folder containing this <<<pom.xml>>> This URL is prefixed with <<<scm:[scm-provider]>>> so the plugin can pick the right implementation for committing and tagging. - The {{{http://maven.apache.org/scm/scms-overview.html}Maven SCM}}-page contains an overview all the supported SCMs, per SCM you can see how the URL should look like. + The {{{/scm/scms-overview.html}Maven SCM}}-page contains an overview all the supported SCMs, per SCM you can see how the URL should look like: +-------- <project> ... <scm> - <developerConnection>scm:svn:https://svn.mycompany.com/repos/myapplication/trunk/mycomponent/</developerConnection> + <developerConnection>scm:git:https://github.com/my-org/my-project.git</developerConnection> </scm> <build> @@ -69,59 +69,24 @@ Usage The following are some common scenarios in preparing a release. -* Use a different username in the SCM server than the one in the operating system - - Most of the SCMs are simply executed as an external command as the current user on your system. If this username is - not the same as the SCM username, you may need to set the following option: - -+------ -mvn -Dusername=your_scm_username release:prepare -+------ - -* Set where to tag the files in Subversion - - This example shows how to set the repository location for all tags to be created in Subversion. - Note that this is not needed if you use the standard SVN layout, where the root project is in <<<trunk>>>, and - there is a sibling <<<tags>>> directory. - -+------------------- -<project> - ... - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-release-plugin</artifactId> - <version>${project.version}</version> - <configuration> - <tagBase>https://svn.mycompany.com/repos/myapplication/releases</tagBase> - </configuration> - </plugin> - </plugins> - ... - </build> - ... -</project> -+------------------- - * Do a Dry Run Since the Release Plugin performs a number of operations that change the project, it may be wise to do a dry run before a big release or on a new project. To do this, commit all of your files as if you were about to run a full release and run: -+------ -mvn release:prepare -DdryRun=true -+------ +------ +mvn release:prepare -DdryRun +------ This will ask all the same questions, run the same tests, and output a copy of how the POMs will look after transformation. You can check the output and review the POMs, then run: -+------ -mvn release:clean -+------ +------ +mvn release:perform -DdryRun +------ - This will remove all of the files created above, and the project will be ready to execute the proper release. + This will show the perform actions then clean the project, ie. remove all of the files created above, and the project will be ready to execute the proper release. * Run in Batch Mode @@ -151,3 +116,38 @@ mvn --batch-mode release:prepare you can still execute a <<<release:rollback>>> if some error has been detected and a new candidate must be created after some fixes. You just need to use a distinct tag in SCM, or rename the one that has been created if the SCM provider supports renaming tags. + +* Use a different username in the SCM server than the one in the operating system + + Most of the SCMs are simply executed as an external command as the current user on your system. If this username is + not the same as the SCM username, you may need to set the following option: + +------ +mvn -Dusername=your_scm_username release:prepare +------ + +* Set where to tag the files in Subversion + + This example shows how to set the repository location for all tags to be created in Subversion. + Note that this is not needed if you use the standard SVN layout, where the root project is in <<<trunk>>>, and + there is a sibling <<<tags>>> directory. + ++------------------- +<project> + ... + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-release-plugin</artifactId> + <version>${project.version}</version> + <configuration> + <tagBase>https://svn.mycompany.com/repos/myapplication/releases</tagBase> + </configuration> + </plugin> + </plugins> + ... + </build> + ... +</project> ++------------------- diff --git a/maven-release-plugin/src/site/site.xml b/maven-release-plugin/src/site/site.xml index 0af8a8a5d..12a8f0ea3 100644 --- a/maven-release-plugin/src/site/site.xml +++ b/maven-release-plugin/src/site/site.xml @@ -44,7 +44,7 @@ under the License. <item name="release:help" href="help-mojo.html"/> </item> <item name="Usage" href="usage.html"/> - <item name="Upgrade" href="upgrade.html"/> + <item name="Migrate" href="migrate.html"/> <item name="FAQ" href="faq.html"/> <!-- According to https://issues.apache.org/jira/browse/MNGSITE-152 --> <item name="License" href="http://www.apache.org/licenses/"/> diff --git a/maven-release-policies/maven-release-ccsemver-policy/pom.xml b/maven-release-policies/maven-release-ccsemver-policy/pom.xml new file mode 100644 index 000000000..48d6ddcae --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/pom.xml @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.maven.release</groupId> + <artifactId>maven-release</artifactId> + <version>3.0.0-M6-SNAPSHOT</version> + <relativePath>../../pom.xml</relativePath> + </parent> + + <artifactId>maven-release-ccsemver-policy</artifactId> + + <name>Maven Release Conventional Commits SemVer Policy</name> + <description> + A version policy that enforce SemVer format and upgrades minor element for next development version. + </description> + + <dependencies> + <dependency> + <groupId>${project.parent.groupId}</groupId> + <artifactId>maven-release-api</artifactId> + <version>${project.parent.version}</version> + </dependency> + <dependency> + <groupId>org.semver</groupId> + <artifactId>api</artifactId> + <version>0.9.33</version> + </dependency> + + <dependency> + <groupId>org.apache.maven.scm</groupId> + <artifactId>maven-scm-api</artifactId> + <version>${scmVersion}</version> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-component-annotations</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <scope>test</scope> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.codehaus.modello</groupId> + <artifactId>modello-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>xpp3-reader</goal> + <goal>java</goal> + </goals> + </execution> + </executions> + <configuration> + <version>3.0.0</version> + <packageWithVersion>false</packageWithVersion> + <models> + <model>src/main/mdo/ccsemver-config.mdo</model> + </models> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-component-metadata</artifactId> + <version>${plexus-component-metadata.version}</version> + <executions> + <execution> + <id>process-classes</id> + <goals> + <goal>generate-metadata</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/CCSemVerVersionPolicy.java b/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/CCSemVerVersionPolicy.java new file mode 100644 index 000000000..93478e73e --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/CCSemVerVersionPolicy.java @@ -0,0 +1,174 @@ +package org.apache.maven.shared.release.policy.ccsemver; + +/* + * 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.scm.ScmException; +import org.apache.maven.shared.release.policy.version.VersionPolicy; +import org.apache.maven.shared.release.policy.version.VersionPolicyRequest; +import org.apache.maven.shared.release.policy.version.VersionPolicyResult; +import org.apache.maven.shared.release.versions.VersionParseException; +import org.codehaus.plexus.component.annotations.Component; +import org.semver.Version; +import org.semver.Version.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * Uses SemVer combined with the tags and commit messages to increase the version. + */ +@Component( + role = VersionPolicy.class, + hint = "CCSemVerVersionPolicy", + description = "A VersionPolicy following the SemVer rules and looks at " + + "the commit messages following the Conventional Commits convention." + ) +public class CCSemVerVersionPolicy implements VersionPolicy +{ + protected Logger logger = LoggerFactory.getLogger( CCSemVerVersionPolicy.class ); + + public VersionPolicyResult getReleaseVersion( VersionPolicyRequest request ) + throws VersionParseException + { + VersionRules versionRules = new VersionRules( request.getConfig() ); + try + { + return getReleaseVersion( + request, + versionRules, + new CommitHistory( request, versionRules ) ); + } + catch ( ScmException e ) + { + throw new VersionParseException( "Unable to obtain the information from the SCM history", e ); + } + } + + public VersionPolicyResult getReleaseVersion( VersionPolicyRequest request, + VersionRules versionRules, + CommitHistory commitHistory ) + throws VersionParseException + { + boolean usingTag = false; + + String versionString = request.getVersion(); // The current version in the pom + Version version; + + logger.debug( "--------------------------------------------------------" ); + logger.debug( "Determining next ReleaseVersion" ); + logger.debug( "VersionRules: \n{}", versionRules ); + logger.debug( "Pom version : {}", versionString ); + + logger.debug( "Commit History : \n" + commitHistory ); + + Element maxElementSinceLastVersionTag = versionRules.getMaxElementSinceLastVersionTag( commitHistory ); + + List<String> commitHistoryTags = commitHistory.getTags(); + if ( commitHistoryTags.size() == 1 ) + { + // Use the latest tag we have + versionString = commitHistoryTags.get( 0 ); + usingTag = true; + logger.debug( "Version from tags : {}", versionString ); + } + else + { + logger.debug( "Version from tags : NOT FOUND" ); + } + + if ( maxElementSinceLastVersionTag == null ) + { + logger.debug( "Step from commits : No SCM version tags found" ); + } + else + { + logger.debug( "Step from commits : {}", maxElementSinceLastVersionTag.name() ); + } + + try + { + version = Version.parse( versionString ); + } + catch ( IllegalArgumentException e ) + { + throw new VersionParseException( e.getMessage() ); + } + + logger.debug( "Current version : {}", version ); + + + // If we have a version from the tag we use that + the calculated update. + // If only have the version from the current pom version with -SNAPSHOT removed. + if ( maxElementSinceLastVersionTag != null ) + { + version = version.next( maxElementSinceLastVersionTag ); + } + + Version releaseVersion = version.toReleaseVersion(); + logger.debug( "Next version : {}", releaseVersion ); + logger.debug( "--------------------------------------------------------" ); + + if ( usingTag ) + { + logger.info( "From SCM tag with version {} " + + "doing a {} version increase based on commit messages to version {}", + versionString, maxElementSinceLastVersionTag, releaseVersion ); + } + else + { + if ( maxElementSinceLastVersionTag == null ) + { + logger.info( "From project.version {} (because we did not find any valid SCM tags) " + + "going to version {} (because we did not find any minor/major commit messages).", + versionString, releaseVersion ); + } + else + { + logger.info( "From project.version {} (because we did not find any valid SCM tags) " + + "doing a {} version increase based on commit messages to version {}", + versionString, maxElementSinceLastVersionTag, releaseVersion ); + } + } + + VersionPolicyResult result = new VersionPolicyResult(); + result.setVersion( releaseVersion.toString() ); + return result; + } + + public VersionPolicyResult getDevelopmentVersion( VersionPolicyRequest request ) + throws VersionParseException + { + Version version; + try + { + version = Version.parse( request.getVersion() ); + } + catch ( IllegalArgumentException e ) + { + throw new VersionParseException( e.getMessage() ); + } + + version = version.next( Element.PATCH ); + VersionPolicyResult result = new VersionPolicyResult(); + result.setVersion( version + "-SNAPSHOT" ); + return result; + } +} diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/CommitHistory.java b/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/CommitHistory.java new file mode 100644 index 000000000..8445c3b8b --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/CommitHistory.java @@ -0,0 +1,180 @@ +package org.apache.maven.shared.release.policy.ccsemver; + +/* + * 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.scm.ChangeSet; +import org.apache.maven.scm.ScmException; +import org.apache.maven.scm.ScmFileSet; +import org.apache.maven.scm.command.changelog.ChangeLogScmRequest; +import org.apache.maven.scm.command.changelog.ChangeLogScmResult; +import org.apache.maven.scm.provider.ScmProvider; +import org.apache.maven.scm.repository.ScmRepository; +import org.apache.maven.shared.release.policy.version.VersionPolicyRequest; +import org.apache.maven.shared.release.versions.VersionParseException; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.stream.Collectors; + +/** + * Helper class to manage the commit history of the SCM repository. + */ +public class CommitHistory +{ + private final List<String> changes = new ArrayList<>(); + private final List<String> tags = new ArrayList<>(); + private String string; + + public List<String> getChanges() + { + return changes; + } + + public void addChanges( String change ) + { + this.changes.add( change ); + } + + public void addChanges( List<String> changes ) + { + this.changes.addAll( changes ); + } + + public List<String> getTags() + { + return tags; + } + + public void addTags( List<String> tags ) + { + if ( tags != null ) + { + tags.forEach( this::addTags ); + } + } + + public void addTags( String tag ) + { + if ( tag != null && !tag.isEmpty() ) + { + this.tags.add( tag ); + } + } + + public String getLastVersionTag() + { + if ( tags.size() != 1 ) + { + return null; + } + return tags.get( 0 ); + } + + public CommitHistory() + { + // Default constructor which results in an empty history. + } + + public CommitHistory( VersionPolicyRequest request, VersionRules versionRules ) + throws ScmException, VersionParseException + { + ScmRepository scmRepository = request.getScmRepository(); + ScmProvider scmProvider = request.getScmProvider(); + + ChangeLogScmRequest changeLogRequest = new ChangeLogScmRequest( + scmRepository, + new ScmFileSet( new File( request.getWorkingDirectory() ) ) + ); + + List<String> logLines = new ArrayList<>(); + + int limit = 0; + while ( getTags().isEmpty() ) + { + limit += 100; // Read the repository in incremental steps of 100 + changeLogRequest.setLimit( null ); + changeLogRequest.setLimit( limit ); + changes.clear(); + + ChangeLogScmResult changeLog = scmProvider.changeLog( changeLogRequest ); + + logLines.clear(); + logLines.add( "Commit history:" ); + for ( ChangeSet changeSet : changeLog.getChangeLog().getChangeSets() ) + { + List<String> changeSetTags = changeSet.getTags(); + logLines.add( "-- Comment: \"" + changeSet.getComment() + "\"" ); + logLines.add( " Tags : " + changeSetTags ); + List<String> versionTags = changeSetTags + .stream() + .map( tag -> + { + Matcher matcher = versionRules.getTagPattern().matcher( tag ); + if ( matcher.find() ) + { + return matcher.group( 1 ); + } + return null; + } + ) + .filter( Objects::nonNull ) + .collect( Collectors.toList() ); + + if ( !versionTags.isEmpty() ) + { + // Found the previous release tag + if ( versionTags.size() > 1 ) + { + throw new VersionParseException( "Most recent commit with tags has multiple version tags: " + + versionTags ); + } + logLines.add( "-- Version tags: " + versionTags ); + addTags( versionTags ); + break; // We have the last version tag + } + else + { + addChanges( changeSet.getComment() ); + } + } + if ( changeLog.getChangeLog().getChangeSets().size() < limit ) + { + // Apparently there are simply no more commits. + break; + } + } + + StringBuilder sb = new StringBuilder(); + for ( String logLine: logLines ) + { + sb.append( logLine ).append( '\n' ); + } + string = sb.toString(); + } + + @Override + public String toString() + { + return string; + } +} diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/VersionRules.java b/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/VersionRules.java new file mode 100644 index 000000000..e990e2257 --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/main/java/org/apache/maven/shared/release/policy/ccsemver/VersionRules.java @@ -0,0 +1,175 @@ +package org.apache.maven.shared.release.policy.ccsemver; + +/* + * 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.ccsemver.config.CCSemverConfig; +import org.apache.maven.shared.release.policy.ccsemver.config.io.xpp3.CCSemverConfigXpp3Reader; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; +import org.semver.Version; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * The set of rules that determine from the commit history what the next version should be. + */ +public class VersionRules +{ + private static final Logger LOGGER = LoggerFactory.getLogger( VersionRules.class ); + + private final Pattern tagPattern; + + private final List<Pattern> majorUpdatePatterns = new ArrayList<>(); + private final List<Pattern> minorUpdatePatterns = new ArrayList<>(); + + public VersionRules( String config ) + { + int patternFlags = Pattern.MULTILINE | Pattern.DOTALL | Pattern.UNIX_LINES; + + // The default assumes then entire tag is what we need + String tagRegex = "^([0-9]+(?:\\.[0-9]+(?:\\.[0-9]+)?)?)$"; + + // https://www.conventionalcommits.org/en/v1.0.0/ + majorUpdatePatterns.add( Pattern.compile( "^[a-zA-Z]+!(?:\\([a-zA-Z0-9_-]+\\))?: .*$", patternFlags ) ); + majorUpdatePatterns.add( Pattern.compile( "^BREAKING CHANGE:.*$", patternFlags ) ); + minorUpdatePatterns.add( Pattern.compile( "^feat(?:\\([a-zA-Z0-9_-]+\\))?: .*$", patternFlags ) ); + + if ( config != null && !config.trim().isEmpty() ) + { + ByteArrayInputStream inputStream = new ByteArrayInputStream( config.getBytes( UTF_8 ) ); + CCSemverConfigXpp3Reader configReader = new CCSemverConfigXpp3Reader(); + try + { + CCSemverConfig semverConfig = configReader.read( inputStream ); + + String semverConfigVersionTag = semverConfig.getVersionTag(); + if ( semverConfigVersionTag != null && ! semverConfigVersionTag.trim().isEmpty() ) + { + tagRegex = semverConfigVersionTag; + } + + if ( !semverConfig.getMajorRules().isEmpty() || !semverConfig.getMinorRules().isEmpty() ) + { + majorUpdatePatterns.clear(); + for ( String majorRule : semverConfig.getMajorRules() ) + { + majorUpdatePatterns.add( Pattern.compile( majorRule, patternFlags ) ); + } + minorUpdatePatterns.clear(); + for ( String minorRule : semverConfig.getMinorRules() ) + { + minorUpdatePatterns.add( Pattern.compile( minorRule, patternFlags ) ); + } + } + } + catch ( IOException | XmlPullParserException e ) + { + throw new IllegalArgumentException( "Unable to load the CCSemverConfig: ", e ); + } + } + tagPattern = Pattern.compile( tagRegex, Pattern.MULTILINE ); + } + + public Version.Element getMaxElementSinceLastVersionTag( CommitHistory commitHistory ) + { + boolean needMinorUpdate = false; + for ( String change : commitHistory.getChanges() ) + { + if ( isMajorUpdate( change ) ) + { + LOGGER.debug( "MAJOR: \"{}\"", change ); + return Version.Element.MAJOR; + } + else + if ( isMinorUpdate( change ) ) + { + LOGGER.debug( "MINOR: \"{}\"", change ); + needMinorUpdate = true; + } + } + + if ( needMinorUpdate ) + { + return Version.Element.MINOR; + } + if ( commitHistory.getLastVersionTag() != null ) + { + LOGGER.debug( "PATCH: Tag " + commitHistory.getLastVersionTag() ); + return Version.Element.PATCH; + } + return null; + } + + public boolean isMajorUpdate( String input ) + { + return matchesAny( majorUpdatePatterns, input ); + } + + public boolean isMinorUpdate( String input ) + { + return matchesAny( minorUpdatePatterns, input ); + } + + private boolean matchesAny( List<Pattern> patterns, String input ) + { + for ( Pattern pattern : patterns ) + { + Matcher matcher = pattern.matcher( input ); + if ( matcher.find() ) + { + return true; + } + } + return false; + } + + public Pattern getTagPattern() + { + return tagPattern; + } + + @Override + public String toString() + { + StringBuilder result = new StringBuilder(); + result.append( "Conventional Commits config:\n" ); + result.append( " VersionTag:\n" ); + result.append( " >>>" ).append( tagPattern ).append( "<<<\n" ); + result.append( " MajorRules:\n" ); + for ( Pattern majorUpdatePattern : majorUpdatePatterns ) + { + result.append( " >>>" ).append( majorUpdatePattern ).append( "<<<\n" ); + } + result.append( " Minor Rules:\n" ); + for ( Pattern minorUpdatePattern : minorUpdatePatterns ) + { + result.append( " >>>" ).append( minorUpdatePattern ).append( "<<<\n" ); + } + return result.toString(); + } +} diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/main/mdo/ccsemver-config.mdo b/maven-release-policies/maven-release-ccsemver-policy/src/main/mdo/ccsemver-config.mdo new file mode 100644 index 000000000..53993fbb1 --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/main/mdo/ccsemver-config.mdo @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> + +<model xmlns="https://codehaus-plexus.github.io/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://codehaus-plexus.github.io/MODELLO/1.4.0 https://codehaus-plexus.github.io/modello/xsd/modello-1.4.0.xsd"> + <id>ccsemver-config</id> + <name>CCSemverConfig</name> + <description> + The config for the CCSemverVersionPolicy. + </description> + <defaults> + <default> + <key>package</key> + <value>org.apache.maven.shared.release.policy.ccsemver.config</value> + </default> + </defaults> + <classes> + <class rootElement="true"> + <name>CCSemverConfig</name> + <version>1.0.0+</version> + <fields> + <!-- Descriptive Information --> + <field> + <name>versionTag</name> + <version>1.1.0+</version> + <type>String</type> + <description> + The regex with exactly 1 capture group that extracts the version from the SCM tag. + </description> + </field> + <field> + <name>minorRules</name> + <version>1.1.0+</version> + <type>List</type> + <association> + <type>String</type> + <multiplicity>*</multiplicity> + </association> + <description> + The list of regexes that must be classified as "minor" version changes. + </description> + </field> + <field> + <name>majorRules</name> + <version>1.1.0+</version> + <type>List</type> + <association> + <type>String</type> + <multiplicity>*</multiplicity> + </association> + <description> + The list of regexes that must be classified as "major" version changes. + </description> + </field> + </fields> + </class> + + </classes> +</model> diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/site/site.xml b/maven-release-policies/maven-release-ccsemver-policy/src/site/site.xml new file mode 100644 index 000000000..220ecbb57 --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/site/site.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +<project xmlns="http://maven.apache.org/DECORATION/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd"> + <body> + <menu name="Overview"> + <item name="Introduction" href="index.html"/> + <item name="JavaDocs" href="apidocs/index.html"/> + <item name="Source Xref" href="xref/index.html"/> + <!--item name="FAQ" href="faq.html"/--> + </menu> + + <menu ref="parent" inherit="top" /> + </body> +</project> \ No newline at end of file diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/CCSemVerVersionPolicyTest.java b/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/CCSemVerVersionPolicyTest.java new file mode 100644 index 000000000..ed88dc82f --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/CCSemVerVersionPolicyTest.java @@ -0,0 +1,151 @@ +package org.apache.maven.shared.release.policy.ccsemver; + +/* + * 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.version.VersionPolicyRequest; +import org.apache.maven.shared.release.versions.VersionParseException; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class CCSemVerVersionPolicyTest +{ + + private void verifyNextVersion( + String versionRulesConfig, + String pomVersion, + String expectedVersion, + String comment, + String... tags + ) throws VersionParseException + { + VersionPolicyRequest request = new VersionPolicyRequest(); + request.setScmProvider( FakeSCM.getSCMProvider( comment, tags ) ); + request.setScmRepository( FakeSCM.getScmRepository() ); + request.setWorkingDirectory( "/tmp" ); + request.setConfig( versionRulesConfig ); + request.setVersion( pomVersion ); + + String suggestedVersion = new CCSemVerVersionPolicy().getReleaseVersion( request ).getVersion(); + + assertEquals( expectedVersion, suggestedVersion ); + } + + private void verifyNextVersionMustFail( + String versionRulesConfig, + String pomVersion, + String comment, + String... tags + ) + { + try + { + verifyNextVersion( versionRulesConfig, pomVersion, "ignore", comment, tags ); + } + catch ( VersionParseException vpe ) + { + // Success ! + return; + } + fail( "Should have failed" ); + } + + @Test + public void testDefaultVersionRules() throws VersionParseException + { + String normal = "Did something"; + String patch = "fix(core): Another fix."; + String minor = "feat(core): New thingy."; + String major = "fix!(core): Breaking improvement"; + + String versionRulesConfig = ""; + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "1.1.1", normal ); // No Tag - No Comments + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "1.1.1", patch ); // No Tag - Patch Comments + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "1.2.0", minor ); // No Tag - Minor Comments + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "2.0.0", major ); // No Tag - Major Comments + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "2.3.5", normal, "2.3.4", "v3.4.5" ); // Tag - No Comments + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "2.3.5", patch, "2.3.4", "v3.4.5" ); // Tag - Patch Comments + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "2.4.0", minor, "2.3.4", "v3.4.5" ); // Tag - Minor Comments + verifyNextVersion( versionRulesConfig, "1.1.1-SNAPSHOT", "3.0.0", major, "2.3.4", "v3.4.5" ); // Tag - Major Comments + + // Too many valid version tags on one commit + verifyNextVersionMustFail( versionRulesConfig, "1.1.1-SNAPSHOT", major, "1.1.1", "2.2.2" ); + } + + @Test + public void testCustomTagPattern() throws VersionParseException { + String normal = "Did something"; + String patch = "fix(core): Another fix."; + String minor = "feat(core): New thingy."; + String major = "fix!(core): Breaking improvement"; + + String versionRulesConfig = "" + + "<cCSemverConfig>" + + "<versionTag>^v([0-9]+(?:\\.[0-9]+(?:\\.[0-9]+)?)?)$</versionTag>" + + "</cCSemverConfig>" + + ""; + + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "2.2.2", normal ); // No Tag - No Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "2.2.2", patch ); // No Tag - Patch Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "2.3.0", minor ); // No Tag - Minor Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.0.0", major ); // No Tag - Major Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.4.6", normal, "2.3.4", "v3.4.5" ); // Tag - No Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.4.6", patch, "2.3.4", "v3.4.5" ); // Tag - Patch Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.5.0", minor, "2.3.4", "v3.4.5" ); // Tag - Minor Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "4.0.0", major, "2.3.4", "v3.4.5" ); // Tag - Major Comments + + // Too many valid version tags on one commit + verifyNextVersionMustFail( versionRulesConfig, "2.2.2-SNAPSHOT", minor, "v1.1.1", "v2.2.2" ); + } + + @Test + public void testCustomVersionRules() throws VersionParseException { + String normal = "This is a different commit."; + String patch = "This is a No Change commit."; + String minor = "This is a Nice Change commit."; + String major = "This is a Big Change commit."; + + String versionRulesConfig = "" + + "<cCSemverConfig>" + + "<versionTag>^The awesome ([0-9]+(?:\\.[0-9]+(?:\\.[0-9]+)?)?) release$</versionTag>" + + "<majorRules>" + + "<majorRule>^.*Big Change.*$</majorRule>" + + "</majorRules>" + + "<minorRules>" + + "<minorRule>^.*Nice Change.*$</minorRule>" + + "</minorRules>" + + "</cCSemverConfig>" + + ""; + + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "2.2.2", normal ); // No Tag - No Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "2.2.2", patch ); // No Tag - Patch Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "2.3.0", minor ); // No Tag - Minor Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.0.0", major ); // No Tag - Major Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.4.6", normal, "2.3.4", "The awesome 3.4.5 release" ); // Tag - No Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.4.6", patch, "2.3.4", "The awesome 3.4.5 release" ); // Tag - Patch Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "3.5.0", minor, "2.3.4", "The awesome 3.4.5 release" ); // Tag - Minor Comments + verifyNextVersion( versionRulesConfig, "2.2.2-SNAPSHOT", "4.0.0", major, "2.3.4", "The awesome 3.4.5 release" ); // Tag - Major Comments + + // Too many valid version tags on one commit + verifyNextVersionMustFail( versionRulesConfig, "2.2.2-SNAPSHOT", minor, "The awesome 1.1.1 release", "The awesome 2.2.2 release" ); + } + +} diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/FakeSCM.java b/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/FakeSCM.java new file mode 100644 index 000000000..f8ccd91ae --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/FakeSCM.java @@ -0,0 +1,117 @@ +package org.apache.maven.shared.release.policy.ccsemver; + +/* + * 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.scm.ChangeSet; +import org.apache.maven.scm.ScmResult; +import org.apache.maven.scm.command.changelog.ChangeLogScmRequest; +import org.apache.maven.scm.command.changelog.ChangeLogScmResult; +import org.apache.maven.scm.command.changelog.ChangeLogSet; +import org.apache.maven.scm.provider.AbstractScmProvider; +import org.apache.maven.scm.provider.ScmProvider; +import org.apache.maven.scm.provider.ScmProviderRepository; +import org.apache.maven.scm.repository.ScmRepository; +import org.apache.maven.scm.repository.ScmRepositoryException; + +import java.util.Arrays; +import java.util.Date; + +import static org.junit.Assert.fail; + +public class FakeSCM +{ + public static ScmProvider getSCMProvider( String comment, String... tags ) + { + return new AbstractScmProvider() + { + @Override + public String getScmType() + { + return "dummy"; + } + + @Override + public ScmProviderRepository makeProviderScmRepository( String scmSpecificUrl, char delimiter ) + { + ScmProviderRepository repository = new ScmProviderRepository(){}; + repository.setUser( "someone" ); + repository.setPassword( "secret" ); + repository.setPushChanges( false ); + return repository; + } + + private ChangeSet changeSet(String comment, String... tags) { + ChangeSet changeSet = new ChangeSet(); + changeSet.setComment( comment ); + changeSet.setAuthor( "Someone <someone@example.nl>" ); + changeSet.setTags( Arrays.asList( tags ) ); + return changeSet; + } + + @Override + public ChangeLogScmResult changeLog(ChangeLogScmRequest request) { + Date from = new Date( 39817800000L ); + Date to = new Date( 1644768534785L ); + ChangeLogSet changeLogSet = new ChangeLogSet( + Arrays.asList( + changeSet( "Commit 19" ), + changeSet( "Commit 18" ), + changeSet( "Commit 17" ), + changeSet( "Commit 16" ), + changeSet( "Commit 15", "tag 1", "tag 2" ), + changeSet( comment ), // The comment that should make the difference + changeSet( "Commit 13" ), + changeSet( "Commit 12", "tag 3" ), + changeSet( "Commit 11" ), + changeSet( "Commit 10" ), + changeSet( "Commit 9" ), + changeSet( "Commit 8" ), + changeSet( "Commit 7" ), + changeSet( "Commit 6", "tag 4" ), + changeSet( "Commit 5" ), + changeSet( "Commit 4" ), + changeSet( "Commit 3" ), + changeSet( "Commit 2", tags ), // The first tag that looks like a version + changeSet( "Commit 1" ), + changeSet( "Commit 0" ) + ), from, to + ); + + ScmResult scmResult = new ScmResult( + "No command", + "Special for CCSemVer testing", + "No command output", + true + ); + return new ChangeLogScmResult( changeLogSet, scmResult ); + } + }; + } + + public static ScmRepository getScmRepository() { + try { + return new ScmRepository( "dummy", getSCMProvider("dummy").makeProviderScmRepository("dummy", ':') ); + } catch (ScmRepositoryException e) { + fail(e.getMessage()); + } + return null; // Never reached + } + +} diff --git a/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/NextVersionCalculationTest.java b/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/NextVersionCalculationTest.java new file mode 100644 index 000000000..07858af03 --- /dev/null +++ b/maven-release-policies/maven-release-ccsemver-policy/src/test/java/org/apache/maven/shared/release/policy/ccsemver/NextVersionCalculationTest.java @@ -0,0 +1,143 @@ +package org.apache.maven.shared.release.policy.ccsemver; + +/* + * 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.version.VersionPolicyRequest; +import org.apache.maven.shared.release.versions.VersionParseException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.semver.Version; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.semver.Version.Element.MAJOR; +import static org.semver.Version.Element.MINOR; +import static org.semver.Version.Element.PATCH; + +public class NextVersionCalculationTest +{ + + private CCSemVerVersionPolicy versionPolicy; + private static final VersionRules DEFAULT_VERSION_RULES = new VersionRules( null ); + + @Before + public void setUp() + { + versionPolicy = new CCSemVerVersionPolicy(); + } + + @After + public void tearDown() + { + versionPolicy = null; + } + + private void assertNextVersion( VersionRules versionRules, String input, Version.Element element ) + { + switch (element) { + case MAJOR: + assertTrue( versionRules.isMajorUpdate( input ) ); + // We do not care about minor and patch + break; + case MINOR: + assertFalse( versionRules.isMajorUpdate( input ) ); + assertTrue( versionRules.isMinorUpdate( input ) ); + // We do not care about patch + break; + case PATCH: + assertFalse( versionRules.isMajorUpdate( input ) ); + assertFalse( versionRules.isMinorUpdate( input ) ); + break; + } + } + + @Test + public void testMajorMinorPatchDetection() + { + VersionRules rules = DEFAULT_VERSION_RULES; + assertNextVersion( rules, "feat!(core): New feature.", MAJOR ); + assertNextVersion( rules, "feat!: New feature.", MAJOR ); + assertNextVersion( rules, "feat(core): Foo.\n\nBREAKING CHANGE: New feature.\n", MAJOR ); + assertNextVersion( rules, "feat: Foo.\n\nBREAKING CHANGE: New feature.\n", MAJOR ); + + assertNextVersion( rules, "feat(core): New feature.", MINOR ); + assertNextVersion( rules, "feat: New feature.", MINOR ); + + assertNextVersion( rules, "Does not match any pattern.", PATCH ); + } + + @Test + public void testConvertToSnapshot() + throws Exception + { + String suggestedVersion = versionPolicy.getDevelopmentVersion( new VersionPolicyRequest().setVersion( "1.0.0" ) ) + .getVersion(); + + assertEquals( "1.0.1-SNAPSHOT", suggestedVersion ); + } + + public void verifyNextVersion(VersionRules versionRules, + String currentPomVersion, + String tag, + List<String> comments, + String expectedNextVersion) throws VersionParseException { + CommitHistory commitHistory = new CommitHistory(); + commitHistory.addTags( tag ); + commitHistory.addChanges( comments ); + + assertEquals( expectedNextVersion, versionPolicy + .getReleaseVersion( + new VersionPolicyRequest().setVersion( currentPomVersion ), + versionRules, + commitHistory + ).getVersion() ); + } + + String patch1 = "Quick patch"; + String patch2 = "fix(core): Another fix."; + String minor1 = "feat(core): New thingy."; + String major1 = "fix!(core): Breaking improvement" ; + + List<String> EMPTY = Collections.emptyList(); + List<String> MAJOR_MESSAGES = Arrays.asList( patch1, patch2, minor1, major1 ); + List<String> MINOR_MESSAGES = Arrays.asList( patch1, patch2, minor1 ); + List<String> PATCH_MESSAGES = Arrays.asList( patch1, patch2 ); + + @Test + public void testDefaultVersionRules() throws VersionParseException + { + VersionRules rules = DEFAULT_VERSION_RULES; + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "", EMPTY, "1.2.3"); // No Tag - No Comments + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "", PATCH_MESSAGES, "1.2.3"); // No Tag - Patch Comments + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "", MINOR_MESSAGES, "1.3.0"); // No Tag - Minor Comments + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "", MAJOR_MESSAGES, "2.0.0"); // No Tag - Major Comments + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "2.3.4", EMPTY, "2.3.5"); // Tag - No Comments + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "2.3.4", PATCH_MESSAGES, "2.3.5"); // Tag - Patch Comments + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "2.3.4", MINOR_MESSAGES, "2.4.0"); // Tag - Minor Comments + verifyNextVersion( rules, "1.2.3-SNAPSHOT", "2.3.4", MAJOR_MESSAGES, "3.0.0"); // Tag - Major Comments + } + +} diff --git a/pom.xml b/pom.xml index 595970349..5eb3c8928 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,7 @@ <module>maven-release-manager</module> <module>maven-release-policies/maven-release-oddeven-policy</module> <module>maven-release-policies/maven-release-semver-policy</module> + <module>maven-release-policies/maven-release-ccsemver-policy</module> <module>maven-release-plugin</module> </modules> @@ -84,17 +85,32 @@ <contributor> <name>Thorsten Heit</name> </contributor> + <contributor> + <name>Niels Basjes</name> + </contributor> </contributors> <properties> - <scmVersion>1.12.2</scmVersion> + <scmVersion>2.0.0-M2-SNAPSHOT</scmVersion> <javaVersion>8</javaVersion> <mavenVersion>3.2.5</mavenVersion> <resolverVersion>1.0.0.v20140518</resolverVersion> <wagonVersion>3.5.1</wagonVersion> <surefire.version>3.0.0-M6</surefire.version> + <slf4j.version>1.7.36</slf4j.version> + <junit.version>4.13.2</junit.version> <maven.site.path>maven-release-archives/maven-release-LATEST</maven.site.path> <project.build.outputTimestamp>2022-01-02T10:18:49Z</project.build.outputTimestamp> + + <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version> + <maven-artifact-transfer.version>0.13.1</maven-artifact-transfer.version> + <maven-invoker-plugin.version>3.2.2</maven-invoker-plugin.version> + + <plexus-component-metadata.version>1.7.1</plexus-component-metadata.version> + <plexus-maven-plugin.version>1.3.8</plexus-maven-plugin.version> + + <maven-plugin-testing-harness.version>3.3.0</maven-plugin-testing-harness.version> + </properties> <build> @@ -106,6 +122,8 @@ <configuration> <excludes combine.children="append"> <exclude>.repository</exclude> + <exclude>**/*.iml</exclude> + <exclude>**/target/**</exclude> </excludes> </configuration> </plugin> @@ -268,13 +286,13 @@ <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> - <version>1.7.5</version> + <version>${slf4j.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> - <version>1.7.36</version> + <version>${slf4j.version}</version> <scope>test</scope> </dependency> @@ -297,7 +315,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>4.13.2</version> + <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> diff --git a/release.properties b/release.properties deleted file mode 100644 index bf54b52ad..000000000 --- a/release.properties +++ /dev/null @@ -1,27 +0,0 @@ -#release configuration -#Sun May 08 16:33:56 CEST 2022 -scm.commentPrefix=[maven-release-plugin] -exec.pomFileName=pom.xml -pushChanges=true -releaseStrategyId=default -project.scm.org.apache.maven.release\:maven-release.url=https\://github.com/apache/maven-release/tree/${project.scm.tag} -project.scm.org.apache.maven.release\:maven-release-semver-policy.empty=true -remoteTagging=true -scm.branchCommitComment=@{prefix} prepare branch @{releaseLabel} -project.scm.org.apache.maven.release\:maven-release-oddeven-policy.empty=true -project.scm.org.apache.maven.plugins\:maven-release-plugin.empty=true -projectVersionPolicyId=default -project.scm.org.apache.maven.release\:maven-release.connection=scm\:git\:https\://gitbox.apache.org/repos/asf/maven-release.git -scm.url=scm\:git\:https\://gitbox.apache.org/repos/asf/maven-release.git -scm.tagNameFormat=@{project.artifactId}-@{project.version} -project.scm.org.apache.maven.release\:maven-release.developerConnection=scm\:git\:https\://gitbox.apache.org/repos/asf/maven-release.git -pinExternals=false -preparationGoals=clean verify -scm.releaseCommitComment=@{prefix} prepare release @{releaseLabel} -exec.snapshotReleasePluginAllowed=false -scm.developmentCommitComment=@{prefix} prepare for next development iteration -scm.rollbackCommitComment=@{prefix} rollback the release of @{releaseLabel} -project.scm.org.apache.maven.release\:maven-release.tag=HEAD -completedPhase=check-poms -project.scm.org.apache.maven.release\:maven-release-manager.empty=true -project.scm.org.apache.maven.release\:maven-release-api.empty=true diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt index cbdaf26c5..47e46d943 100644 --- a/src/site/apt/index.apt +++ b/src/site/apt/index.apt @@ -42,3 +42,5 @@ Maven Release *----------------------------------------------------------+----------------+ | {{{./maven-release-policies/maven-release-semver-policy/}maven-release-semver-policy}} | a version policy that enforce SemVer format and upgrades minor element for next development version *----------------------------------------------------------+----------------+ +| {{{./maven-release-policies/maven-release-ccsemver-policy/}maven-release-ccsemver-policy}} | a version policy that enforce SemVer format and upgrades major/minor/patch element for next development version depending on the commit messages since the previous release (actually tag in the SCM). +*----------------------------------------------------------+----------------+