Author: olamy
Date: Fri Nov 27 22:20:04 2009
New Revision: 885036

URL: http://svn.apache.org/viewvc?rev=885036&view=rev
Log:
[SCM-455] scm:changelog command does not pick up svn changes when author has 
spaces

Submitted by Todd Thiessen

Added:
    
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/IllegalOutputException.java
   (with props)
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidDate.txt
   (with props)
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidReason.txt
   (with props)
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogValidOutput.txt
   (with props)
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

Added: 
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/IllegalOutputException.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/IllegalOutputException.java?rev=885036&view=auto
==============================================================================
--- 
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/IllegalOutputException.java
 (added)
+++ 
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/IllegalOutputException.java
 Fri Nov 27 22:20:04 2009
@@ -0,0 +1,19 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.changelog;
+
+/**
+ * Thrown when the output of an svn log command isn't recognized.
+ */
+public class IllegalOutputException
+    extends RuntimeException
+{
+
+    /**
+     * Create the exception with a message.
+     * 
+     * @param message the message.
+     */
+    public IllegalOutputException( final String message )
+    {
+        super( message );
+    }
+}

Propchange: 
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/IllegalOutputException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
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/IllegalOutputException.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

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=885036&r1=885035&r2=885036&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
 Fri Nov 27 22:20:04 2009
@@ -19,16 +19,15 @@
  * 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.log.ScmLogger;
 import org.apache.maven.scm.provider.svn.SvnChangeSet;
 import org.apache.maven.scm.util.AbstractConsumer;
 import org.apache.regexp.RE;
-import org.apache.regexp.RESyntaxException;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
 
 /**
  * @author <a href="mailto:eveni...@apache.org";>Emmanuel Venisse</a>
@@ -79,21 +78,6 @@
         "------------------------------------" + 
"------------------------------------";
 
     /**
-     * The pattern used to match svn header lines
-     */
-    private static final String PATTERN = "^rev (\\d+):\\s+" + // revision 
number
-        "(\\w+)\\s+\\|\\s+" + // author username
-        "(\\d+-\\d+-\\d+ " + // date 2002-08-24
-        "\\d+:\\d+:\\d+) " + // time 16:01:00
-        "([\\-+])(\\d\\d)(\\d\\d)"; // gmt offset -0400
-
-    private static final String PATTERN2 = "^r(\\d+)\\s+\\|\\s+" +          // 
revision number
-        "(\\(\\S+\\s+\\S+\\)|\\S+)\\s+\\|\\s+" + // author username
-        "(\\d+-\\d+-\\d+ " +             // date 2002-08-24
-        "\\d+:\\d+:\\d+) " +             // time 16:01:00
-        "([\\-+])(\\d\\d)(\\d\\d)";      // gmt offset -0400
-
-    /**
      * Current status of the parser
      */
     private int status = GET_HEADER;
@@ -121,11 +105,23 @@
     /**
      * The regular expression used to match header lines
      */
-    private RE headerRegexp;
-
-    private RE headerRegexp2;
+    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 String userDateFormat;
+    private final String userDateFormat;
 
     /**
      * Default constructor.
@@ -135,18 +131,6 @@
         super( logger );
 
         this.userDateFormat = userDateFormat;
-
-        try
-        {
-            headerRegexp = new RE( PATTERN );
-            headerRegexp2 = new RE( PATTERN2 );
-        }
-        catch ( RESyntaxException ex )
-        {
-            throw new RuntimeException(
-                            "INTERNAL ERROR: Could not create regexp to parse 
svn log file. This shouldn't happen. Something is probably wrong with the oro 
installation.",
-                            ex );
-        }
     }
 
     public List getModifications()
@@ -196,28 +180,45 @@
      */
     private void processGetHeader( String line )
     {
-        if ( !headerRegexp.match( line ) )
+        if ( !HEADER_REG_EXP.match(line) )
         {
-            if ( !headerRegexp2.match( line ) )
-            {
-                return;
-            }
-            else
-            {
-                headerRegexp = headerRegexp2;
-            }
+            // The header line is not found. Intentionally do nothing.
+            return;
         }
 
-        currentRevision = headerRegexp.getParen( 1 );
+        currentRevision = getRevision(HEADER_REG_EXP.getParen(
+                REVISION_GROUP ));
 
         currentChange = new SvnChangeSet();
 
-        currentChange.setAuthor( headerRegexp.getParen( 2 ) );
+        currentChange.setAuthor( HEADER_REG_EXP.getParen( AUTHOR_GROUP ) );
 
-        currentChange.setDate( parseDate() );
+        currentChange.setDate( getDate(HEADER_REG_EXP.getParen( DATE_GROUP )) 
);
 
         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)
+    {
+        if (REVISION_REG_EXP1.match(revisionOutput))
+        {
+            return REVISION_REG_EXP1.getParen(1);
+        }
+        else if (REVISION_REG_EXP2.match(revisionOutput))
+        {
+            return REVISION_REG_EXP2.getParen(1);
+        }
+        else
+        {
+          throw new IllegalOutputException(revisionOutput);
+        }
+    }
 
     /**
      * Process the current input line in the GET_FILE state.  This state
@@ -270,16 +271,26 @@
     }
 
     /**
-     * Converts the date timestamp from the svn output into a date
+     * Converts the date time stamp from the svn output into a date
      * object.
-     *
-     * @return A date representing the timestamp of the log entry.
+     * 
+     * @param dateOutput The date output from an svn log command.
+     * @return A date representing the time stamp of the log entry.
      */
-    private Date parseDate()
+    private Date getDate(final String dateOutput)
     {
-        StringBuffer date = new StringBuffer().append( headerRegexp.getParen( 
3 ) ).append( " GMT" )
-            .append( headerRegexp.getParen( 4 ) ).append( 
headerRegexp.getParen( 5 ) ).append( ':' )
-            .append( headerRegexp.getParen( 6 ) );
+        if (!DATE_REG_EXP.match(dateOutput))
+        {
+            throw new IllegalOutputException(dateOutput);
+        }
+      
+        final StringBuffer date = new StringBuffer();
+        date.append(DATE_REG_EXP.getParen( 1 ));
+        date.append(" GMT");
+        date.append(DATE_REG_EXP.getParen( 2 ));
+        date.append(DATE_REG_EXP.getParen( 3 ));
+        date.append(':');
+        date.append(DATE_REG_EXP.getParen( 4 ));
 
         return parseDate( date.toString(), userDateFormat, 
SVN_TIMESTAMP_PATTERN );
     }

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=885036&r1=885035&r2=885036&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
 Fri Nov 27 22:20:04 2009
@@ -19,18 +19,19 @@
  * under the License.
  */
 
-import org.apache.maven.scm.ChangeFile;
-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 java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
+import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.maven.scm.ChangeFile;
+import org.apache.maven.scm.ChangeSet;
+import org.apache.maven.scm.log.DefaultLog;
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.logging.Logger;
+
 /**
  * @author <a href="mailto:eveni...@apache.org";>Emmanuel Venisse</a>
  * @version $Id$
@@ -39,6 +40,8 @@
     extends PlexusTestCase
 {
     Logger logger;
+    SvnChangeLogConsumer consumer;
+    
 
     protected void setUp()
         throws Exception
@@ -46,6 +49,99 @@
         super.setUp();
 
         logger = getContainer().getLogger();
+        consumer = new SvnChangeLogConsumer( new DefaultLog(), null );
+    }
+    
+    /**
+     * Initial modifications should be empty.
+     */
+    public void testGetModifications_Initial()
+    {
+        assertTrue("Initial modifications should be empty", 
consumer.getModifications().isEmpty());
+    }
+    
+    /**
+     * Valid svn log output should have expected values.
+     * 
+     * @throws Exception if any problem occurs.
+     */
+    public void testConsumeLine_ValidOutput()
+        throws Exception
+    {
+        final File svnLog = getTestFile( 
"/src/test/resources/svn/changelog/svnlogValidOutput.txt" );
+
+        consumeLog( svnLog );
+
+        final ChangeSet entry = (ChangeSet) consumer.getModifications().get( 0 
);
+
+        final List changedFiles = entry.getFiles();
+        final String revision = ( (ChangeFile) changedFiles.get( 0 ) 
).getRevision();
+
+        assertEquals( "Valid revision expected", "15", revision );
+        assertEquals( "Valid num changed files expected", 2, 
changedFiles.size() );
+        assertEquals( "Valid name expected", "unconventional author output 
(somedata)", entry.getAuthor() );
+        assertEquals( "Valid date expected", "2002-08-26", 
entry.getDateFormatted() );
+        assertEquals( "Valid comment expected", "Minor formatting changes.\n", 
entry.getComment() );
+    }
+    
+    /**
+     * Svn log output with an invalid reason should throw an 
IllegalOutputException.
+     * 
+     * @throws Exception
+     */
+    public void testConsumeLine_InvalidReason()
+        throws Exception
+    {
+        final File svnLog = getTestFile( 
"/src/test/resources/svn/changelog/svnlogInvalidReason.txt" );
+
+        try
+        {
+            consumeLog( svnLog );
+            fail( "Svn log output with an invalid reason should throw 
IllegalOutputException" );
+        }
+        catch ( final IllegalOutputException e )
+        {
+            assertTrue( true );
+        }
+    }
+    
+    /**
+     * Svn log output with an invalid date should throw an 
IllegalOutputException.
+     * 
+     * @throws Exception
+     */
+    public void testConsumeLine_InvalidDate()
+        throws Exception
+    {
+        final File svnLog = getTestFile( 
"/src/test/resources/svn/changelog/svnlogInvalidDate.txt" );
+        try
+        {
+            consumeLog( svnLog );
+            fail( "Svn log output with an invalid date should throw 
IllegalOutputException" );
+        }
+        catch ( final IllegalOutputException e )
+        {
+            assertTrue( true );
+        }
+    }
+
+    /**
+     * Consumes change log information stored in a file.
+     * 
+     * @param logFile the file.
+     * @throws IOException if a problem occurs.
+     */
+    private void consumeLog( final File logFile )
+        throws IOException
+    {
+        final BufferedReader reader = new BufferedReader( new FileReader( 
logFile ) );
+        String line = reader.readLine();
+
+        while ( line != null )
+        {
+            consumer.consumeLine( line );
+            line = reader.readLine();
+        }
     }
 
     public void testConsumerWithPattern1()
@@ -53,8 +149,6 @@
     {
         StringBuffer out = new StringBuffer();
 
-        SvnChangeLogConsumer consumer = new SvnChangeLogConsumer( new 
DefaultLog(), null );
-
         File f = getTestFile( "/src/test/resources/svn/changelog/svnlog.txt" );
 
         BufferedReader r = new BufferedReader( new FileReader( f ) );
@@ -118,8 +212,6 @@
     {
         StringBuffer out = new StringBuffer();
 
-        SvnChangeLogConsumer consumer = new SvnChangeLogConsumer( new 
DefaultLog(), null );
-
         File f = getTestFile( "/src/test/resources/svn/changelog/svnlog2.txt" 
);
 
         BufferedReader r = new BufferedReader( new FileReader( f ) );

Added: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidDate.txt
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidDate.txt?rev=885036&view=auto
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidDate.txt
 (added)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidDate.txt
 Fri Nov 27 22:20:04 2009
@@ -0,0 +1,3 @@
+------------------------------------------------------------------------
+r15 | unconventional author output (somedata) | invalid date | 3 lines
+------------------------------------------------------------------------
\ No newline at end of file

Propchange: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidDate.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidDate.txt
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidReason.txt
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidReason.txt?rev=885036&view=auto
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidReason.txt
 (added)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidReason.txt
 Fri Nov 27 22:20:04 2009
@@ -0,0 +1,3 @@
+------------------------------------------------------------------------
+invalid revision | unconventional author output (somedata) | 2002-08-26 
14:33:26 -0400 (Mon, 26 Aug 2002) | 3 lines
+------------------------------------------------------------------------
\ No newline at end of file

Propchange: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidReason.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogInvalidReason.txt
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogValidOutput.txt
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogValidOutput.txt?rev=885036&view=auto
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogValidOutput.txt
 (added)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogValidOutput.txt
 Fri Nov 27 22:20:04 2009
@@ -0,0 +1,15 @@
+------------------------------------------------------------------------
+r15 | unconventional author output (somedata) | 2002-08-26 14:33:26 -0400 
(Mon, 26 Aug 2002) | 3 lines
+Changed paths:
+   M /poolserver/trunk/build.xml
+   M /poolserver/trunk/project.properties
+
+Minor formatting changes.
+------------------------------------------------------------------------
+r15 | unconventional author output (somedata) | 2002-08-26 14:33:26 -0400 
(Mon, 26 Aug 2002) | 3 lines
+Changed paths:
+   M /poolserver/trunk/build.xml
+   M /poolserver/trunk/project.properties
+
+Minor formatting changes.
+------------------------------------------------------------------------
\ No newline at end of file

Propchange: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogValidOutput.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/resources/svn/changelog/svnLogValidOutput.txt
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision


Reply via email to