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
     {