You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2011/11/28 15:55:58 UTC

svn commit: r1207257 - in /maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src: main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/ test/java/org/apache/maven/scm/provider/svn/svnexe/command/chang...

Author: olamy
Date: Mon Nov 28 14:55:57 2011
New Revision: 1207257

URL: http://svn.apache.org/viewvc?rev=1207257&view=rev
Log:
[SCM-647] SvnChangeLogConsumer parses filename incorrectly when file is copied from existing one
Submitted by Petr Kozelka.

Modified:
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumer.java
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumerTest.java

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumer.java?rev=1207257&r1=1207256&r2=1207257&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumer.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumer.java Mon Nov 28 14:55:57 2011
@@ -19,10 +19,6 @@ package org.apache.maven.scm.provider.sv
  * under the License.
  */
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
 import org.apache.maven.scm.ChangeFile;
 import org.apache.maven.scm.ChangeSet;
 import org.apache.maven.scm.log.ScmLogger;
@@ -30,6 +26,10 @@ import org.apache.maven.scm.provider.svn
 import org.apache.maven.scm.util.AbstractConsumer;
 import org.apache.regexp.RE;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  * @version $Id$
@@ -58,19 +58,20 @@ public class SvnChangeLogConsumer
     private static final int GET_COMMENT = 3;
 
     /**
-     * A file line begins with a space character
+     * There is always action and affected path; when copying/moving, recognize also original path and revision
      */
-    private static final String FILE_BEGIN_TOKEN = " ";
+    private static final RE FILE_PATTERN = new RE( "^\\s\\s\\s([:upper:])\\s(.+)$" );
 
     /**
-     * The file section ends with a blank line
+     * This matches the 'original file info' part of the complete file line.
+     * Note the use of [:alpha:] instead of literal 'from' - this is meant to allow non-English localizations.
      */
-    private static final String FILE_END_TOKEN = "";
+    private static final RE ORIG_FILE_PATTERN = new RE( "\\([:alpha:]+ (.+):(\\d+)\\)" );
 
     /**
-     * The filename starts after 5 characters
+     * The file section ends with a blank line
      */
-    private static final int FILE_START_INDEX = 5;
+    private static final String FILE_END_TOKEN = "";
 
     /**
      * The comment section ends with a dashed line
@@ -106,21 +107,21 @@ public class SvnChangeLogConsumer
     /**
      * The regular expression used to match header lines
      */
-    private static final RE HEADER_REG_EXP =
-        new RE("^(.+) \\| (.+) \\| (.+) \\|.*$");
-    
+    private static final RE HEADER_REG_EXP = new RE( "^(.+) \\| (.+) \\| (.+) \\|.*$" );
+
     private static final int REVISION_GROUP = 1;
+
     private static final int AUTHOR_GROUP = 2;
+
     private static final int DATE_GROUP = 3;
-    
-    private static final RE REVISION_REG_EXP1 = new RE("rev (\\d+):");
-    
-    private static final RE REVISION_REG_EXP2 = new RE("r(\\d+)");
-    
-    private static final RE DATE_REG_EXP = new RE(
-        "(\\d+-\\d+-\\d+ " +             // date 2002-08-24
-        "\\d+:\\d+:\\d+) " +             // time 16:01:00
-        "([\\-+])(\\d\\d)(\\d\\d)");     // gmt offset -0400);)
+
+    private static final RE REVISION_REG_EXP1 = new RE( "rev (\\d+):" );
+
+    private static final RE REVISION_REG_EXP2 = new RE( "r(\\d+)" );
+
+    private static final RE DATE_REG_EXP = new RE( "(\\d+-\\d+-\\d+ " +             // date 2002-08-24
+                                                       "\\d+:\\d+:\\d+) " +             // time 16:01:00
+                                                       "([\\-+])(\\d\\d)(\\d\\d)" );     // gmt offset -0400);)
 
     private final String userDateFormat;
 
@@ -143,7 +144,9 @@ public class SvnChangeLogConsumer
     // StreamConsumer Implementation
     // ----------------------------------------------------------------------
 
-    /** {@inheritDoc} */
+    /**
+     * {@inheritDoc}
+     */
     public void consumeLine( String line )
     {
         if ( getLogger().isDebugEnabled() )
@@ -181,45 +184,44 @@ public class SvnChangeLogConsumer
      */
     private void processGetHeader( String line )
     {
-        if ( !HEADER_REG_EXP.match(line) )
+        if ( !HEADER_REG_EXP.match( line ) )
         {
             // The header line is not found. Intentionally do nothing.
             return;
         }
 
-        currentRevision = getRevision(HEADER_REG_EXP.getParen(
-                REVISION_GROUP ));
+        currentRevision = getRevision( HEADER_REG_EXP.getParen( REVISION_GROUP ) );
 
         currentChange = new SvnChangeSet();
 
         currentChange.setAuthor( HEADER_REG_EXP.getParen( AUTHOR_GROUP ) );
 
-        currentChange.setDate( getDate(HEADER_REG_EXP.getParen( DATE_GROUP )) );
-        
+        currentChange.setDate( getDate( HEADER_REG_EXP.getParen( DATE_GROUP ) ) );
+
         currentChange.setRevision( currentRevision );
 
         status = GET_FILE;
     }
-    
+
     /**
      * Gets the svn revision, from the svn log revision output.
-     * 
+     *
      * @param revisionOutput
      * @return the svn revision
      */
-    private String getRevision(final String revisionOutput)
+    private String getRevision( final String revisionOutput )
     {
-        if (REVISION_REG_EXP1.match(revisionOutput))
+        if ( REVISION_REG_EXP1.match( revisionOutput ) )
         {
-            return REVISION_REG_EXP1.getParen(1);
+            return REVISION_REG_EXP1.getParen( 1 );
         }
-        else if (REVISION_REG_EXP2.match(revisionOutput))
+        else if ( REVISION_REG_EXP2.match( revisionOutput ) )
         {
-            return REVISION_REG_EXP2.getParen(1);
+            return REVISION_REG_EXP2.getParen( 1 );
         }
         else
         {
-          throw new IllegalOutputException(revisionOutput);
+            throw new IllegalOutputException( revisionOutput );
         }
     }
 
@@ -233,10 +235,20 @@ public class SvnChangeLogConsumer
      */
     private void processGetFile( String line )
     {
-        if ( line.startsWith( FILE_BEGIN_TOKEN ) )
+        if ( FILE_PATTERN.match( line ) )
         {
-            // Skip the status flags and just get the name of the file
-            String name = line.substring( FILE_START_INDEX );
+            final String fileinfo = FILE_PATTERN.getParen( 2 );
+            String name = fileinfo;
+            final int n = fileinfo.indexOf( " (" );
+            if ( n > 1 && fileinfo.endsWith( ")" ) )
+            {
+                final String origFileInfo = fileinfo.substring( n );
+                if ( ORIG_FILE_PATTERN.match( origFileInfo ) )
+                {
+                    // if original file is present, we must extract only the affected one at the beginning
+                    name = fileinfo.substring( 0, n );
+                }
+            }
             currentChange.addFile( new ChangeFile( name, currentRevision ) );
 
             status = GET_FILE;
@@ -276,7 +288,7 @@ public class SvnChangeLogConsumer
     /**
      * Converts the date time stamp from the svn output into a date
      * object.
-     * 
+     *
      * @param dateOutput The date output from an svn log command.
      * @return A date representing the time stamp of the log entry.
      */

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumerTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumerTest.java?rev=1207257&r1=1207256&r2=1207257&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumerTest.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/changelog/SvnChangeLogConsumerTest.java Mon Nov 28 14:55:57 2011
@@ -35,6 +35,7 @@ import org.apache.maven.scm.ChangeSet;
 import org.apache.maven.scm.log.DefaultLog;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.logging.Logger;
+import org.junit.Assert;
 
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
@@ -258,7 +259,14 @@ public class SvnChangeLogConsumerTest
             {
                 ChangeFile file = (ChangeFile) it.next();
 
-                out.append( "File:" + file.getName() );
+                final String fileName = file.getName();
+                out.append( "File:" + fileName );
+
+                // files in this log are known to be from one subtree
+                Assert.assertTrue( "Unexpected file name: " + fileName, fileName.startsWith( "/maven/scm/trunk" ) );
+
+                // files in this log are known not to contain space
+                Assert.assertEquals( "Unexpected space found in filename: " + fileName, -1, fileName.indexOf( " " ) );
             }
 
             out.append( "==============================" );