in wagon-provider-api/src/main/java/org/apache/maven/wagon/PathUtils.java [307:413]
public static String basedir( String url )
{
String protocol = PathUtils.protocol( url );
String retValue = null;
if ( protocol.equalsIgnoreCase( "scm" ) )
{
// skip over SCM bits
if ( url.regionMatches( true, 0, "scm:svn:", 0, 8 ) )
{
url = url.substring( url.indexOf( ":", 4 ) + 1 );
protocol = PathUtils.protocol( url );
}
}
if ( protocol.equalsIgnoreCase( "file" ) )
{
retValue = url.substring( protocol.length() + 1 );
retValue = decode( retValue );
// special case: if omitted // on protocol, keep path as is
if ( retValue.startsWith( "//" ) )
{
retValue = retValue.substring( 2 );
if ( retValue.length() >= 2 && ( retValue.charAt( 1 ) == '|' || retValue.charAt( 1 ) == ':' ) )
{
// special case: if there is a windows drive letter, then keep the original return value
retValue = retValue.charAt( 0 ) + ":" + retValue.substring( 2 );
}
else
{
// Now we expect the host
int index = retValue.indexOf( "/" );
if ( index >= 0 )
{
retValue = retValue.substring( index + 1 );
}
// special case: if there is a windows drive letter, then keep the original return value
if ( retValue.length() >= 2 && ( retValue.charAt( 1 ) == '|' || retValue.charAt( 1 ) == ':' ) )
{
retValue = retValue.charAt( 0 ) + ":" + retValue.substring( 2 );
}
else if ( index >= 0 )
{
// leading / was previously stripped
retValue = "/" + retValue;
}
}
}
// special case: if there is a windows drive letter using |, switch to :
if ( retValue.length() >= 2 && retValue.charAt( 1 ) == '|' )
{
retValue = retValue.charAt( 0 ) + ":" + retValue.substring( 2 );
}
}
else
{
final String authorization = PathUtils.authorization( url );
final int port = PathUtils.port( url );
int pos = 0;
if ( protocol.equalsIgnoreCase( "scm" ) )
{
pos = url.indexOf( ":", 4 ) + 1;
pos = url.indexOf( ":", pos ) + 1;
}
else
{
int index = url.indexOf( "://" );
if ( index != -1 )
{
pos = index + 3;
}
}
pos += authorization.length();
if ( port != WagonConstants.UNKNOWN_PORT )
{
pos = pos + Integer.toString( port ).length() + 1;
}
if ( url.length() > pos )
{
retValue = url.substring( pos );
if ( retValue.startsWith( ":" ) )
{
// this is for :/ after the host
retValue = retValue.substring( 1 );
}
// one module may be allowed in the path in CVS
retValue = retValue.replace( ':', '/' );
}
}
if ( retValue == null )
{
retValue = "/";
}
return retValue.trim();
}