From 1d5b043032690aa07f20972412577689a2fb74f4 Mon Sep 17 00:00:00 2001 From: Andrzej Jarmoniuk Date: Mon, 7 Nov 2022 17:46:22 +0100 Subject: [PATCH] Resolves #289: Handle processParent in mojos which support it. Also: - added failIfNotReplaced to ForceReleasesMojo as a first steps towards converging with UseReleasesMojo - added unit tests and integration tests - some refactoring --- .../src/it-repo/dummy-with-parent.pom | 15 ++ .../invoker.properties | 2 + .../it-compare-dependencies-issue-289/pom.xml | 15 ++ .../verify.groovy | 2 + .../it/it-use-latest-versions-009/verify.bsh | 33 --- .../it-use-latest-versions-009/verify.groovy | 2 + .../it/it-use-latest-versions-010/verify.bsh | 62 ------ .../it-use-latest-versions-010/verify.groovy | 2 + .../it/it-use-latest-versions-011/verify.bsh | 33 --- .../it-use-latest-versions-011/verify.groovy | 2 + ...AbstractVersionsDependencyUpdaterMojo.java | 87 +++++++- .../versions/AbstractVersionsUpdaterMojo.java | 39 ++-- .../versions/CompareDependenciesMojo.java | 73 ++++--- .../DisplayDependencyUpdatesMojo.java | 4 +- .../mojo/versions/ForceReleasesMojo.java | 44 ++-- .../mojo/versions/LockSnapshotsMojo.java | 6 +- .../mojo/versions/UnlockSnapshotsMojo.java | 6 +- .../mojo/versions/UseDepVersionMojo.java | 20 +- .../mojo/versions/UseLatestReleasesMojo.java | 16 +- .../mojo/versions/UseLatestSnapshotsMojo.java | 20 +- .../mojo/versions/UseLatestVersionsMojo.java | 9 +- .../versions/UseLatestVersionsMojoBase.java | 28 +-- .../mojo/versions/UseNextReleasesMojo.java | 6 + .../mojo/versions/UseNextSnapshotsMojo.java | 18 +- .../mojo/versions/UseNextVersionsMojo.java | 6 + .../mojo/versions/UseReleasesMojo.java | 16 +- .../recording/ChangeRecorderNull.java | 20 +- .../versions/recording/ChangeRecorderXML.java | 18 +- .../mojo/versions/ForceReleasesMojoTest.java | 199 ++++++++++++++++++ .../versions/UseLatestReleasesMojoTest.java | 2 + .../versions/UseLatestVersionsMojoTest.java | 8 +- .../recording/ChangeRecorderXMLTest.java | 2 +- 32 files changed, 469 insertions(+), 346 deletions(-) create mode 100644 versions-maven-plugin/src/it-repo/dummy-with-parent.pom create mode 100644 versions-maven-plugin/src/it/it-compare-dependencies-issue-289/invoker.properties create mode 100644 versions-maven-plugin/src/it/it-compare-dependencies-issue-289/pom.xml create mode 100644 versions-maven-plugin/src/it/it-compare-dependencies-issue-289/verify.groovy delete mode 100644 versions-maven-plugin/src/it/it-use-latest-versions-009/verify.bsh create mode 100644 versions-maven-plugin/src/it/it-use-latest-versions-009/verify.groovy delete mode 100644 versions-maven-plugin/src/it/it-use-latest-versions-010/verify.bsh create mode 100644 versions-maven-plugin/src/it/it-use-latest-versions-010/verify.groovy delete mode 100644 versions-maven-plugin/src/it/it-use-latest-versions-011/verify.bsh create mode 100644 versions-maven-plugin/src/it/it-use-latest-versions-011/verify.groovy create mode 100644 versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java diff --git a/versions-maven-plugin/src/it-repo/dummy-with-parent.pom b/versions-maven-plugin/src/it-repo/dummy-with-parent.pom new file mode 100644 index 000000000..ee67ab678 --- /dev/null +++ b/versions-maven-plugin/src/it-repo/dummy-with-parent.pom @@ -0,0 +1,15 @@ + + 4.0.0 + + + localhost + dummy-parent2 + 2.0 + + + dummy-with-parent + 1.0 + pom + + diff --git a/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/invoker.properties b/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/invoker.properties new file mode 100644 index 000000000..3ad4536e8 --- /dev/null +++ b/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/invoker.properties @@ -0,0 +1,2 @@ +invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:compare-dependencies +invoker.mavenOpts = -DremotePom=localhost:dummy-with-parent:1.0 -DreportMode=false -DprocessParent=true diff --git a/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/pom.xml b/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/pom.xml new file mode 100644 index 000000000..389dd2b73 --- /dev/null +++ b/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + + localhost + dummy-parent2 + 1.0 + + + dummy-with-parent + 1.0-SNAPSHOT + pom + + diff --git a/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/verify.groovy b/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/verify.groovy new file mode 100644 index 000000000..3271a1899 --- /dev/null +++ b/versions-maven-plugin/src/it/it-compare-dependencies-issue-289/verify.groovy @@ -0,0 +1,2 @@ +def project = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) ) +assert project.parent.version == '2.0' diff --git a/versions-maven-plugin/src/it/it-use-latest-versions-009/verify.bsh b/versions-maven-plugin/src/it/it-use-latest-versions-009/verify.bsh deleted file mode 100644 index afc3f9b04..000000000 --- a/versions-maven-plugin/src/it/it-use-latest-versions-009/verify.bsh +++ /dev/null @@ -1,33 +0,0 @@ -import java.io.*; -import java.util.regex.*; - -try -{ - File file = new File( basedir, "pom.xml" ); - - BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) ); - StringBuilder buf = new StringBuilder(); - String line = in.readLine(); - while ( line != null ) - { - buf.append( line ); - buf.append( " " ); - line = in.readLine(); - } - - Pattern p = Pattern.compile( "\\Q\\E.*\\Q\\E\\s*3\\.0\\s*\\Q\\E.*\\Q\\E" ); - Matcher m = p.matcher( buf.toString() ); - if ( !m.find() ) - { - System.out.println( "Did not update parent to version 3.0" ); - return false; - } - System.out.println( m.group( 0 ) ); -} -catch( Throwable t ) -{ - t.printStackTrace(); - return false; -} - -return true; diff --git a/versions-maven-plugin/src/it/it-use-latest-versions-009/verify.groovy b/versions-maven-plugin/src/it/it-use-latest-versions-009/verify.groovy new file mode 100644 index 000000000..954f1b214 --- /dev/null +++ b/versions-maven-plugin/src/it/it-use-latest-versions-009/verify.groovy @@ -0,0 +1,2 @@ +def project = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) ) +assert project.parent.version == '3.0' diff --git a/versions-maven-plugin/src/it/it-use-latest-versions-010/verify.bsh b/versions-maven-plugin/src/it/it-use-latest-versions-010/verify.bsh deleted file mode 100644 index 204a0b815..000000000 --- a/versions-maven-plugin/src/it/it-use-latest-versions-010/verify.bsh +++ /dev/null @@ -1,62 +0,0 @@ -import java.io.*; -import java.util.regex.*; - -try -{ - File file = new File( basedir, "pom.xml" ); - - BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) ); - StringBuilder buf = new StringBuilder(); - String line = in.readLine(); - while ( line != null ) - { - buf.append( line ); - buf.append( " " ); - line = in.readLine(); - } - - Pattern p = Pattern.compile( "\\Q\\E.*\\Q\\E\\s*3\\.0\\s*\\Q\\E.*\\Q\\E" ); - Matcher m = p.matcher( buf.toString() ); - if ( !m.find() ) - { - System.out.println( "Did not update parent to version 3.0" ); - return false; - } - System.out.println( m.group( 0 ) ); -} -catch( Throwable t ) -{ - t.printStackTrace(); - return false; -} - -try -{ - File file = new File( basedir, "pom.xml" ); - - BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) ); - StringBuilder buf = new StringBuilder(); - String line = in.readLine(); - while ( line != null ) - { - buf.append( line ); - buf.append( " " ); - line = in.readLine(); - } - - Pattern p = Pattern.compile( "\\Q\\E\\s*3\\.0\\s*\\Q\\E.*\\Qpom\\E" ); - Matcher m = p.matcher( buf.toString() ); - if ( !m.find() ) - { - System.out.println( "Did not update to version 3.0" ); - return false; - } - System.out.println( m.group( 0 ) ); -} -catch( Throwable t ) -{ - t.printStackTrace(); - return false; -} - -return true; diff --git a/versions-maven-plugin/src/it/it-use-latest-versions-010/verify.groovy b/versions-maven-plugin/src/it/it-use-latest-versions-010/verify.groovy new file mode 100644 index 000000000..954f1b214 --- /dev/null +++ b/versions-maven-plugin/src/it/it-use-latest-versions-010/verify.groovy @@ -0,0 +1,2 @@ +def project = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) ) +assert project.parent.version == '3.0' diff --git a/versions-maven-plugin/src/it/it-use-latest-versions-011/verify.bsh b/versions-maven-plugin/src/it/it-use-latest-versions-011/verify.bsh deleted file mode 100644 index c93c57532..000000000 --- a/versions-maven-plugin/src/it/it-use-latest-versions-011/verify.bsh +++ /dev/null @@ -1,33 +0,0 @@ -import java.io.*; -import java.util.regex.*; - -try -{ - File file = new File( basedir, "pom.xml" ); - - BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) ); - StringBuilder buf = new StringBuilder(); - String line = in.readLine(); - while ( line != null ) - { - buf.append( line ); - buf.append( " " ); - line = in.readLine(); - } - - Pattern p = Pattern.compile( "\\Q\\E.*\\Q\\E\\s*1\\.0\\.0\\s*\\Q\\E.*\\Q\\E" ); - Matcher m = p.matcher( buf.toString() ); - if ( !m.find() ) - { - System.out.println( "Did not update parent to version 1.0.0 from 1.0.0-SNAPSHOT" ); - return false; - } - System.out.println( m.group( 0 ) ); -} -catch( Throwable t ) -{ - t.printStackTrace(); - return false; -} - -return true; diff --git a/versions-maven-plugin/src/it/it-use-latest-versions-011/verify.groovy b/versions-maven-plugin/src/it/it-use-latest-versions-011/verify.groovy new file mode 100644 index 000000000..09e552dd5 --- /dev/null +++ b/versions-maven-plugin/src/it/it-use-latest-versions-011/verify.groovy @@ -0,0 +1,2 @@ +def project = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) ) +assert project.parent.version == '1.0.0' diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java index 571fbdc01..9b8cc5c5c 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsDependencyUpdaterMojo.java @@ -20,11 +20,13 @@ */ import javax.inject.Inject; +import javax.xml.stream.XMLStreamException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.apache.maven.artifact.Artifact; @@ -41,7 +43,11 @@ import org.apache.maven.repository.RepositorySystem; import org.apache.maven.shared.artifact.filter.PatternExcludesArtifactFilter; import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter; +import org.codehaus.mojo.versions.api.PomHelper; +import org.codehaus.mojo.versions.recording.ChangeRecorder; +import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; import org.codehaus.mojo.versions.utils.DependencyBuilder; +import org.codehaus.mojo.versions.utils.DependencyComparator; /** * Base class for a mojo that updates dependency versions. @@ -53,11 +59,16 @@ public abstract class AbstractVersionsDependencyUpdaterMojo extends AbstractVersionsUpdaterMojo { - private static final String END_RANGE_CHARS = "])"; private static final String START_RANGE_CHARS = "[("; + /** + * Pattern to match snapshot versions + */ + protected static final Pattern SNAPSHOT_REGEX = Pattern.compile( "^(.+)-((SNAPSHOT)|(\\d{8}\\.\\d{6}-\\d+))$" ); + + /** * A comma separated list of artifact patterns to include. Follows the pattern * "groupId:artifactId:type:classifier:version". Designed to allow specifying the set of includes from the command @@ -104,7 +115,7 @@ public abstract class AbstractVersionsDependencyUpdaterMojo * @since 1.0-alpha-3 */ @Parameter( property = "processDependencies", defaultValue = "true" ) - private boolean processDependencies; + private boolean processDependencies = true; /** * Whether to process the dependencyManagement section of the project. @@ -112,7 +123,7 @@ public abstract class AbstractVersionsDependencyUpdaterMojo * @since 1.0-alpha-3 */ @Parameter( property = "processDependencyManagement", defaultValue = "true" ) - private boolean processDependencyManagement; + private boolean processDependencyManagement = true; /** * Whether to process the parent section of the project. If not set will default to false. @@ -142,7 +153,7 @@ public abstract class AbstractVersionsDependencyUpdaterMojo * @since 1.0-alpha-3 */ @Parameter( property = "excludeReactor", defaultValue = "true" ) - private boolean excludeReactor; + private boolean excludeReactor = true; @Inject protected AbstractVersionsDependencyUpdaterMojo( RepositorySystem repositorySystem, @@ -266,6 +277,20 @@ protected Artifact toArtifact( Parent model ) .build() ); } + /** + * Returns the {@link Dependency} instance for the parent project + * @return {@link Dependency} object for the parent + */ + protected Dependency getParentDependency() + { + return DependencyBuilder.newBuilder() + .withGroupId( getProject().getParent().getGroupId() ) + .withArtifactId( getProject().getParent().getArtifactId() ) + .withVersion( getProject().getParent().getVersion() ) + .withType( "pom" ) + .build(); + } + protected String toString( MavenProject project ) { StringBuilder buf = new StringBuilder(); @@ -507,4 +532,58 @@ private int findFirstChar( final String includeString, final String chars ) } return nextRangeStartDelimiterIndex; } + + /** + * Attempts to update the dependency {@code dep} to the given {@code newVersion}. The dependency can either + * be the parent project or any given dependency. + * + * @param pom {@link ModifiedPomXMLEventReader} instance to update the POM XML document + * @param dep dependency to be updated (can also be a dependency made from the parent) + * @param newVersion new version to update the dependency to + * @param changeRecorderTitle title for the {@link ChangeRecorder} log + * @return {@code true} if an update has been made, {@code false} otherwise + * @throws XMLStreamException thrown if updating the XML doesn't succeed + */ + protected boolean updateDependencyVersion( ModifiedPomXMLEventReader pom, Dependency dep, + String newVersion, String changeRecorderTitle ) + throws XMLStreamException + { + boolean updated = false; + if ( isProcessingParent() + && getProject().getParent() != null + && DependencyComparator.INSTANCE.compare( dep, DependencyBuilder.newBuilder() + .withGroupId( getProject().getParentArtifact().getGroupId() ) + .withArtifactId( getProject().getParentArtifact().getArtifactId() ) + .withVersion( getProject().getParentArtifact().getVersion() ) + .build() ) == 0 + && PomHelper.setProjectParentVersion( pom, newVersion ) ) + { + if ( getLog().isDebugEnabled() ) + { + getLog().debug( "Made parent update from " + dep.getVersion() + " to " + newVersion ); + } + getChangeRecorder().recordUpdate( changeRecorderTitle, + dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), + newVersion ); + updated = true; + } + + if ( PomHelper.setDependencyVersion( pom, + dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), + newVersion, getProject().getModel() ) ) + { + if ( getLog().isInfoEnabled() ) + { + getLog().info( "Updated " + toString( dep ) + " to version " + newVersion ); + } + getChangeRecorder().recordUpdate( changeRecorderTitle, + dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), + newVersion ); + updated = true; + } + + return updated; + } + + // TODO: add an updatePropertyVersion as well??? (like in CompareDependenciesMojo) } diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java index ca59f3755..0de2e5422 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/AbstractVersionsUpdaterMojo.java @@ -204,10 +204,11 @@ public abstract class AbstractVersionsUpdaterMojo @Parameter( property = "changeRecorderOutputFile", defaultValue = "${project.build.directory}/versions-changes.xml" ) private File changeRecorderOutputFile; + /** * The change recorder implementation. */ - private ChangeRecorder changeRecorder; + private volatile ChangeRecorder changeRecorder; /** *

Allows specifying the {@linkplain RuleSet} object describing rules @@ -316,12 +317,25 @@ public String getVersion() public void execute() throws MojoExecutionException, MojoFailureException { + validateInput(); File outFile = project.getFile(); process( outFile ); } // -------------------------- OTHER METHODS -------------------------- + /** + * Validates input parameters + * + * @throws MojoExecutionException thrown if any of input parameters is invalid + */ + protected void validateInput() throws MojoExecutionException + { + if ( !"none".equals( changeRecorderFormat ) && !"xml".equals( changeRecorderFormat ) ) + { + throw new MojoExecutionException( "Only 'xml' or 'none' formats are supported for change recordings" ); + } + } /** * Finds the latest version of the specified artifact that matches the version range. * @@ -559,24 +573,21 @@ else if ( PomHelper.setPropertyVersion( pom, version.getProfileId(), property.ge * Configure and return the change recorder. * * @return The change recorder - * @throws MojoExecutionException If the provided change recorder format is not valid */ - - protected ChangeRecorder getChangeRecorder() throws MojoExecutionException + protected ChangeRecorder getChangeRecorder() { if ( changeRecorder == null ) { - if ( "none".equals( this.changeRecorderFormat ) ) - { - changeRecorder = ChangeRecorderNull.create(); - } - else if ( "xml".equals( this.changeRecorderFormat ) ) + synchronized ( this ) { - changeRecorder = ChangeRecorderXML.create(); - } - else - { - throw new MojoExecutionException( "Only 'xml' or 'none' formats are supported for change recordings" ); + if ( changeRecorder == null ) + { + changeRecorder = "none".equals( this.changeRecorderFormat ) + ? new ChangeRecorderNull() + : "xml".equals( this.changeRecorderFormat ) + ? new ChangeRecorderXML() + : null; + } } } diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java index eb7d80d8b..cf8e52aec 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/CompareDependenciesMojo.java @@ -51,6 +51,8 @@ import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; import org.codehaus.mojo.versions.utils.DependencyBuilder; +import static java.util.Collections.singletonList; + /** * Compare dependency versions of the current project to dependencies or dependency management of a remote repository * project. Can optionally update locally the project instead of reporting the comparison @@ -181,36 +183,56 @@ protected void update( ModifiedPomXMLEventReader pom ) Map remoteDepsMap = new HashMap<>(); if ( !ignoreRemoteDependencyManagement ) { - List remoteProjectDepMgmtDeps = ( remoteMavenProject.getDependencyManagement() == null ) ? null - : remoteMavenProject.getDependencyManagement().getDependencies(); - mapDependencies( remoteDepsMap, remoteProjectDepMgmtDeps ); + List remoteProjectDepMgmtDeps = remoteMavenProject.getDependencyManagement() == null + ? null + : remoteMavenProject.getDependencyManagement().getDependencies(); + if ( remoteProjectDepMgmtDeps != null ) + { + remoteProjectDepMgmtDeps.forEach( dep -> remoteDepsMap.putIfAbsent( dep.getManagementKey(), dep ) ); + } } - if ( !ignoreRemoteDependencies ) + if ( !ignoreRemoteDependencies && remoteMavenProject.getDependencies() != null ) { - List remoteProjectDeps = remoteMavenProject.getDependencies(); - mapDependencies( remoteDepsMap, remoteProjectDeps ); + remoteMavenProject.getDependencies().forEach( dep -> + remoteDepsMap.putIfAbsent( dep.getManagementKey(), dep ) ); } List totalDiffs = new ArrayList<>(); List propertyDiffs = new ArrayList<>(); if ( getProject().getDependencyManagement() != null && isProcessingDependencyManagement() ) { - List depManDiffs = - compareVersions( pom, getProject().getDependencyManagement().getDependencies(), remoteDepsMap ); - totalDiffs.addAll( depManDiffs ); + totalDiffs.addAll( + compareVersions( pom, getProject().getDependencyManagement().getDependencies(), remoteDepsMap ) ); } if ( getProject().getDependencies() != null && isProcessingDependencies() ) { - List depDiffs = compareVersions( pom, getProject().getDependencies(), remoteDepsMap ); - totalDiffs.addAll( depDiffs ); + totalDiffs.addAll( compareVersions( pom, getProject().getDependencies(), remoteDepsMap ) ); } if ( updatePropertyVersions ) { Map versionProperties = this.getHelper().getVersionPropertiesMap( VersionsHelper.VersionPropertiesMapRequest.builder() .withMavenProject( getProject() ).build() ); - List diff = updatePropertyVersions( pom, versionProperties, remoteDepsMap ); - propertyDiffs.addAll( diff ); + propertyDiffs.addAll( updatePropertyVersions( pom, versionProperties, remoteDepsMap ) ); + } + if ( getProject().getParent() != null + && remoteMavenProject.getParent() != null + && isProcessingParent() ) + { + Dependency parent = DependencyBuilder.newBuilder() + .withGroupId( remoteMavenProject.getParentArtifact().getGroupId() ) + .withArtifactId( remoteMavenProject.getParentArtifact().getArtifactId() ) + .withVersion( remoteMavenProject.getParentArtifact().getVersion() ) + .withType( remoteMavenProject.getParentArtifact().getType() ) + .withScope( remoteMavenProject.getParentArtifact().getScope() ) + .withClassifier( remoteMavenProject.getParentArtifact().getClassifier() ) + .build(); + if ( getLog().isDebugEnabled() ) + { + getLog().debug( "Processing parent dependency: " + parent ); + } + remoteDepsMap.putIfAbsent( parent.getManagementKey(), parent ); + totalDiffs.addAll( compareVersions( pom, singletonList( getParentDependency() ), remoteDepsMap ) ); } if ( reportMode ) @@ -270,19 +292,13 @@ private List compareVersions( ModifiedPomXMLEventReader pom, List map, List deps ) - { - if ( deps != null ) - { - for ( Dependency nextDep : deps ) - { - map.put( nextDep.getManagementKey(), nextDep ); - } - } - } - /** * Creates a key that is similar to what {@link Dependency#getManagementKey()} generates for a dependency. */ diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java index da5b9a0b8..75edfbb47 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java @@ -488,7 +488,6 @@ public void execute() throws MojoExecutionException, MojoFailureException { logInit(); - validateInput(); Set dependencyManagement = new TreeSet<>( DependencyComparator.INSTANCE ); @@ -599,7 +598,8 @@ public void execute() } } - private void validateInput() throws MojoExecutionException + @Override + protected void validateInput() throws MojoExecutionException { validateGAVList( dependencyIncludes, 6, "dependencyIncludes" ); validateGAVList( dependencyExcludes, 6, "dependencyExcludes" ); diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java index 56c981264..564817c33 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/ForceReleasesMojo.java @@ -24,7 +24,6 @@ import java.util.Collection; import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.manager.WagonManager; @@ -32,16 +31,19 @@ import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.model.Dependency; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.repository.RepositorySystem; import org.codehaus.mojo.versions.api.ArtifactVersions; -import org.codehaus.mojo.versions.api.PomHelper; import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; +import static java.util.Collections.singletonList; + /** * Replaces any -SNAPSHOT versions with a release version, older if necessary (if there has been a release). * @@ -52,13 +54,13 @@ public class ForceReleasesMojo extends AbstractVersionsDependencyUpdaterMojo { - - // ------------------------------ FIELDS ------------------------------ - /** - * Pattern to match a snapshot version. + * Whether to fail if a SNAPSHOT could not be replaced + * + * @since 2.14.0 */ - private final Pattern matchSnapshotRegex = Pattern.compile( "^(.+)-((SNAPSHOT)|(\\d{8}\\.\\d{6}-\\d+))$" ); + @Parameter( property = "failIfNotReplaced", defaultValue = "false" ) + protected boolean failIfNotReplaced; // ------------------------------ METHODS -------------------------- @@ -92,6 +94,10 @@ protected void update( ModifiedPomXMLEventReader pom ) { useReleases( pom, getProject().getDependencies() ); } + if ( getProject().getParent() != null && isProcessingParent() ) + { + useReleases( pom, singletonList( getParentDependency() ) ); + } } catch ( ArtifactMetadataRetrievalException e ) { @@ -116,8 +122,7 @@ private void useReleases( ModifiedPomXMLEventReader pom, Collection continue; } - String version = dep.getVersion(); - Matcher versionMatcher = matchSnapshotRegex.matcher( version ); + Matcher versionMatcher = SNAPSHOT_REGEX.matcher( dep.getVersion() ); if ( versionMatcher.matches() ) { String releaseVersion = versionMatcher.group( 1 ); @@ -131,23 +136,24 @@ private void useReleases( ModifiedPomXMLEventReader pom, Collection ArtifactVersions versions = getHelper().lookupArtifactVersions( artifact, false ); if ( versions.containsVersion( releaseVersion ) ) { - if ( PomHelper.setDependencyVersion( pom, dep.getGroupId(), dep.getArtifactId(), version, - releaseVersion, getProject().getModel() ) ) - { - getLog().info( "Updated " + toString( dep ) + " to version " + releaseVersion ); - } + updateDependencyVersion( pom, dep, releaseVersion, "forceReleases" ); } else { - ArtifactVersion[] v = versions.getVersions( false ); - if ( v.length == 0 ) + ArtifactVersion newestRelease = versions.getNewestVersion( (VersionRange) null, null, + false, true ); + if ( newestRelease == null ) { getLog().info( "No release of " + toString( dep ) + " to force." ); + if ( failIfNotReplaced ) + { + throw new MojoExecutionException( "No matching release of " + toString( dep ) + + " found for update." ); + } } - else if ( PomHelper.setDependencyVersion( pom, dep.getGroupId(), dep.getArtifactId(), version, - v[v.length - 1].toString(), getProject().getModel() ) ) + else { - getLog().info( "Reverted " + toString( dep ) + " to version " + v[v.length - 1].toString() ); + updateDependencyVersion( pom, dep, newestRelease.toString(), "forceReleases" ); } } } diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java index 9e17a3594..1e57f49ba 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/LockSnapshotsMojo.java @@ -59,7 +59,7 @@ public class LockSnapshotsMojo /** * Pattern to match a timestamped snapshot version. For example 1.0-20090128.202731-1 */ - private final Pattern matchSnapshotRegex = Pattern.compile( "-" + Artifact.SNAPSHOT_VERSION ); + private static final Pattern TIMESTAMPED_SNAPSHOT_REGEX = Pattern.compile( "-" + Artifact.SNAPSHOT_VERSION ); // ------------------------------ METHODS -------------------------- @@ -120,7 +120,7 @@ private void lockSnapshots( ModifiedPomXMLEventReader pom, Collection de } String version = dep.getVersion(); - Matcher versionMatcher = matchSnapshotRegex.matcher( version ); + Matcher versionMatcher = TIMESTAMPED_SNAPSHOT_REGEX.matcher( version ); if ( versionMatcher.find() && versionMatcher.end() == version.length() ) { String unlockedVersion = versionMatcher.replaceFirst( "-SNAPSHOT" ); @@ -153,7 +153,7 @@ private void unlockParentSnapshot( ModifiedPomXMLEventReader pom, MavenProject p Artifact parentArtifact = parent.getArtifact(); String parentVersion = parentArtifact.getVersion(); - Matcher versionMatcher = matchSnapshotRegex.matcher( parentVersion ); + Matcher versionMatcher = TIMESTAMPED_SNAPSHOT_REGEX.matcher( parentVersion ); if ( versionMatcher.find() && versionMatcher.end() == parentVersion.length() ) { String unlockedParentVersion = versionMatcher.replaceFirst( "-SNAPSHOT" ); diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java index ccd389e0a..9c6b649c0 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java @@ -37,9 +37,10 @@ import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.repository.RepositorySystem; import org.codehaus.mojo.versions.api.ArtifactVersions; -import org.codehaus.mojo.versions.api.PomHelper; import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; +import static java.util.Collections.singletonList; + /** * Updates a dependency to a specific version. * This can be useful if you have to manage versions for a very large (100+ module) projects where you can’t always use @@ -107,6 +108,11 @@ protected void update( ModifiedPomXMLEventReader pom ) { useDepVersion( pom, getProject().getDependencies() ); } + + if ( getProject().getParent() != null && isProcessingParent() ) + { + useDepVersion( pom, singletonList( getParentDependency() ) ); + } } catch ( ArtifactMetadataRetrievalException e ) { @@ -146,17 +152,7 @@ private void useDepVersion( ModifiedPomXMLEventReader pom, Collection !matchSnapshotRegex.matcher( dep.getVersion() ).matches() ); + dep -> !SNAPSHOT_REGEX.matcher( dep.getVersion() ).matches() ); } /** diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java index 8e64ab491..c77452b70 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestSnapshotsMojo.java @@ -27,7 +27,6 @@ import java.util.Collection; import java.util.Optional; import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.manager.WagonManager; @@ -50,7 +49,6 @@ import org.codehaus.mojo.versions.ordering.BoundArtifactVersion; import org.codehaus.mojo.versions.ordering.VersionComparator; import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; -import org.codehaus.mojo.versions.utils.DependencyBuilder; import org.codehaus.mojo.versions.utils.SegmentUtils; import static java.util.Collections.singletonList; @@ -93,13 +91,6 @@ public class UseLatestSnapshotsMojo @Parameter( property = "allowIncrementalUpdates", defaultValue = "true" ) protected boolean allowIncrementalUpdates; - // ------------------------------ FIELDS ------------------------------ - - /** - * Pattern to match a snapshot version. - */ - private final Pattern matchSnapshotRegex = Pattern.compile( "^(.+)-((SNAPSHOT)|(\\d{8}\\.\\d{6}-\\d+))$" ); - // ------------------------------ METHODS -------------------------- @Inject @@ -134,12 +125,7 @@ protected void update( ModifiedPomXMLEventReader pom ) } if ( getProject().getParent() != null && isProcessingParent() ) { - useLatestSnapshots( pom, singletonList( DependencyBuilder.newBuilder() - .withGroupId( getProject().getParent().getGroupId() ) - .withArtifactId( getProject().getParent().getArtifactId() ) - .withVersion( getProject().getParent().getVersion() ) - .withType( "pom" ) - .build() ) ); + useLatestSnapshots( pom, singletonList( getParentDependency() ) ); } } catch ( ArtifactMetadataRetrievalException e ) @@ -169,7 +155,7 @@ private void useLatestSnapshots( ModifiedPomXMLEventReader pom, Collection dependencies ) throws XMLStreamException, MojoExecutionException, ArtifactMetadataRetrievalException { diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java index 05a657a62..90f0deb7a 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseLatestVersionsMojoBase.java @@ -39,7 +39,6 @@ import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.repository.RepositorySystem; import org.codehaus.mojo.versions.api.ArtifactVersions; -import org.codehaus.mojo.versions.api.PomHelper; import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; /** @@ -110,37 +109,12 @@ protected final void useLatestVersions( ModifiedPomXMLEventReader pom, ArtifactVersion selectedVersion = new DefaultArtifactVersion( dep.getVersion() ); getLog().debug( "Selected version:" + selectedVersion ); - getLog().debug( "Looking for newer versions of " + toString( dep ) ); ArtifactVersions versions = getHelper().lookupArtifactVersions( artifact, false ); Optional newestVer = newestVersionProducer.apply( dep, versions ); if ( newestVer.isPresent() ) { - String verStr = newestVer.get().toString(); - if ( getProject().getParent() != null ) - { - final Artifact parentArtifact = getProject().getParentArtifact(); - if ( artifact.getId().equals( parentArtifact.getId() ) && isProcessingParent() ) - { - if ( PomHelper.setProjectParentVersion( pom, verStr ) ) - { - getLog().debug( "Made parent update from " + dep.getVersion() + " to " + verStr ); - - this.getChangeRecorder().recordUpdate( changeRecorderTitle, parentArtifact.getGroupId(), - parentArtifact.getArtifactId(), dep.getVersion(), - verStr ); - } - } - } - if ( PomHelper.setDependencyVersion( pom, dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), - verStr, - getProject().getModel() ) ) - { - getLog().info( "Updated " + toString( dep ) + " to version " + verStr ); - - this.getChangeRecorder().recordUpdate( changeRecorderTitle, dep.getGroupId(), - dep.getArtifactId(), dep.getVersion(), verStr ); - } + updateDependencyVersion( pom, dep, newestVer.get().toString(), changeRecorderTitle ); } } } diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java index 149cc23f0..4f0260390 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextReleasesMojo.java @@ -42,6 +42,8 @@ import org.codehaus.mojo.versions.api.PomHelper; import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; +import static java.util.Collections.singletonList; + /** * Replaces any release versions with the next release version (if it has been released). * @@ -90,6 +92,10 @@ protected void update( ModifiedPomXMLEventReader pom ) { useNextReleases( pom, getProject().getDependencies() ); } + if ( getProject().getParent() != null && isProcessingParent() ) + { + useNextReleases( pom, singletonList( getParentDependency() ) ); + } } private void useNextReleases( ModifiedPomXMLEventReader pom, Collection dependencies ) diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java index b7482490c..f5fe40e8d 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseNextSnapshotsMojo.java @@ -26,7 +26,6 @@ import java.util.Collection; import java.util.Optional; import java.util.regex.Matcher; -import java.util.regex.Pattern; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.manager.WagonManager; @@ -51,6 +50,8 @@ import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; import org.codehaus.mojo.versions.utils.SegmentUtils; +import static java.util.Collections.singletonList; + /** * Replaces any release versions with the next snapshot version (if it has been deployed). * @@ -89,13 +90,6 @@ public class UseNextSnapshotsMojo @Parameter( property = "allowIncrementalUpdates", defaultValue = "true" ) private boolean allowIncrementalUpdates; - // ------------------------------ FIELDS ------------------------------ - - /** - * Pattern to match a snapshot version. - */ - private final Pattern matchSnapshotRegex = Pattern.compile( "^(.+)-((SNAPSHOT)|(\\d{8}\\.\\d{6}-\\d+))$" ); - // ------------------------------ METHODS -------------------------- @Inject @@ -128,6 +122,10 @@ protected void update( ModifiedPomXMLEventReader pom ) { useNextSnapshots( pom, getProject().getDependencies() ); } + if ( getProject().getParent() != null && isProcessingParent() ) + { + useNextSnapshots( pom, singletonList( getParentDependency() ) ); + } } catch ( ArtifactMetadataRetrievalException e ) { @@ -157,7 +155,7 @@ private void useNextSnapshots( ModifiedPomXMLEventReader pom, Collection getLog().info( "Ignoring dependency with no version: " + toString( dep ) ); continue; } - Matcher versionMatcher = matchSnapshotRegex.matcher( version ); + Matcher versionMatcher = SNAPSHOT_REGEX.matcher( version ); if ( versionMatcher.matches() ) { String releaseVersion = versionMatcher.group( 1 ); @@ -284,7 +276,7 @@ private void rangeMatching( ModifiedPomXMLEventReader pom, Dependency dep, Strin getLog().info( "No matching release of " + toString( dep ) + " to update via rangeMatching." ); if ( failIfNotReplaced ) { - throw new NoSuchElementException( "No matching release of " + toString( dep ) + throw new MojoExecutionException( "No matching release of " + toString( dep ) + " found for update via rangeMatching." ); } } diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderNull.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderNull.java index b3c3c2c67..dc8c013c1 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderNull.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderNull.java @@ -20,7 +20,6 @@ */ import java.io.OutputStream; -import java.util.Objects; /** * A recorder that ignores updates. @@ -29,35 +28,20 @@ public class ChangeRecorderNull implements ChangeRecorder { /** - * Create a new change recorder that serializes to XML. - * - * @return A new change recorder + * Creates a new instance */ - - public static ChangeRecorder create() - { - return new ChangeRecorderNull(); - } - - private ChangeRecorderNull() + public ChangeRecorderNull() { - } @Override public final void recordUpdate( final String kind, final String groupId, final String artifactId, final String oldVersion, final String newVersion ) { - Objects.requireNonNull( kind, "kind" ); - Objects.requireNonNull( groupId, "groupId" ); - Objects.requireNonNull( artifactId, "artifactId" ); - Objects.requireNonNull( oldVersion, "oldVersion" ); - Objects.requireNonNull( newVersion, "newVersion" ); } @Override public final void serialize( final OutputStream outputStream ) { - } } diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderXML.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderXML.java index d6b62526d..6fa2a82c4 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderXML.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/recording/ChangeRecorderXML.java @@ -53,21 +53,17 @@ public class ChangeRecorderXML implements ChangeRecorder private final Element root; /** - * Create a new change recorder that serializes to XML. - * - * @return A new change recorder + * Creates a new instance */ - - public static ChangeRecorder create() + public ChangeRecorderXML() { try { final DocumentBuilderFactory documentBuilders = DocumentBuilderFactory.newInstance(); final DocumentBuilder documentBuilder = documentBuilders.newDocumentBuilder(); - final Document document = documentBuilder.newDocument(); - final Element root = document.createElementNS( CHANGES_NAMESPACE, "updates" ); + document = documentBuilder.newDocument(); + root = document.createElementNS( CHANGES_NAMESPACE, "updates" ); document.appendChild( root ); - return new ChangeRecorderXML( document, root ); } catch ( final ParserConfigurationException | DOMException e ) { @@ -75,12 +71,6 @@ public static ChangeRecorder create() } } - private ChangeRecorderXML( final Document document, final Element root ) - { - this.document = Objects.requireNonNull( document, "document" ); - this.root = Objects.requireNonNull( root, "root" ); - } - @Override public final void recordUpdate( final String kind, final String groupId, final String artifactId, final String oldVersion, final String newVersion ) diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java new file mode 100644 index 000000000..e1af267f6 --- /dev/null +++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/ForceReleasesMojoTest.java @@ -0,0 +1,199 @@ +package org.codehaus.mojo.versions; + +import javax.xml.stream.XMLStreamException; + +import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.model.Model; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.testing.AbstractMojoTestCase; +import org.apache.maven.plugin.testing.ArtifactStubFactory; +import org.apache.maven.plugin.testing.stubs.StubArtifactResolver; +import org.apache.maven.project.MavenProject; +import org.codehaus.mojo.versions.api.PomHelper; +import org.codehaus.mojo.versions.change.VersionChange; +import org.codehaus.mojo.versions.utils.DependencyBuilder; +import org.codehaus.mojo.versions.utils.TestChangeRecorder; +import org.junit.Before; +import org.junit.Test; +import org.mockito.MockedStatic; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE; +import static org.codehaus.mojo.versions.utils.MockUtils.mockArtifactMetadataSource; +import static org.codehaus.mojo.versions.utils.MockUtils.mockRepositorySystem; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.startsWith; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mockStatic; + +/* + * 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. + */ + +/** + * Unit tests for {@link ForceReleasesMojo} + */ +public class ForceReleasesMojoTest extends AbstractMojoTestCase +{ + private TestChangeRecorder changeRecorder; + private ForceReleasesMojo mojo; + + @Before + public void setUp() throws IllegalAccessException + { + changeRecorder = new TestChangeRecorder(); + mojo = new ForceReleasesMojo( mockRepositorySystem(), + null, mockArtifactMetadataSource(), + null, new StubArtifactResolver( new ArtifactStubFactory(), + false, false ) ); + setVariableValueToObject( mojo, "reactorProjects", emptyList() ); + setVariableValueToObject( mojo, "changeRecorder", changeRecorder ); + mojo.project = new MavenProject() + {{ + setModel( new Model() + {{ + setGroupId( "default-group" ); + setArtifactId( "default-artifact" ); + setVersion( "1.0.0" ); + }} ); + }}; + } + + @Test + public void testProcessParent() + throws MojoExecutionException, XMLStreamException, MojoFailureException, IllegalAccessException + { + setVariableValueToObject( mojo, "processParent", true ); + mojo.getProject().setParent( new MavenProject( new Model() + {{ + setGroupId( "default-group" ); + setArtifactId( "artifactA" ); + setVersion( "1.0.0-SNAPSHOT" ); + }} ) ); + mojo.getProject().setParentArtifact( new DefaultArtifact( "default-group", "artifactA", + "1.0.0-SNAPSHOT", SCOPE_COMPILE, "pom", "default", null ) ); + + try ( MockedStatic pomHelper = mockStatic( PomHelper.class ) ) + { + pomHelper.when( () -> PomHelper.setProjectParentVersion( any(), anyString() ) ) + .thenReturn( true ); + mojo.update( null ); + } + assertThat( changeRecorder.getChanges(), + hasItem( new VersionChange( "default-group", "artifactA", + "1.0.0-SNAPSHOT", "1.0.0" ) ) ); + } + + @Test + public void testReplaceSnapshotWithRelease() + throws MojoExecutionException, XMLStreamException, MojoFailureException + { + mojo.getProject().setDependencies( singletonList( DependencyBuilder.newBuilder() + .withGroupId( "default-group" ) + .withArtifactId( "artifactA" ) + .withVersion( "1.0.0-SNAPSHOT" ) + .build() ) ); + + try ( MockedStatic pomHelper = mockStatic( PomHelper.class ) ) + { + pomHelper.when( () -> PomHelper.setDependencyVersion( any(), anyString(), anyString(), anyString(), + anyString(), any( Model.class ) ) ) + .thenReturn( true ); + mojo.update( null ); + } + assertThat( changeRecorder.getChanges(), + hasItem( new VersionChange( "default-group", "artifactA", + "1.0.0-SNAPSHOT", "1.0.0" ) ) ); + } + + @Test + public void testUpgrade() + throws MojoExecutionException, XMLStreamException, MojoFailureException + { + mojo.getProject().setDependencies( singletonList( DependencyBuilder.newBuilder() + .withGroupId( "default-group" ) + .withArtifactId( "artifactA" ) + .withVersion( "1.1.0-SNAPSHOT" ) + .build() ) ); + + try ( MockedStatic pomHelper = mockStatic( PomHelper.class ) ) + { + pomHelper.when( () -> PomHelper.setDependencyVersion( any(), anyString(), anyString(), anyString(), + anyString(), any( Model.class ) ) ) + .thenReturn( true ); + mojo.update( null ); + } + assertThat( changeRecorder.getChanges(), + hasItem( new VersionChange( "default-group", "artifactA", + "1.1.0-SNAPSHOT", "2.0.0" ) ) ); + } + + @Test + public void testDowngrade() + throws MojoExecutionException, XMLStreamException, MojoFailureException + { + mojo.getProject().setDependencies( singletonList( DependencyBuilder.newBuilder() + .withGroupId( "default-group" ) + .withArtifactId( "artifactA" ) + .withVersion( "2.1.0-SNAPSHOT" ) + .build() ) ); + + try ( MockedStatic pomHelper = mockStatic( PomHelper.class ) ) + { + pomHelper.when( () -> PomHelper.setDependencyVersion( any(), anyString(), anyString(), anyString(), + anyString(), any( Model.class ) ) ) + .thenReturn( true ); + mojo.update( null ); + } + assertThat( changeRecorder.getChanges(), + hasItem( new VersionChange( "default-group", "artifactA", + "2.1.0-SNAPSHOT", "2.0.0" ) ) ); + } + + @Test + public void testFailIfNotReplaced() + throws MojoExecutionException, XMLStreamException, MojoFailureException + { + mojo.artifactMetadataSource = mockArtifactMetadataSource( singletonMap( "test-artifact", + new String[] {} ) ); + mojo.getProject().setDependencies( singletonList( DependencyBuilder.newBuilder() + .withGroupId( "default-group" ) + .withArtifactId( "test-artifact" ) + .withVersion( "1.0.0-SNAPSHOT" ) + .build() ) ); + mojo.failIfNotReplaced = true; + + try ( MockedStatic pomHelper = mockStatic( PomHelper.class ) ) + { + pomHelper.when( () -> PomHelper.setDependencyVersion( any(), anyString(), anyString(), anyString(), + anyString(), any( Model.class ) ) ) + .thenReturn( true ); + mojo.update( null ); + fail( "MojoExecutionException is expected" ); + } + catch ( MojoExecutionException e ) + { + assertThat( e.getMessage(), startsWith( "No matching" ) ); + } + } +} diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java index beb93a2b8..5e880c70e 100644 --- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java +++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestReleasesMojoTest.java @@ -20,6 +20,7 @@ import org.junit.Test; import org.mockito.MockedStatic; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE; import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject; @@ -59,6 +60,7 @@ public void setUp() throws Exception null, null ) {{ + reactorProjects = emptyList(); MavenProject project = new MavenProject() {{ setModel( new Model() diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java index ac0a033d9..98c5a34f1 100644 --- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java +++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseLatestVersionsMojoTest.java @@ -24,6 +24,7 @@ import org.junit.Test; import org.mockito.MockedStatic; +import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE; import static org.apache.maven.plugin.testing.ArtifactStubFactory.setVariableValueToObject; @@ -71,6 +72,7 @@ public void setUp() throws Exception null, null ) {{ + reactorProjects = emptyList(); MavenProject project = new MavenProject() {{ setModel( new Model() @@ -90,10 +92,10 @@ public void setUp() throws Exception }} ); }}; setProject( project ); - - changeRecorder = new TestChangeRecorder(); - setVariableValueToObject( this, "changeRecorder", changeRecorder ); }}; + changeRecorder = new TestChangeRecorder(); + setVariableValueToObject( mojo, "processDependencyManagement", false ); + setVariableValueToObject( mojo, "changeRecorder", changeRecorder ); } @Test diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/recording/ChangeRecorderXMLTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/recording/ChangeRecorderXMLTest.java index c5cb59a07..32c602805 100644 --- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/recording/ChangeRecorderXMLTest.java +++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/recording/ChangeRecorderXMLTest.java @@ -64,7 +64,7 @@ public void testChanges() throws Exception copyResource( "expectedFile.xml", file0 ); - final ChangeRecorder recorder = ChangeRecorderXML.create(); + final ChangeRecorder recorder = new ChangeRecorderXML(); recorder.recordUpdate( "exampleKind", "org.codehaus", "example0", "0.0.1", "0.0.2" ); recorder.recordUpdate( "exampleKind", "org.codehaus", "example1", "1.0.0", "2.0.0" );