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 2012/09/12 07:16:25 UTC
svn commit: r1383781 - in
/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src:
main/java/org/apache/maven/scm/provider/git/gitexe/command/status/
test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/...
Author: olamy
Date: Wed Sep 12 05:16:25 2012
New Revision: 1383781
URL: http://svn.apache.org/viewvc?rev=1383781&view=rev
Log:
[SCM-694] git checkin command doesn't work with renamed files.
Submitted by Frédéric Camblor.
Modified:
maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java
maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java
maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java
Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java?rev=1383781&r1=1383780&r2=1383781&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java Wed Sep 12 05:16:25 2012
@@ -54,6 +54,11 @@ public class GitStatusConsumer
private static final String DELETED_PATTERN = "^ *D * (.*)$";
/**
+ * The pattern used to match renamed file lines
+ */
+ private static final String RENAMED_PATTERN = "R (.*) -> (.*)$";
+
+ /**
* @see #ADDED_PATTERN
*/
private RE addedRegexp;
@@ -68,6 +73,11 @@ public class GitStatusConsumer
*/
private RE deletedRegexp;
+ /**
+ * @see #RENAMED_PATTERN
+ */
+ private RE renamedRegexp;
+
private ScmLogger logger;
private File workingDirectory;
@@ -88,6 +98,7 @@ public class GitStatusConsumer
addedRegexp = new RE( ADDED_PATTERN );
modifiedRegexp = new RE( MODIFIED_PATTERN );
deletedRegexp = new RE( DELETED_PATTERN );
+ renamedRegexp = new RE( RENAMED_PATTERN );
}
catch ( RESyntaxException ex )
{
@@ -117,49 +128,68 @@ public class GitStatusConsumer
ScmFileStatus status = null;
- String file = null;
+ List<String> files = new ArrayList<String>();
if ( addedRegexp.match( line ) )
{
status = ScmFileStatus.ADDED;
- file = addedRegexp.getParen( 1 );
+ files.add(addedRegexp.getParen(1));
}
else if ( modifiedRegexp.match( line ) )
{
status = ScmFileStatus.MODIFIED;
- file = modifiedRegexp.getParen( 1 );
+ files.add( modifiedRegexp.getParen( 1 ) );
}
else if ( deletedRegexp.match( line ) )
{
status = ScmFileStatus.DELETED;
- file = deletedRegexp.getParen( 1 );
+ files.add( deletedRegexp.getParen( 1 ) );
+ }
+ else if ( renamedRegexp.match( line ) )
+ {
+ status = ScmFileStatus.RENAMED;
+ files.add( renamedRegexp.getParen( 1 ) );
+ files.add( renamedRegexp.getParen( 2 ) );
}
// If the file isn't a file; don't add it.
- if ( file != null && status != null )
+ if ( !files.isEmpty() && status != null )
{
if ( workingDirectory != null )
{
- if ( status == ScmFileStatus.DELETED )
+ if ( status == ScmFileStatus.RENAMED )
{
- if ( new File( workingDirectory, file ).isFile() )
+ String oldFilePath = files.get( 0 );
+ String newFilePath = files.get( 1 );
+ if ( new File( workingDirectory, oldFilePath ).isFile() )
+ {
+ return;
+ }
+ if ( !new File( workingDirectory, newFilePath ).isFile() )
+ {
+ return;
+ }
+ }
+ else if ( status == ScmFileStatus.DELETED )
+ {
+ if ( new File( workingDirectory, files.get( 0 ) ).isFile() )
{
return;
}
}
else
{
- if ( !new File( workingDirectory, file ).isFile() )
+ if ( !new File( workingDirectory, files.get( 0 ) ).isFile() )
{
return;
}
}
}
- changedFiles.add( new ScmFile( file, status ) );
+ for(String file : files){
+ changedFiles.add( new ScmFile( file, status ) );
+ }
}
-
-
}
public List<ScmFile> getChangedFiles()
Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java?rev=1383781&r1=1383780&r2=1383781&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java Wed Sep 12 05:16:25 2012
@@ -21,9 +21,16 @@ package org.apache.maven.scm.provider.gi
import org.apache.maven.scm.ScmFileSet;
import org.apache.maven.scm.ScmTestCase;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.command.remove.RemoveScmResult;
+import org.apache.maven.scm.provider.git.GitScmTestUtils;
import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
import org.apache.maven.scm.provider.git.util.GitUtil;
import org.apache.maven.scm.repository.ScmRepository;
+import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.cli.Commandline;
import java.io.File;
@@ -81,16 +88,68 @@ public class GitCheckInCommandTest
}
}
+ // Test reproducing SCM-694
+ public void testCheckinAfterRename() throws Exception {
+ File repo = getRepositoryRoot();
+ File checkedOutRepo = getWorkingCopy();
+
+ GitScmTestUtils.initRepo("src/test/resources/repository/", getRepositoryRoot(), getWorkingDirectory());
+
+ ScmRepository scmRepository = getScmManager().makeScmRepository( "scm:git:file://" + repo.getAbsolutePath() );
+ checkoutRepoInto(checkedOutRepo, scmRepository);
+
+ // Creating foo/bar/wine.xml
+ File fooDir = new File( checkedOutRepo.getAbsolutePath() + File.separator + "foo" );
+ fooDir.mkdir();
+ File barDir = new File(fooDir.getAbsolutePath() + File.separator + "bar");
+ barDir.mkdir();
+ File wineFile = new File(barDir.getAbsolutePath() + File.separator + "wine.xml");
+ FileUtils.fileWrite( wineFile.getAbsolutePath(), "Lacoste castle" );
+
+ // Adding and commiting file
+ AddScmResult addResult = getScmManager().add( scmRepository, new ScmFileSet( checkedOutRepo, new File( "foo/bar/wine.xml" ) ) );
+ assertResultIsSuccess( addResult );
+ CheckInScmResult checkInScmResult = getScmManager().checkIn(scmRepository, new ScmFileSet(checkedOutRepo), "Created wine file");
+ assertResultIsSuccess( checkInScmResult );
+
+ // Cloning foo/bar/wine.xml to foo/newbar/wine.xml
+ File newBarDir = new File(fooDir.getAbsolutePath() + File.separator + "newbar");
+ newBarDir.mkdir();
+ File movedWineFile = new File(newBarDir.getAbsolutePath() + File.separator + "wine.xml");
+ FileUtils.copyFile(wineFile, movedWineFile);
+
+ // Removing old file, adding new file and commiting...
+ RemoveScmResult removeResult = getScmManager().remove(scmRepository, new ScmFileSet(checkedOutRepo, new File("foo/bar/")), "");
+ assertResultIsSuccess(removeResult);
+ addResult = getScmManager().add(scmRepository, new ScmFileSet(checkedOutRepo, new File("foo/newbar/wine.xml")));
+ assertResultIsSuccess(addResult);
+ checkInScmResult = getScmManager().checkIn(scmRepository, new ScmFileSet(checkedOutRepo), "moved wine.xml from foo/bar/ to foo/newbar/");
+ assertResultIsSuccess(checkInScmResult);
+ assertTrue("Renamed file has not been commited !", checkInScmResult.getCheckedInFiles().size() != 0);
+ }
+
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
+ private CheckOutScmResult checkoutRepoInto( File workingCopy, ScmRepository scmRepository )
+ throws Exception {
+ FileUtils.deleteDirectory( workingCopy );
+ workingCopy.mkdir();
+
+ CheckOutScmResult result =
+ getScmManager().checkOut( scmRepository, new ScmFileSet( workingCopy ), (ScmVersion) null );
+
+ assertResultIsSuccess( result );
+ return result;
+ }
+
private void testCommandLine( String scmUrl, String commandLine )
throws Exception
{
File workingDirectory = getTestFile( "target/git-checkin-command-test" );
- ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
+ ScmRepository repository = getScmManager().makeScmRepository(scmUrl);
GitScmProviderRepository gitRepository = (GitScmProviderRepository) repository.getProviderRepository();
Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java?rev=1383781&r1=1383780&r2=1383781&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java Wed Sep 12 05:16:25 2012
@@ -241,6 +241,24 @@ public class GitStatusConsumerTest
FileUtils.deleteDirectory( dir );
}
+ // Test reproducing SCM-694
+ public void testConsumeRenamedFile()
+ throws Exception
+ {
+ File dir = createTempDirectory();
+ FileUtils.fileAppend( dir.getAbsolutePath() + File.separator + "NewCapfile", "data" );
+
+ GitStatusConsumer consumer = new GitStatusConsumer( new DefaultLog(), dir );
+
+ consumer.consumeLine( "R OldCapfile -> NewCapFile" );
+
+ List changedFiles = consumer.getChangedFiles();
+
+ assertNotNull( changedFiles );
+ assertEquals( 2, changedFiles.size() );
+ FileUtils.deleteDirectory( dir );
+ }
+
public void testLog1Consumer()
throws Exception
{