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