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( "==============================" );