[WAGON-503] Directory gives out of date error in putDirectory() to a non-empty Subversion repo
This closes #47
diff --git a/wagon-providers/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java b/wagon-providers/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java
index d6531ee..ecffc45 100644
--- a/wagon-providers/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java
+++ b/wagon-providers/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java
@@ -100,6 +100,8 @@
*/
private String partCOSubdir = "";
+ private boolean haveRecursiveCO;
+
private File checkoutDirectory;
/**
@@ -246,7 +248,7 @@
try
{
- FileUtils.deleteDirectory( checkoutDirectory );
+ deleteCheckoutDirectory();
}
catch ( IOException e )
{
@@ -378,7 +380,20 @@
boolean isDirectory = source.isDirectory();
String checkoutTargetName = isDirectory ? targetName : getDirname( targetName );
- String relPath = ensureDirs( scmProvider, scmRepository, checkoutTargetName, target );
+ boolean recursive = false;
+ if ( isDirectory )
+ {
+ for ( File f : source.listFiles() )
+ {
+ if ( f.isDirectory() )
+ {
+ recursive = true;
+ break;
+ }
+ }
+ }
+
+ String relPath = ensureDirs( scmProvider, scmRepository, checkoutTargetName, target, recursive );
File newCheckoutDirectory = new File( checkoutDirectory, relPath );
@@ -448,7 +463,7 @@
* @throws IOException
*/
private String ensureDirs( ScmProvider scmProvider, ScmRepository scmRepository, String targetName,
- Resource resource )
+ Resource resource, boolean recursiveArg )
throws TransferFailedException, IOException
{
if ( checkoutDirectory == null )
@@ -463,11 +478,13 @@
// Check whether targetName, which is a relative path into the scm, exists.
// If it doesn't, check the parent, etc.
+ boolean recursive = recursiveArg;
+
for ( ;; )
{
try
{
- ScmResult res = tryPartialCheckout( target );
+ ScmResult res = tryPartialCheckout( target, recursive );
if ( !res.isSuccess() )
{
throw new ScmException( "command failed: " + res.getCommandOutput().trim() );
@@ -476,6 +493,7 @@
}
catch ( ScmException e )
{
+ recursive = false;
if ( partCOSubdir.length() == 0 )
{
fireTransferError( resource, e, TransferEvent.REQUEST_GET );
@@ -598,14 +616,15 @@
return addedFiles;
}
- private CheckOutScmResult checkOut( ScmProvider scmProvider, ScmRepository scmRepository, ScmFileSet fileSet )
+ private CheckOutScmResult checkOut( ScmProvider scmProvider, ScmRepository scmRepository, ScmFileSet fileSet,
+ boolean recursive )
throws ScmException
{
ScmVersion ver = makeScmVersion();
CommandParameters parameters = mkBinaryFlag();
// TODO: AbstractScmProvider 6f7dd0c ignores checkOut() parameter "version"
parameters.setScmVersion( CommandParameter.SCM_VERSION, ver );
- parameters.setString( CommandParameter.RECURSIVE, Boolean.toString( false ) );
+ parameters.setString( CommandParameter.RECURSIVE, Boolean.toString( recursive ) );
parameters.setString( CommandParameter.SHALLOW, Boolean.toString( true ) );
return scmProvider.checkOut( scmRepository, fileSet, ver, parameters );
@@ -632,6 +651,12 @@
return ( "svn".equals( scmType ) || "cvs".equals( scmType ) );
}
+ private boolean isAlwaysRecursive( ScmProvider scmProvider )
+ {
+ String scmType = scmProvider.getScmType();
+ return ( "git".equals( scmType ) || "cvs".equals( scmType ) );
+ }
+
public void putDirectory( File sourceDirectory, String destinationDirectory )
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
{
@@ -691,7 +716,7 @@
try
{
String subdir = getDirname( resourceName );
- ScmResult res = tryPartialCheckout( subdir );
+ ScmResult res = tryPartialCheckout( subdir, false );
if ( !res.isSuccess() && ( partCOSubdir.length() == 0 || res instanceof UpdateScmResult ) )
{
// inability to checkout SVN or CVS subdir is not fatal. We just assume it doesn't exist
@@ -737,7 +762,7 @@
fireGetCompleted( resource, destination );
}
- private ScmResult tryPartialCheckout( String subdir )
+ private ScmResult tryPartialCheckout( String subdir, boolean recursiveArg )
throws ScmException, IOException
{
String url = getRepository().getUrl();
@@ -755,12 +780,19 @@
scmRepository = getScmRepository( url );
}
+ boolean recursive = recursiveArg | isAlwaysRecursive( scmProvider );
+
if ( !desiredPartCOSubdir.equals( partCOSubdir ) )
{
- FileUtils.deleteDirectory( checkoutDirectory );
+ deleteCheckoutDirectory();
partCOSubdir = desiredPartCOSubdir;
}
+ if ( recursive && !haveRecursiveCO )
+ {
+ deleteCheckoutDirectory();
+ }
+
ScmResult res;
if ( checkoutDirExists( scmProvider ) )
{
@@ -768,11 +800,19 @@
}
else
{
- res = checkOut( scmProvider, scmRepository, new ScmFileSet( checkoutDirectory ) );
+ res = checkOut( scmProvider, scmRepository, new ScmFileSet( checkoutDirectory ), recursive );
+ haveRecursiveCO = recursive && res.isSuccess();
}
return res;
}
+ private void deleteCheckoutDirectory()
+ throws IOException
+ {
+ haveRecursiveCO = false;
+ FileUtils.deleteDirectory( checkoutDirectory );
+ }
+
private boolean checkoutDirExists( ScmProvider scmProvider )
{
String reservedScmFile = scmProvider.getScmSpecificFilename();
diff --git a/wagon-providers/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java b/wagon-providers/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java
index 3028997..b34cede 100644
--- a/wagon-providers/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java
+++ b/wagon-providers/wagon-scm/src/test/java/org/apache/maven/wagon/providers/scm/AbstractScmWagonTest.java
@@ -46,6 +46,16 @@
extends WagonTestCase
{
+ @Override
+ public void testWagonPutDirectory() throws Exception
+ {
+ super.testWagonPutDirectory();
+ // repeat the test on a non-empty repo
+ // ScmWagon should checkout all involved subdirs before calling
+ // FileUtils.copyDirectoryStructure()
+ super.testWagonPutDirectory();
+ }
+
private ScmWagon wagon;
private String providerClassName;