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