Fix MRELEASE-759: Add ScmTranslator.toRelativePath()


git-svn-id: https://svn.apache.org/repos/asf/maven/release/trunk@1341231 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java
index 9dfcae9..db85305 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java
@@ -36,6 +36,7 @@
 import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
+import org.apache.maven.shared.release.scm.ScmTranslator;
 import org.codehaus.plexus.util.SelectorUtils;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -44,6 +45,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -61,6 +63,13 @@
      * @plexus.requirement
      */
     private ScmRepositoryConfigurator scmRepositoryConfigurator;
+    
+    /**
+     * SCM URL translators mapped by provider name.
+     *
+     * @plexus.requirement role="org.apache.maven.shared.release.scm.ScmTranslator"
+     */
+    private Map<String, ScmTranslator> scmTranslators;
 
     /**
      * The filepatterns to exclude from the status check.
@@ -130,20 +139,35 @@
 
         List<ScmFile> changedFiles = result.getChangedFiles();
 
-        // TODO: would be nice for SCM status command to do this for me.
-        for ( Iterator<ScmFile> i = changedFiles.iterator(); i.hasNext(); )
+        if ( !changedFiles.isEmpty() )
         {
-            ScmFile f = i.next();
-
-            // SelectorUtils expects File.separator, don't standardize!
-            String fileName = f.getPath().replace( "\\", File.separator ).replace( "/", File.separator );
-
-            for ( String exclusionPattern : exclusionPatterns )
+            ScmTranslator scmTranslator = scmTranslators.get( repository );
+            
+            // TODO: would be nice for SCM status command to do this for me.
+            for ( Iterator<ScmFile> i = changedFiles.iterator(); i.hasNext(); )
             {
-                if ( SelectorUtils.matchPath( exclusionPattern, fileName ) )
+                ScmFile f = i.next();
+
+                String path;
+                if ( scmTranslator != null )
                 {
-                    logDebug( relResult, "Ignoring changed file: " + fileName );
-                    i.remove();
+                    path = scmTranslator.toRelativePath( f.getPath() );
+                }
+                else
+                {
+                    path = f.getPath();
+                }
+
+                // SelectorUtils expects File.separator, don't standardize!
+                String fileName = path.replace( "\\", File.separator ).replace( "/", File.separator );
+
+                for ( String exclusionPattern : exclusionPatterns )
+                {
+                    if ( SelectorUtils.matchPath( exclusionPattern, fileName ) )
+                    {
+                        logDebug( relResult, "Ignoring changed file: " + fileName );
+                        i.remove();
+                    }
                 }
             }
         }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java
index 8362058..7008cba 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslator.java
@@ -28,16 +28,25 @@
 public class ClearCaseScmTranslator
     implements ScmTranslator
 {
+    /**
+     * {@inheritDoc}
+     */
     public String translateBranchUrl( String url, String branchName, String branchBase )
     {
         return url;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String translateTagUrl( String url, String tag, String tagBase )
     {
         return url;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String resolveTag( String tag )
     {
         if ( !"HEAD".equals( tag ) )
@@ -49,4 +58,12 @@
             return null;
         }
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public String toRelativePath( String path )
+    {
+        return path;
+    }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java
index e1668f6..ab5544d 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/CvsScmTranslator.java
@@ -28,16 +28,25 @@
 public class CvsScmTranslator
     implements ScmTranslator
 {
+    /**
+     * {@inheritDoc}
+     */
     public String translateBranchUrl( String url, String branchName, String branchBase )
     {
         return url;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String translateTagUrl( String url, String tag, String tagBase )
     {
         return url;
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String resolveTag( String tag )
     {
         if ( !"HEAD".equals( tag ) )
@@ -49,4 +58,12 @@
             return null;
         }
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public String toRelativePath( String path )
+    {
+        return path;
+    }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java
index 394aba3..1d4ca4d 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/GitScmTranslator.java
@@ -22,7 +22,8 @@
 /**
  * @plexus.component role="org.apache.maven.shared.release.scm.ScmTranslator" role-hint="git"
  */
-public class GitScmTranslator implements ScmTranslator
+public class GitScmTranslator
+    implements ScmTranslator
 {
 
     /** {@inheritDoc} */
@@ -42,4 +43,10 @@
     {
         return tag;
     }
+
+    /** {@inheritDoc} */
+    public String toRelativePath( String path )
+    {
+        return path;
+    }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java
index b891194..96ff86b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/HgScmTranslator.java
@@ -22,7 +22,8 @@
 /**
  * @plexus.component role="org.apache.maven.shared.release.scm.ScmTranslator" role-hint="hg"
  */
-public class HgScmTranslator implements ScmTranslator
+public class HgScmTranslator
+    implements ScmTranslator
 {
 
     /** {@inheritDoc} */
@@ -42,4 +43,10 @@
     {
         return tag;
     }
+    
+    /** {@inheritDoc} */
+    public String toRelativePath( String path )
+    {
+        return path;
+    }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java
index c1effc8..88c13be 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/JazzScmTranslator.java
@@ -1,5 +1,7 @@
 package org.apache.maven.shared.release.scm;
 
+import java.io.File;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -76,4 +78,21 @@
         // project.scm.tag is not required, so return null.
         return null;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String toRelativePath( String path )
+    {
+        String relativePath;
+        if ( path.startsWith( "\\" ) || path.startsWith( "/" ) )
+        {
+            relativePath = path.substring( 1 );
+        }
+        else
+        {
+            relativePath = path;
+        }
+        return relativePath.replace( "\\", File.separator ).replace( "/", File.separator );
+    }
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmTranslator.java
index f7e8836..21b83e9 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmTranslator.java
@@ -59,4 +59,13 @@
      * @return the tag to use, or <code>null</code> if the provider does not use tags
      */
     String resolveTag( String tag );
+    
+    /**
+     * Translates an ScmFile path to a path relative to the working directory.
+     * 
+     * @param path
+     * @return the relative path with OS specific File separator
+     * @since 2.3.1
+     */
+    String toRelativePath( String path );
 }
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java
index d81bea1..c74917d 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/SubversionScmTranslator.java
@@ -32,19 +32,36 @@
 public class SubversionScmTranslator
     implements ScmTranslator
 {
+    /**
+     * {@inheritDoc}
+     */
     public String translateBranchUrl( String url, String branchName, String branchBase )
     {
         return SvnTagBranchUtils.resolveUrl( url, branchBase, SvnTagBranchUtils.SVN_BRANCHES,
                                              new ScmBranch( branchName ) );
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String translateTagUrl( String url, String tag, String tagBase )
     {
         return SvnTagBranchUtils.resolveUrl( url, tagBase, SvnTagBranchUtils.SVN_TAGS, new ScmTag( tag ) );
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public String resolveTag( String tag )
     {
         return null;
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    public String toRelativePath( String path )
+    {
+        return path;
+    }
 }
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslatorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslatorTest.java
index 7dada88..9743a7d 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslatorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/ClearCaseScmTranslatorTest.java
@@ -47,4 +47,9 @@
         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", null )  );

         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", "tagBase" )  );

     }

+    

+    public void testGetRelativePath()

+    {

+        assertEquals( "a/b/c", "a/b/c" );

+    }

 }

diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/CvsScmTranslatorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/CvsScmTranslatorTest.java
index 2848fa9..e2cf8b1 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/CvsScmTranslatorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/CvsScmTranslatorTest.java
@@ -47,4 +47,9 @@
         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", null )  );

         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", "tagBase" )  );

     }

+    

+    public void testGetRelativePath()

+    {

+        assertEquals( "a/b/c", "a/b/c" );

+    }

 }

diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/GitScmTranslatorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/GitScmTranslatorTest.java
index db8e0cf..a9acd1c 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/GitScmTranslatorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/GitScmTranslatorTest.java
@@ -47,4 +47,9 @@
         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", null )  );

         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", "tagBase" )  );

     }

+

+    public void testGetRelativePath()

+    {

+        assertEquals( "a/b/c", "a/b/c" );

+    }

 }

diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/HgScmTranslatorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/HgScmTranslatorTest.java
index 19080ed..e731b17 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/HgScmTranslatorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/HgScmTranslatorTest.java
@@ -46,4 +46,9 @@
         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", null )  );

         assertEquals( "url", scmTranslator.translateBranchUrl( "url", "branchName", "tagBase" )  );

     }

+    

+    public void testGetRelativePath()

+    {

+        assertEquals( "a/b/c", "a/b/c" );

+    }

 }

diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/JazzScmTranslatorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/JazzScmTranslatorTest.java
index 6e5aa6b..187606c 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/JazzScmTranslatorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/JazzScmTranslatorTest.java
@@ -19,6 +19,8 @@
  * under the License.

  */

 

+import java.io.File;

+

 import junit.framework.TestCase;

 

 public class JazzScmTranslatorTest

@@ -47,4 +49,12 @@
         assertEquals( "url:branchName", scmTranslator.translateBranchUrl( "url:module", "branchName", null ) );

         assertEquals( "url:branchName", scmTranslator.translateBranchUrl( "url:module", "branchName", "tagBase" ) );

     }

+    

+    public void testGetRelativePath()

+    {

+        assertEquals( "BogusTest" + File.separator + "release.properties", scmTranslator.toRelativePath( "BogusTest/release.properties" ) );

+        assertEquals( "BogusTest" + File.separator + "release.properties", scmTranslator.toRelativePath( "/BogusTest/release.properties" ) );

+        assertEquals( "BogusTest" + File.separator + "release.properties", scmTranslator.toRelativePath( "BogusTest\\release.properties" ) );

+        assertEquals( "BogusTest" + File.separator + "release.properties", scmTranslator.toRelativePath( "\\BogusTest\\release.properties" ) );

+    }

 }

diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/SubversionScmTranslatorTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/SubversionScmTranslatorTest.java
index 9b6943c..43c3766 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/SubversionScmTranslatorTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/scm/SubversionScmTranslatorTest.java
@@ -48,4 +48,9 @@
         assertEquals( "url/branches/branchName", scmTranslator.translateBranchUrl( "url", "branchName", null )  );

         assertEquals( "tagBase/branchName", scmTranslator.translateBranchUrl( "url", "branchName", "tagBase" )  );

     }

+    

+    public void testGetRelativePath()

+    {

+        assertEquals( "a/b/c", "a/b/c" );

+    }

 }