You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ca...@apache.org on 2006/05/05 05:37:34 UTC

svn commit: r399938 - in /maven/sandbox/wagon-scm/src: main/java/org/apache/maven/wagon/providers/scm/ test/java/org/apache/maven/wagon/providers/scm/

Author: carlos
Date: Thu May  4 20:37:33 2006
New Revision: 399938

URL: http://svn.apache.org/viewcvs?rev=399938&view=rev
Log:
Allow put files when remote SCM path doesn't exist
Refactor tests

Removed:
    maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmSvnJavaWagonTest.java
Modified:
    maven/sandbox/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java
    maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmSvnWagonTest.java
    maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java
    maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmCvsExeWagonTest.java
    maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmSvnExeWagonTest.java

Modified: maven/sandbox/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java
URL: http://svn.apache.org/viewcvs/maven/sandbox/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java?rev=399938&r1=399937&r2=399938&view=diff
==============================================================================
--- maven/sandbox/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java (original)
+++ maven/sandbox/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java Thu May  4 20:37:33 2006
@@ -23,6 +23,8 @@
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.command.list.ListScmResult;
 import org.apache.maven.scm.manager.NoSuchScmProviderException;
 import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.scm.provider.ScmProvider;
@@ -218,9 +220,7 @@
 
         try
         {
-            File scmFile = new File( checkoutDirectory, resourceName );
-
-            File basedir = scmFile.getParentFile();
+            File basedir = checkoutDirectory;
 
             String msg = "Wagon: Adding " + source.getName() + " to repository";
 
@@ -230,19 +230,20 @@
 
             String reservedScmFile = scmProvider.getScmSpecificFilename();
 
+            File newCheckoutDirectory = checkoutDirectory;
+
             if ( reservedScmFile != null && new File( basedir, reservedScmFile ).exists() )
             {
                 result = scmProvider.update( scmRepository, new ScmFileSet( basedir ), null );
+
+                checkScmResult( result );
             }
             else
             {
-                /*
-                 * TODO if the scmRepository points to a non existing folder we need to create all
-                 * the hierarchy of parent folders up to the existing one
-                 */
-                result = scmProvider.checkOut( scmRepository, new ScmFileSet( basedir ), null );
+                newCheckoutDirectory = mkdirs( scmProvider, scmRepository, basedir );
             }
-            checkScmResult( result );
+
+            File scmFile = new File( newCheckoutDirectory, resourceName );
 
             boolean fileAlreadyInScm = scmFile.exists();
 
@@ -260,14 +261,14 @@
 
             if ( !fileAlreadyInScm || scmFile.isDirectory() )
             {
-                int addedFiles = addFiles( scmProvider, scmRepository, basedir, scmFile.getName() );
+                int addedFiles = addFiles( scmProvider, scmRepository, newCheckoutDirectory, scmFile.getName() );
                 if ( !fileAlreadyInScm && addedFiles == 0 )
                 {
                     throw new TransferFailedException( "Unable to add file to SCM: " + scmFile );
                 }
             }
 
-            result = scmProvider.checkIn( scmRepository, new ScmFileSet( basedir, scmFile.getName(), null ), null, msg );
+            result = scmProvider.checkIn( scmRepository, new ScmFileSet( newCheckoutDirectory, scmFile.getName(), null ), null, msg );
 
             checkScmResult( result );
 
@@ -341,6 +342,82 @@
     }
 
     /**
+     * Make the necessary directories in the SCM repository to commit the files in the place asked
+     * 
+     * @param scmProvider
+     * @param repository
+     * @param basedir
+     * @return the new checkout directory. Will be <code>null</code> if it does not need to change.
+     * @throws ScmException
+     * @throws TransferFailedException
+     */
+    private File mkdirs( ScmProvider scmProvider, ScmRepository repository, File basedir )
+        throws ScmException, TransferFailedException
+    {
+        ScmProviderRepository baseProviderRepository = repository.getProviderRepository();
+
+        ScmFileSet fileSet = new ScmFileSet( basedir, new File( "." ) );
+
+        ListScmResult listScmResult;
+
+        ScmRepository baseRepository = repository;
+        
+        ScmProviderRepository lastBaseProviderRepository = baseProviderRepository;
+
+        while ( baseProviderRepository != null )
+        {
+            listScmResult = scmProvider.list( baseRepository, fileSet, false, null );
+
+            if ( listScmResult.isSuccess() )
+            {
+                break;
+            }
+
+            lastBaseProviderRepository = baseProviderRepository;
+
+            baseProviderRepository = baseProviderRepository.getParent();
+
+            baseRepository = new ScmRepository( repository.getProvider(), baseProviderRepository );
+        }
+
+        if ( baseProviderRepository != null )
+        {
+            String relativePath = repository.getProviderRepository().getRelativePath( baseProviderRepository );
+
+            if ( relativePath != null )
+            {
+                scmProvider.checkOut( baseRepository, new ScmFileSet( basedir ), null );
+                
+                File path = new File( basedir, relativePath );
+                
+                path.mkdirs();
+                
+                String folderNameToCommit = lastBaseProviderRepository.getRelativePath( baseProviderRepository );
+
+                addFiles( scmProvider, baseRepository, basedir, folderNameToCommit );
+
+                scmProvider.checkIn( baseRepository, new ScmFileSet( basedir, new File( folderNameToCommit ) ), null,
+                                     "Adding required folders for Wagon.put" );
+
+                return path;
+            }
+            else
+            {
+                /* folder already in SCM */
+
+                CheckOutScmResult result = scmProvider.checkOut( repository, new ScmFileSet( basedir ), null );
+
+                checkScmResult( result );
+
+                return basedir;
+            }
+        }
+
+        throw new TransferFailedException( "Unable to create directories in the remote repository: "
+            + repository.getProviderRepository() );
+    }
+
+    /**
      * @return true 
      */
     public boolean supportsDirectoryCopy()
@@ -369,8 +446,8 @@
     {
         if ( !result.isSuccess() )
         {
-            throw new TransferFailedException(
-                "Unable to commit file. " + result.getProviderMessage() + " " + result.getCommandOutput() );
+            throw new TransferFailedException( "Unable to commit file. " + result.getProviderMessage() + " "
+                + result.getCommandOutput() );
         }
     }
 

Modified: maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmSvnWagonTest.java
URL: http://svn.apache.org/viewcvs/maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmSvnWagonTest.java?rev=399938&r1=399937&r2=399938&view=diff
==============================================================================
--- maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmSvnWagonTest.java (original)
+++ maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmSvnWagonTest.java Thu May  4 20:37:33 2006
@@ -45,7 +45,7 @@
         }
         repository = repository.replace( '\\', '/' );
 
-        return "scm:svn:file://" + repository + "/newfolder";
+        return "scm:svn:file://" + repository;
     }
 
 }

Modified: maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java
URL: http://svn.apache.org/viewcvs/maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java?rev=399938&r1=399937&r2=399938&view=diff
==============================================================================
--- maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java (original)
+++ maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java Thu May  4 20:37:33 2006
@@ -31,6 +31,8 @@
 import org.codehaus.plexus.util.FileUtils;
 
 /**
+ * Test for {@link ScmWagon}. You need a subclass for each SCM provider you want to test.
+ * 
  * @author <a href="carlos@apache.org">Carlos Sanchez</a>
  * @version $Id$
  */
@@ -38,23 +40,46 @@
     extends WagonTestCase
 {
 
+    private ScmWagon wagon;
+
+    private String providerClassName;
+
     protected void setUp()
         throws Exception
     {
         super.setUp();
 
         FileUtils.deleteDirectory( getCheckoutDirectory() );
+
+        if ( wagon == null )
+        {
+            wagon = (ScmWagon) super.getWagon();
+
+            DefaultScmManager scmManager = (DefaultScmManager) wagon.getScmManager();
+
+            if ( getScmProvider() != null )
+            {
+                scmManager.setScmProvider( getScmId(), getScmProvider() );
+
+                providerClassName = getScmProvider().getClass().getName();
+            }
+            else
+            {
+                providerClassName = scmManager.getProviderByType( getScmId() ).getClass().getName();
+            }
+
+            wagon.setCheckoutDirectory( getCheckoutDirectory() );
+        }
     }
 
     /**
-     * Allows overriding the ScmProvider injected by default.
-     * Useful to force the implementation to use for a particular SCM type.  
+     * Allows overriding the {@link ScmProvider} injected by default in the {@link ScmWagon}.
+     * Useful to force the implementation to use for a particular SCM type.
+     * If this method returns <code>null</code> {@link ScmWagon} will use the default {@link ScmProvider}.
      *  
      * @return the {@link ScmProvider} to use in the {@link ScmWagon}
-     * @throws Exception
      */
     protected ScmProvider getScmProvider()
-        throws Exception
     {
         return null;
     }
@@ -62,25 +87,12 @@
     protected Wagon getWagon()
         throws Exception
     {
-        ScmWagon wagon = (ScmWagon) super.getWagon();
-
-        wagon.setCheckoutDirectory( getCheckoutDirectory() );
-
-        if ( getScmProvider() != null )
-        {
-            DefaultScmManager scmManager = (DefaultScmManager) wagon.getScmManager();
-
-            scmManager.setScmProvider( getScmId(), getScmProvider() );
-
-            wagon.setScmManager( scmManager );
-        }
-
         return wagon;
     }
 
     private File getCheckoutDirectory()
     {
-        return new File( FileTestUtils.getTestOutputDir(), "/checkout-" + getScmId() );
+        return new File( FileTestUtils.getTestOutputDir(), "/checkout-" + providerClassName );
     }
 
     /**

Modified: maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmCvsExeWagonTest.java
URL: http://svn.apache.org/viewcvs/maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmCvsExeWagonTest.java?rev=399938&r1=399937&r2=399938&view=diff
==============================================================================
--- maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmCvsExeWagonTest.java (original)
+++ maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmCvsExeWagonTest.java Thu May  4 20:37:33 2006
@@ -30,9 +30,32 @@
 {
 
     protected ScmProvider getScmProvider()
-        throws Exception
     {
         return new CvsExeScmProvider();
+    }
+
+    public void testFailedGet()
+        throws Exception
+    {
+        // Not ready yet
+    }
+
+    public void testWagon()
+        throws Exception
+    {
+        // Not ready yet
+    }
+
+    public void testWagonPutDirectory()
+        throws Exception
+    {
+        // Not ready yet
+    }
+
+    public void testWagonPutDirectoryWhenDirectoryAlreadyExists()
+        throws Exception
+    {
+        // Not ready yet
     }
 
 }

Modified: maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmSvnExeWagonTest.java
URL: http://svn.apache.org/viewcvs/maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmSvnExeWagonTest.java?rev=399938&r1=399937&r2=399938&view=diff
==============================================================================
--- maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmSvnExeWagonTest.java (original)
+++ maven/sandbox/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/ScmSvnExeWagonTest.java Thu May  4 20:37:33 2006
@@ -30,7 +30,6 @@
 {
 
     protected ScmProvider getScmProvider()
-        throws Exception
     {
         return new SvnExeScmProvider();
     }