in wagon-providers/wagon-scm/src/main/java/org/apache/maven/wagon/providers/scm/ScmWagon.java [465:545]
private String ensureDirs( ScmProvider scmProvider, ScmRepository scmRepository, String targetName,
Resource resource, boolean recursiveArg )
throws TransferFailedException, IOException
{
if ( checkoutDirectory == null )
{
checkoutDirectory = createCheckoutDirectory();
}
String target = targetName;
// totally ignore scmRepository parent stuff since that is not supported by all scms.
// Instead, assume that that url exists. If not, then that's an error.
// 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, recursive );
if ( !res.isSuccess() )
{
throw new ScmException( "command failed: " + res.getCommandOutput().trim() );
}
break;
}
catch ( ScmException e )
{
recursive = false;
if ( partCOSubdir.length() == 0 )
{
fireTransferError( resource, e, TransferEvent.REQUEST_GET );
throw new TransferFailedException( "Error checking out: " + e.getMessage(), e );
}
target = getDirname( target );
}
}
// now create the subdirs in target, if it's a parent of targetName
String res =
partCOSubdir.length() >= targetName.length() ? "" : targetName.substring( partCOSubdir.length() ) + '/';
ArrayList<File> createdDirs = new ArrayList<File>();
File deepDir = new File( checkoutDirectory, res );
boolean added = false;
try
{
mkdirsThrow( deepDir, createdDirs );
if ( createdDirs.size() != 0 )
{
File topNewDir = createdDirs.get( 0 );
String relTopNewDir =
topNewDir.getPath().substring( checkoutDirectory.getPath().length() + 1 ).replace( '\\', '/' );
addFiles( scmProvider, scmRepository, checkoutDirectory, relTopNewDir );
added = true;
}
}
catch ( ScmException e )
{
fireTransferError( resource, e, TransferEvent.REQUEST_PUT );
throw new TransferFailedException( "Failed to add directory " + createdDirs.get( 0 ) + " to working copy",
e );
}
finally
{
if ( !added && createdDirs.size() != 0 )
{
FileUtils.deleteDirectory( createdDirs.get( 0 ) );
}
}
return res;
}