You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2022/03/12 21:20:05 UTC
[maven-release] branch master updated: [MRELEASE-899] release:prepare should not change the line separator but detect effective line separator from pom.xml
This is an automated email from the ASF dual-hosted git repository.
michaelo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-release.git
The following commit(s) were added to refs/heads/master by this push:
new 8675beb [MRELEASE-899] release:prepare should not change the line separator but detect effective line separator from pom.xml
8675beb is described below
commit 8675bebad3342b0b2d4573e3e337a39225d110cf
Author: henken <ka...@googlemail.com>
AuthorDate: Mon Jan 3 12:35:45 2022 +0100
[MRELEASE-899] release:prepare should not change the line separator but detect effective line separator from pom.xml
This closes #62
---
.../shared/release/config/ReleaseDescriptor.java | 7 ++
.../release/config/ReleaseDescriptorBuilder.java | 16 +++-
.../release/phase/AbstractRewritePomsPhase.java | 13 ---
.../shared/release/transform/ModelETLRequest.java | 15 +---
.../src/main/mdo/release-descriptor.mdo | 9 +++
.../phase/RewritePomsForBranchPhaseTest.java | 5 +-
.../phase/RewritePomsForReleasePhaseTest.java | 5 +-
.../maven/plugins/release/PrepareReleaseMojo.java | 93 +++++++++++++++++++++-
.../plugins/release/PrepareReleaseMojoTest.java | 68 ++++++++++++++--
.../test/resources/mojos/prepare/.gitattributes | 1 +
10 files changed, 189 insertions(+), 43 deletions(-)
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 312584d..dbf1453 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
@@ -568,6 +568,13 @@ public interface ReleaseDescriptor
String getAutoResolveSnapshots();
/**
+ * Get the line separator to use in the pom.xml.
+ *
+ * @return String
+ */
+ String getLineSeparator();
+
+ /**
* Determines whether the {@code --pin-externals} option in {@code svn copy} command is enabled
* which is new in Subversion 1.9.
*
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 a59ea32..1cf3f9c 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
@@ -22,6 +22,7 @@ package org.apache.maven.shared.release.config;
import java.util.List;
import org.apache.maven.model.Scm;
+import org.apache.maven.shared.release.util.ReleaseUtil;
/**
* <p>ReleaseDescriptorBuilder class.</p>
@@ -52,6 +53,7 @@ public class ReleaseDescriptorBuilder
public ReleaseDescriptorBuilder()
{
this.releaseDescriptor = new BuilderReleaseDescriptor();
+ this.releaseDescriptor.setLineSeparator( ReleaseUtil.LS );
}
/**
@@ -259,6 +261,18 @@ public class ReleaseDescriptorBuilder
}
/**
+ * <p>setLineSeparator.</p>
+ *
+ * @param ls a {@link java.lang.String} object
+ * @return a {@link org.apache.maven.shared.release.config.ReleaseDescriptorBuilder} object
+ */
+ public ReleaseDescriptorBuilder setLineSeparator( String ls )
+ {
+ releaseDescriptor.setLineSeparator( ls );
+ return this;
+ }
+
+ /**
* <p>setLocalCheckout.</p>
*
* @param localCheckout a boolean
@@ -856,7 +870,7 @@ public class ReleaseDescriptorBuilder
return this;
}
- BuilderReleaseDescriptor build()
+ public BuilderReleaseDescriptor build()
{
return releaseDescriptor;
}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
index f9eba32..3e5525d 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
@@ -102,18 +102,6 @@ public abstract class AbstractRewritePomsPhase
return scmTranslators;
}
- private String ls = ReleaseUtil.LS;
-
- /**
- * <p>Setter for the field <code>ls</code>.</p>
- *
- * @param ls a {@link java.lang.String} object
- */
- public void setLs( String ls )
- {
- this.ls = ls;
- }
-
/**
* <p>Setter for the field <code>modelETL</code>.</p>
*
@@ -220,7 +208,6 @@ public abstract class AbstractRewritePomsPhase
File pomFile = ReleaseUtil.getStandardPom( project );
ModelETLRequest request = new ModelETLRequest();
- request.setLineSeparator( ls );
request.setProject( project );
request.setReleaseDescriptor( releaseDescriptor );
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLRequest.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLRequest.java
index c39c56f..85083f0 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLRequest.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/transform/ModelETLRequest.java
@@ -30,30 +30,19 @@ import org.apache.maven.shared.release.config.ReleaseDescriptor;
*/
public class ModelETLRequest
{
- private String lineSeparator;
private MavenProject project;
private ReleaseDescriptor releaseDescriptor;
/**
- * <p>Getter for the field <code>lineSeparator</code>.</p>
+ * <p>Getter for the field <code>releaseDescriptor.lineSeparator</code>.</p>
*
* @return a {@link java.lang.String} object
*/
public String getLineSeparator()
{
- return lineSeparator;
- }
-
- /**
- * <p>Setter for the field <code>lineSeparator</code>.</p>
- *
- * @param lineSeparator a {@link java.lang.String} object
- */
- public void setLineSeparator( String lineSeparator )
- {
- this.lineSeparator = lineSeparator;
+ return releaseDescriptor.getLineSeparator();
}
/**
diff --git a/maven-release-manager/src/main/mdo/release-descriptor.mdo b/maven-release-manager/src/main/mdo/release-descriptor.mdo
index 6ee0b95..1e8eeff 100644
--- a/maven-release-manager/src/main/mdo/release-descriptor.mdo
+++ b/maven-release-manager/src/main/mdo/release-descriptor.mdo
@@ -604,6 +604,15 @@
</description>
</field>
+ <field>
+ <name>lineSeparator</name>
+ <version>3.0.0+</version>
+ <type>String</type>
+ <description>
+ Specifies the line separator to use in the pom.xml.
+ </description>
+ </field>
+
<!-- Announcement Information
Announcement related info, this can be a second part of the process.
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java
index aee022c..3748749 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhaseTest.java
@@ -433,8 +433,9 @@ public class RewritePomsForBranchPhaseTest
mapNextVersion( builder, "groupId:artifactId" );
AbstractRewritePomsPhase phase = (AbstractRewritePomsPhase) this.phase;
- phase.setLs( "\r\n" );
- phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
+ ReleaseDescriptorBuilder.BuilderReleaseDescriptor builderReleaseDescriptor = ReleaseUtils.buildReleaseDescriptor( builder );
+ builderReleaseDescriptor.setLineSeparator("\r\n");
+ phase.execute( builderReleaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
// compare POMS without line ending normalization
assertTrue( comparePomFiles( reactorProjects, false ) );
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
index 54fc130..f221f4e 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
@@ -434,8 +434,9 @@ public class RewritePomsForReleasePhaseTest
mapNextVersion( builder, "groupId:artifactId" );
RewritePomsForReleasePhase phase = (RewritePomsForReleasePhase) this.phase;
- phase.setLs( "\r\n" );
- phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
+ ReleaseDescriptorBuilder.BuilderReleaseDescriptor builderReleaseDescriptor = ReleaseUtils.buildReleaseDescriptor( builder );
+ builderReleaseDescriptor.setLineSeparator("\r\n");
+ phase.execute(builderReleaseDescriptor , new DefaultReleaseEnvironment(), reactorProjects );
// compare POMS without line ending normalization
assertTrue( comparePomFiles( reactorProjects, false ) );
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 5547380..afbd853 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
@@ -19,6 +19,9 @@ package org.apache.maven.plugins.release;
* under the License.
*/
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.Arrays;
import org.apache.maven.plugin.MojoExecutionException;
@@ -282,8 +285,8 @@ public class PrepareReleaseMojo
*
* @since 3.0.0-M5
*/
- @Parameter(
- defaultValue = "@{prefix} prepare for next development iteration",
+ @Parameter(
+ defaultValue = "@{prefix} prepare for next development iteration",
property = "scmDevelopmentCommitComment" )
private String scmDevelopmentCommitComment = "@{prefix} prepare for next development iteration";
@@ -299,7 +302,7 @@ public class PrepareReleaseMojo
* <li>"reports" or "3": resolve report dependencies</li>
* <li>"extensions" or "4": resolve extension dependencies</li>
* </ul>
- *
+ *
* @since 3.0.0-M5
*/
@Parameter( property = "autoResolveSnapshots" )
@@ -314,6 +317,25 @@ public class PrepareReleaseMojo
@Parameter( defaultValue = "false", property = "pinExternals" )
private boolean pinExternals;
+ /**
+ * Specifies the line separator to format pom.xml. The default value is system. The following properties are
+ * available:
+ * <ul>
+ * <li><code>system</code> - Use the system line separator.</li>
+ * <li><code>lf</code> - Use \n as line separator.</li>
+ * <li><code>cr</code> - Use \r as line separator.</li>
+ * <li><code>crlf</code> - Use \r\n as line separator.</li>
+ * <li><code>source</code> - Use the same line separator as it is specified in the current pom.xml.</li>
+ * </ul>
+ *
+ * @since 3.0.0
+ */
+ @Parameter( defaultValue = "source", property = "lineSeparator" )
+ private String lineSeparator;
+
+ /**
+ * {@inheritDoc}
+ */
@Override
public void execute()
throws MojoExecutionException, MojoFailureException
@@ -365,6 +387,10 @@ public class PrepareReleaseMojo
config.setScmReleaseCommitComment( scmReleaseCommitComment );
config.setAutoResolveSnapshots( autoResolveSnapshots );
config.setPinExternals( pinExternals );
+ if ( generateReleasePoms )
+ {
+ config.setLineSeparator( resolveLineSeparator() );
+ }
if ( checkModificationExcludeList != null )
{
@@ -375,7 +401,7 @@ public class PrepareReleaseMojo
{
config.setCheckModificationExcludes( Arrays.asList( checkModificationExcludes ) );
}
-
+
ReleasePrepareRequest prepareRequest = new ReleasePrepareRequest();
prepareRequest.setReleaseDescriptorBuilder( config );
prepareRequest.setReleaseEnvironment( getReleaseEnvironment() );
@@ -399,4 +425,63 @@ public class PrepareReleaseMojo
}
}
+ private String resolveLineSeparator() throws MojoExecutionException
+ {
+ if ( lineSeparator == null )
+ {
+ return getLineSeparatorFromPom();
+ }
+
+ switch ( lineSeparator )
+ {
+ case "lf":
+ return "\n";
+ case "cr":
+ return "\r";
+ case "crlf":
+ return "\r\n";
+ case "system":
+ return System.lineSeparator();
+ case "source":
+ return getLineSeparatorFromPom();
+ default:
+ throw new IllegalArgumentException( String.format( "Unknown property lineSeparator: '%s'. Use one of"
+ + " the following: 'source', 'system', 'lf', 'cr', 'crlf'.", lineSeparator ) );
+ }
+ }
+
+ private String getLineSeparatorFromPom()
+ throws MojoExecutionException
+ {
+ char current;
+ String lineSeparator = "";
+ try ( InputStream is = new FileInputStream( this.project.getFile() ) )
+ {
+ while ( is.available() > 0 )
+ {
+ current = ( char ) is.read();
+ if ( ( current == '\n' ) || ( current == '\r' ) )
+ {
+ lineSeparator += current;
+ if ( is.available() > 0 )
+ {
+ char next = ( char ) is.read();
+ if ( ( next != current )
+ && ( ( next == '\r' ) || ( next == '\n' ) ) )
+ {
+ lineSeparator += next;
+ }
+ }
+ return lineSeparator;
+ }
+ }
+ }
+ catch ( IOException e )
+ {
+ throw new MojoExecutionException( "Failed to detect line separator of " + this.project.getFile(), e );
+ }
+
+ return lineSeparator;
+ }
+
}
diff --git a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
index a498a39..45681e5 100644
--- a/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
+++ b/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PrepareReleaseMojoTest.java
@@ -27,6 +27,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -65,7 +66,7 @@ public class PrepareReleaseMojoTest
{
setVariableValueToObject( mojo, "updateWorkingCopyVersions", Boolean.TRUE );
}
-
+
public void testPrepare()
throws Exception
{
@@ -87,11 +88,11 @@ public class PrepareReleaseMojoTest
return Collections.singletonList( mojo.project );
}
};
-
+
ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
builder.setWorkingDirectory( testFile.getParentFile().getAbsolutePath() );
builder.setUpdateDependencies( false );
-
+
ReleaseManager mock = mock( ReleaseManager.class );
mojo.setReleaseManager( mock );
@@ -107,10 +108,10 @@ public class PrepareReleaseMojoTest
mojo.execute();
ArgumentCaptor<ReleasePrepareRequest> prepareRequest = ArgumentCaptor.forClass( ReleasePrepareRequest.class );
-
+
// verify
verify( mock ).prepare( prepareRequest.capture() );
-
+
assertThat( prepareRequest.getValue().getReleaseDescriptorBuilder(),
is( instanceOf( ReleaseDescriptorBuilder.class ) ) );
assertThat( prepareRequest.getValue().getReleaseEnvironment(), is( instanceOf( ReleaseEnvironment.class ) ) );
@@ -157,7 +158,7 @@ public class PrepareReleaseMojoTest
{
assertEquals( "Check cause", ReleaseExecutionException.class, e.getCause().getClass() );
}
-
+
// verify
verify( mock ).prepare( isA( ReleasePrepareRequest.class ) );
verifyNoMoreInteractions( mock );
@@ -176,14 +177,14 @@ public class PrepareReleaseMojoTest
public Properties getExecutionProperties(){
return new Properties();
};
-
+
@Override
public List<MavenProject> getProjects()
{
return Collections.singletonList( mojo.project );
}
};
-
+
ReleaseManager mock = mock( ReleaseManager.class );
ReleaseFailureException cause = new ReleaseFailureException( "..." );
doThrow( cause ).when( mock ).prepare( isA( ReleasePrepareRequest.class ) );
@@ -205,6 +206,57 @@ public class PrepareReleaseMojoTest
verifyNoMoreInteractions( mock );
}
+ public void testLineSeparatorInPrepareWithPom()
+ throws Exception
+ {
+ File testFile = getTestFile( "target/test-classes/mojos/prepare/prepare.xml" );
+ final PrepareWithPomReleaseMojo mojo = (PrepareWithPomReleaseMojo) lookupMojo( "prepare-with-pom", testFile );
+ setDefaults( mojo );
+ setVariableValueToObject( mojo, "generateReleasePoms", Boolean.TRUE );
+ mojo.setBasedir( testFile.getParentFile() );
+ mojo.setPomFileName( "pom.xml" );
+ mojo.project.setFile( testFile );
+ mojo.session = new MavenSession( null, null, null, null, null, null, null, null, null )
+ {
+ public Properties getExecutionProperties()
+ {
+ return new Properties();
+ };
+
+ @Override
+ public List<MavenProject> getProjects()
+ {
+ return Collections.singletonList( mojo.project );
+ }
+ };
+
+ ReleaseManager mock = mock( ReleaseManager.class );
+ mojo.setReleaseManager( mock );
+
+ int times = 1;
+ testLineSeparator(null, "\n", mojo, mock, times++);
+ testLineSeparator("source", "\n", mojo, mock, times++);
+ testLineSeparator("cr", "\r", mojo, mock, times++);
+ testLineSeparator("lf", "\n", mojo, mock, times++);
+ testLineSeparator("crlf", "\r\n", mojo, mock, times++);
+ testLineSeparator("system", System.lineSeparator(), mojo, mock, times++);
+ }
+
+ private void testLineSeparator( String lineSeparator, String expected, PrepareWithPomReleaseMojo mojo,
+ ReleaseManager releaseManager, int times )
+ throws Exception
+ {
+
+ setVariableValueToObject( mojo, "lineSeparator", lineSeparator );
+
+ mojo.execute();
+
+ ArgumentCaptor<ReleasePrepareRequest> prepareRequest = ArgumentCaptor.forClass( ReleasePrepareRequest.class );
+ verify( releaseManager , times( times ) ).prepare( prepareRequest.capture() );
+
+ assertEquals( expected, prepareRequest.getValue().getReleaseDescriptorBuilder().build().getLineSeparator() );
+ }
+
/*
public void testPerformWithScm()
throws Exception
diff --git a/maven-release-plugin/src/test/resources/mojos/prepare/.gitattributes b/maven-release-plugin/src/test/resources/mojos/prepare/.gitattributes
new file mode 100644
index 0000000..f685fb8
--- /dev/null
+++ b/maven-release-plugin/src/test/resources/mojos/prepare/.gitattributes
@@ -0,0 +1 @@
+prepare.xml text eol=lf