diff --git a/versions-maven-plugin/src/it/it-set-005-properties/invoker.properties b/versions-maven-plugin/src/it/it-set-005-properties/invoker.properties
new file mode 100644
index 0000000000..856b847dbd
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-005-properties/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:set
+invoker.mavenOpts = -DnewVersion=1.2.1-SNAPSHOT -Drevision=1.2.0
diff --git a/versions-maven-plugin/src/it/it-set-005-properties/module-a1/pom.xml b/versions-maven-plugin/src/it/it-set-005-properties/module-a1/pom.xml
new file mode 100644
index 0000000000..cff5ec29e8
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-005-properties/module-a1/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ localdomain.localhost
+ project-a
+ ${revision}
+
+
+ 4.0.0
+ localdomain.localhost
+ module-a1
+ pom
+ 2.0.7-SNAPSHOT
+
+
diff --git a/versions-maven-plugin/src/it/it-set-005-properties/module-a2/pom.xml b/versions-maven-plugin/src/it/it-set-005-properties/module-a2/pom.xml
new file mode 100644
index 0000000000..db808c5072
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-005-properties/module-a2/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ localdomain.localhost
+ project-a
+ ${revision}
+
+
+ 4.0.0
+ localdomain.localhost
+ module-a2
+ pom
+ ${revision}
+
+
diff --git a/versions-maven-plugin/src/it/it-set-005-properties/pom.xml b/versions-maven-plugin/src/it/it-set-005-properties/pom.xml
new file mode 100644
index 0000000000..6b8590b851
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-005-properties/pom.xml
@@ -0,0 +1,104 @@
+
+
+
+ 4.0.0
+ localdomain.localhost
+ project-a
+ pom
+ ${revision}
+ mversions-71
+
+
+ invoking versions:set on root module should not update child module versions
+ unless they are the same as the parent old version
+
+
+
+ module-a1
+ module-a2
+
+
+
+
+
+
+ maven-antrun-plugin
+ 1.1
+
+
+ maven-assembly-plugin
+ 2.2-beta-2
+
+
+ maven-clean-plugin
+ 2.2
+
+
+ maven-compiler-plugin
+ 2.0.2
+
+
+ maven-dependency-plugin
+ 2.0
+
+
+ maven-deploy-plugin
+ 2.3
+
+
+ maven-ear-plugin
+ 2.3.1
+
+
+ maven-ejb-plugin
+ 2.1
+
+
+ maven-install-plugin
+ 2.2
+
+
+ maven-jar-plugin
+ 2.2
+
+
+ maven-javadoc-plugin
+ 2.4
+
+
+ maven-plugin-plugin
+ 2.4.1
+
+
+ maven-rar-plugin
+ 2.2
+
+
+ maven-release-plugin
+ 2.0-beta-7
+
+
+ maven-resources-plugin
+ 2.2
+
+
+ maven-site-plugin
+ 2.0
+
+
+ maven-source-plugin
+ 2.0.4
+
+
+ maven-surefire-plugin
+ 2.4.2
+
+
+ maven-war-plugin
+ 2.1-alpha-1
+
+
+
+
+
+
diff --git a/versions-maven-plugin/src/it/it-set-005-properties/verify.groovy b/versions-maven-plugin/src/it/it-set-005-properties/verify.groovy
new file mode 100644
index 0000000000..58de3b9548
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-005-properties/verify.groovy
@@ -0,0 +1,12 @@
+import groovy.xml.XmlSlurper
+
+def parentPom = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) )
+assert parentPom.version == '1.2.1-SNAPSHOT'
+
+def moduleA1 = new XmlSlurper().parse( new File( basedir, 'module-a1/pom.xml' ) )
+assert moduleA1.parent.version == '1.2.1-SNAPSHOT'
+
+def moduleA2 = new XmlSlurper().parse( new File( basedir, 'module-a2/pom.xml' ) )
+assert moduleA2.parent.version == '1.2.1-SNAPSHOT'
+assert moduleA2.version == '1.2.1-SNAPSHOT'
+
diff --git a/versions-maven-plugin/src/it/it-set-005/verify.bsh b/versions-maven-plugin/src/it/it-set-005/verify.bsh
deleted file mode 100644
index 6662838851..0000000000
--- a/versions-maven-plugin/src/it/it-set-005/verify.bsh
+++ /dev/null
@@ -1,88 +0,0 @@
-import java.io.*;
-import org.codehaus.plexus.util.FileUtils;
-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\\s*1\\.2\\.1-SNAPSHOT\\s*\\Q\\E" );
- Matcher m = p.matcher( buf.toString() );
- if ( !m.find() )
- {
- System.out.println( "Did not set new version in parent pom" );
- return false;
- }
-
- file = new File( basedir, "module-a1/pom.xml" );
-
- in = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) );
- buf = new StringBuilder();
- line = in.readLine();
- while ( line != null )
- {
- buf.append( line );
- buf.append( " " );
- line = in.readLine();
- }
-
- p = Pattern.compile( "\\Q\\E.*\\Q\\E\\s*1\\.2\\.1-SNAPSHOT\\s*\\Q\\E.*\\Q\\E" );
- m = p.matcher( buf.toString() );
- if ( !m.find() )
- {
- System.out.println( "Did not update parent version in module-a1/pom" );
- return false;
- }
- p = Pattern.compile( "\\Q\\E.*\\Q\\E\\s*2\\.0\\.7-SNAPSHOT\\s*\\Q\\E" );
- m = p.matcher( buf.toString() );
- if ( !m.find() )
- {
- System.out.println( "Did update child version in module-a1/pom" );
- return false;
- }
-
- file = new File( basedir, "module-a2/pom.xml" );
-
- in = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) );
- buf = new StringBuilder();
- line = in.readLine();
- while ( line != null )
- {
- buf.append( line );
- buf.append( " " );
- line = in.readLine();
- }
-
- p = Pattern.compile( "\\Q\\E.*\\Q\\E\\s*1\\.2\\.1-SNAPSHOT\\s*\\Q\\E.*\\Q\\E" );
- m = p.matcher( buf.toString() );
- if ( !m.find() )
- {
- System.out.println( "Did not update parent version in module-a2/pom" );
- return false;
- }
- p = Pattern.compile( "\\Q\\E.*\\Q\\E\\s*1\\.2\\.1-SNAPSHOT\\s*\\Q\\E" );
- m = p.matcher( buf.toString() );
- if ( !m.find() )
- {
- System.out.println( "Did not update child version in module-a2/pom" );
- return false;
- }
-
-}
-catch( Throwable t )
-{
- t.printStackTrace();
- return false;
-}
-
-return true;
diff --git a/versions-maven-plugin/src/it/it-set-005/verify.groovy b/versions-maven-plugin/src/it/it-set-005/verify.groovy
new file mode 100644
index 0000000000..958c1c389c
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-005/verify.groovy
@@ -0,0 +1,11 @@
+import groovy.xml.XmlSlurper
+
+def parentPom = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) )
+assert parentPom.version == '1.2.1-SNAPSHOT'
+
+def moduleA1 = new XmlSlurper().parse( new File( basedir, 'module-a1/pom.xml' ) )
+assert moduleA1.parent.version == '1.2.1-SNAPSHOT'
+
+def moduleA2 = new XmlSlurper().parse( new File( basedir, 'module-a2/pom.xml' ) )
+assert moduleA2.parent.version == '1.2.1-SNAPSHOT'
+
diff --git a/versions-maven-plugin/src/it/it-set-issue-916-properties/invoker.properties b/versions-maven-plugin/src/it/it-set-issue-916-properties/invoker.properties
new file mode 100644
index 0000000000..0f968fa27a
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-issue-916-properties/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:set
+invoker.mavenOpts = -Drevision=1.0 -DnewVersion=TEST
diff --git a/versions-maven-plugin/src/it/it-set-issue-916-properties/pom.xml b/versions-maven-plugin/src/it/it-set-issue-916-properties/pom.xml
new file mode 100644
index 0000000000..3da8c85c1a
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-issue-916-properties/pom.xml
@@ -0,0 +1,10 @@
+
+ 4.0.0
+
+ default-group
+ default-artifact
+ ${revision}-SNAPSHOT
+ pom
+
+
diff --git a/versions-maven-plugin/src/it/it-set-issue-916-properties/verify.groovy b/versions-maven-plugin/src/it/it-set-issue-916-properties/verify.groovy
new file mode 100644
index 0000000000..efdb6445ad
--- /dev/null
+++ b/versions-maven-plugin/src/it/it-set-issue-916-properties/verify.groovy
@@ -0,0 +1,4 @@
+import groovy.xml.XmlSlurper
+
+def project = new XmlSlurper().parse( new File( basedir, 'pom.xml' ) )
+assert project.version == 'TEST'
diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java
index 4ae1df5267..93f56e271c 100644
--- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java
+++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java
@@ -35,7 +35,6 @@
import java.util.TimeZone;
import java.util.TreeMap;
import java.util.regex.Pattern;
-import java.util.stream.Collectors;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.model.Model;
@@ -85,42 +84,54 @@ public class SetMojo extends AbstractVersionsUpdaterMojo {
private String newVersion;
/**
- * The groupId of the dependency/module to update.
- * If you like to update modules of a aggregator you
- * should set -DgroupId='*'
to ignore the
- * group of the current project. On Windows you can omit
- * the single quotes on Linux they are necessary to prevent
- * expansion through the shell.
+ * If set to {@code true}, will process all modules regardless whether they
+ * match {@code groupId:artifactId:oldVersion}.
+ *
+ * @since 2.5
+ */
+ @Parameter(property = "processAllModules", defaultValue = "false")
+ private boolean processAllModules;
+
+ /**
+ *
The non-interpolated groupId of the dependency/module to be selected for update.
+ * If not set, will be equal to the non-interpolated groupId of the project file.
+ * If you wish to update modules of a aggregator regardless of the groupId, you
+ * should set {@code -DgroupId='*'} to ignore the groupId of the current project.
+ * Alternatively, you can use {@code -DprocessAllModules=true}
+ * The goal does not interpolate the properties used in groupId used in the pom.xml file.
+ * The single quotes are only necessary on POSIX-compatible shells (Linux, MacOS, etc.).
*
* @since 1.2
*/
- @Parameter(property = "groupId", defaultValue = "${project.groupId}")
+ @Parameter(property = "groupId")
private String groupId;
/**
- * The artifactId of the dependency/module to update.
- * If you like to update modules of a aggregator you
- * should set -DartifactId='*'
to ignore the
- * artifactId of the current project. On Windows you can omit
- * the single quotes on Linux they are necessary to prevent
- * expansion through the shell.
+ * The non-interpolated artifactId of the dependency/module to be selected for update.
+ * If not set, will be equal to the non-interpolated artifactId of the project file.
+ * If you wish to update modules of a aggregator regardless of the artifactId, you
+ * should set {@code -DartifactId='*'} to ignore the artifactId of the current project.
+ * Alternatively, you can use {@code -DprocessAllModules=true}
+ * The goal does not interpolate the properties used in artifactId used in the pom.xml file.
+ * The single quotes are only necessary on POSIX-compatible shells (Linux, MacOS, etc.).
*
* @since 1.2
*/
- @Parameter(property = "artifactId", defaultValue = "${project.artifactId}")
+ @Parameter(property = "artifactId")
private String artifactId;
/**
- * The version of the dependency/module to update.
- * If you are changing an aggregator you should give
- * -DoldVersion='*'
to suppress the check against the
- * version of the current project. On Windows you can omit
- * the single quotes on Linux they are necessary to prevent
- * expansion through the shell.
+ * The non-interpolated version of the dependency/module to be selected for update.
+ * If not set, will be equal to the non-interpolated version of the project file.
+ * If you wish to update modules of a aggregator regardless of the version, you
+ * should set {@code -Dversion='*'} to ignore the version of the current project.
+ * Alternatively, you can use {@code -DprocessAllModules=true}
+ * The goal does not interpolate the properties used in version used in the pom.xml file.
+ * The single quotes are only necessary on POSIX-compatible shells (Linux, MacOS, etc.).
*
* @since 1.2
*/
- @Parameter(property = "oldVersion", defaultValue = "${project.version}")
+ @Parameter(property = "oldVersion")
private String oldVersion;
/**
@@ -198,14 +209,6 @@ public class SetMojo extends AbstractVersionsUpdaterMojo {
@Parameter(property = "nextSnapshotIndexToIncrement")
protected Integer nextSnapshotIndexToIncrement;
- /**
- * Whether to process all modules whereas they have parent/child or not.
- *
- * @since 2.5
- */
- @Parameter(property = "processAllModules", defaultValue = "false")
- private boolean processAllModules;
-
/**
* Whether to start processing at the local aggregation root (which might be a parent module
* of that module where Maven is executed in, and the version change may affect parent and sibling modules).
@@ -247,15 +250,6 @@ public class SetMojo extends AbstractVersionsUpdaterMojo {
*/
protected final ProjectBuilder projectBuilder;
- /**
- * If set to {@code false}, the plugin will not interpolate property values when looking for versions
- * to be changed, but will instead operate on raw model.
- *
- * @since 2.15.0
- */
- @Parameter(property = "interpolateProperties", defaultValue = "true")
- protected boolean interpolateProperties = true;
-
@Inject
public SetMojo(
RepositorySystem repositorySystem,
@@ -344,35 +338,45 @@ public void execute() throws MojoExecutionException, MojoFailureException {
// set of files to update
final Set files = new LinkedHashSet<>();
- getLog().info("Processing change of " + groupId + ":" + artifactId + ":" + oldVersion + " -> "
- + newVersion);
- Pattern groupIdRegex =
- Pattern.compile(RegexUtils.convertWildcardsToRegex(fixNullOrEmpty(groupId, "*"), true));
- Pattern artifactIdRegex =
- Pattern.compile(RegexUtils.convertWildcardsToRegex(fixNullOrEmpty(artifactId, "*"), true));
- Pattern oldVersionIdRegex =
- Pattern.compile(RegexUtils.convertWildcardsToRegex(fixNullOrEmpty(oldVersion, "*"), true));
+ // groupId, artifactId, oldVersion are matched against every module of the project to see if the module
+ // needs to be changed as well
+ // setting them to the main project coordinates in case they are not set by the user,
+ // so that the main project can be selected
+ Model rootModel = reactorModels.get(session.getCurrentProject().getFile());
+ if (groupId == null) {
+ groupId = rootModel.getGroupId();
+ }
+ if (artifactId == null) {
+ artifactId = rootModel.getArtifactId();
+ }
+ if (oldVersion == null) {
+ oldVersion = rootModel.getVersion();
+ }
+
+ getLog().info(String.format(
+ "Processing change of %s:%s:%s -> %s", groupId, artifactId, oldVersion, newVersion));
+
+ Pattern groupIdRegex = processAllModules || StringUtils.isBlank(groupId) || "*".equals(groupId)
+ ? null
+ : Pattern.compile(RegexUtils.convertWildcardsToRegex(groupId, true));
+ Pattern artifactIdRegex = processAllModules || StringUtils.isBlank(artifactId) || "*".equals(artifactId)
+ ? null
+ : Pattern.compile(RegexUtils.convertWildcardsToRegex(artifactId, true));
+ Pattern oldVersionIdRegex = processAllModules || StringUtils.isBlank(oldVersion) || "*".equals(oldVersion)
+ ? null
+ : Pattern.compile(RegexUtils.convertWildcardsToRegex(oldVersion, true));
for (Model m : reactor.values()) {
String mGroupId = PomHelper.getGroupId(m);
String mArtifactId = PomHelper.getArtifactId(m);
String mVersion = PomHelper.getVersion(m);
- if (interpolateProperties) {
- assert m.getProperties() != null; // always non-null
- Map properties = m.getProperties().entrySet().stream()
- .collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue()
- .toString()));
-
- mGroupId = PomHelper.evaluate(mGroupId, properties);
- mArtifactId = PomHelper.evaluate(mArtifactId, properties);
- mVersion = PomHelper.evaluate(mVersion, properties);
- }
-
- if ((processAllModules
- || groupIdRegex.matcher(mGroupId).matches()
- && artifactIdRegex.matcher(mArtifactId).matches())
- && oldVersionIdRegex.matcher(mVersion).matches()
+ if ((groupIdRegex == null || groupIdRegex.matcher(mGroupId).matches())
+ && (artifactIdRegex == null
+ || artifactIdRegex.matcher(mArtifactId).matches())
+ && (mVersion == null
+ || oldVersionIdRegex == null
+ || oldVersionIdRegex.matcher(mVersion).matches())
&& !newVersion.equals(mVersion)) {
applyChange(
project,
diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java
index 9bec548845..4ffcdf081e 100644
--- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java
+++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java
@@ -156,9 +156,11 @@ public void testSetOldVersionMismatchProcessAllModules() throws Exception {
setVariableValueToObject(mojo, "newVersion", "bar");
setVariableValueToObject(mojo, "processAllModules", true);
mojo.execute();
+ // with processAllModules, the module *should* be selected for update
+ // regardless of the version
assertThat(
String.join("", Files.readAllLines(tempDir.resolve("pom.xml"))),
- not(containsString("bar")));
+ containsString("bar"));
}
private void testSetParameterValue(String filename, Consumer... initializers) throws Exception {
@@ -168,9 +170,8 @@ private void testSetParameterValue(String filename, Consumer... initial
SetMojo mojo = (SetMojo) mojoRule.lookupConfiguredMojo(tempDir.toFile(), "set");
Stream.of(initializers).forEachOrdered(i -> i.accept(mojo));
mojo.execute();
- assertThat(
- String.join("", Files.readAllLines(tempDir.resolve("pom.xml"))),
- containsString("testing"));
+ String output = String.join("", Files.readAllLines(tempDir.resolve("pom.xml")));
+ assertThat(output, containsString("testing"));
}
@Test
@@ -178,28 +179,6 @@ public void testSetParameterValueSimple() throws Exception {
testSetParameterValue("pom-simple.xml");
}
- @Test
- public void testSetParameterValueSimpleNoInterpolation() throws Exception {
- try {
- testSetParameterValue("pom-simple.xml", mojo -> mojo.interpolateProperties = false);
- fail();
- } catch (AssertionError e) {
- assertThat(e.getMessage(), containsString("Expected: a string containing \"testing"));
- }
- }
-
- @Test
- public void testSetParameterValueSimpleNoInterpolationWildcard() throws Exception {
- testSetParameterValue("pom-simple.xml", mojo -> {
- mojo.interpolateProperties = false;
- try {
- setVariableValueToObject(mojo, "oldVersion", "*");
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- });
- }
-
@Test
public void testSetParameterValueBuildNumber() throws Exception {
testSetParameterValue("pom-build-number.xml");
@@ -215,6 +194,11 @@ public void testSetParameterValueMultipleProps() throws Exception {
testSetParameterValue("pom-multiple-props.xml");
}
+ @Test
+ public void testSetParameterValuePartial() throws Exception {
+ testSetParameterValue("pom-revision.xml");
+ }
+
@Test
public void testParentWithProperty() throws Exception {
TestUtils.copyDir(
diff --git a/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-revision.xml b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-revision.xml
new file mode 100644
index 0000000000..ff0806fe92
--- /dev/null
+++ b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-revision.xml
@@ -0,0 +1,24 @@
+
+ org.example
+ test-versions
+ ${revision}-SNAPSHOT
+ 4.0.0
+
+
+
+
+ org.codehaus.mojo
+ versions-maven-plugin
+
+ set
+
+
+ testing
+ false
+
+
+
+
+