You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2010/01/26 15:43:07 UTC

svn commit: r903243 [1/2] - in /maven/release/trunk: maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ maven-release-manager/src/main/java/org/apache/m...

Author: brett
Date: Tue Jan 26 14:43:06 2010
New Revision: 903243

URL: http://svn.apache.org/viewvc?rev=903243&view=rev
Log:
[MRELEASE-261] adjust the mechanism of deciding the base directories, using the common root of reactor projects. Add tests for projects that have multiple directory levels in their immediate modules list.

Added:
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/expected-pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/expected-pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/sub/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/sub/subproject2/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/sub/subproject2/expected-pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/subproject1/expected-pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/sub/subproject2/pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/subproject1/pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/subproject1/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/subproject1/expected-pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/subproject1/expected-pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/subproject1/pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/subproject1/pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multimodule-with-deep-subprojects/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multimodule-with-deep-subprojects/pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multiple-poms/pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multimodule-with-deep-subprojects/sub/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multimodule-with-deep-subprojects/sub/subproject2/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multimodule-with-deep-subprojects/sub/subproject2/pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multiple-poms/subproject2/pom.xml
    maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multimodule-with-deep-subprojects/subproject1/
    maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multimodule-with-deep-subprojects/subproject1/pom.xml
      - copied, changed from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/scm-commit/multiple-poms/subproject1/pom.xml
Modified:
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmRepositoryConfigurator.java
    maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java
    maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java
    maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java
    maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java
    maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java
    maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/PerformReleaseMojoTest.java

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/config/ReleaseUtils.java Tue Jan 26 14:43:06 2010
@@ -22,9 +22,9 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
-import java.util.Map.Entry;
 
 import org.apache.maven.model.Scm;
 
@@ -66,8 +66,6 @@
             mergeOverride( mergeInto.getScmPrivateKeyPassPhrase(), toBeMerged.getScmPrivateKeyPassPhrase() ) );
         mergeInto.setScmCommentPrefix(
             mergeOverride( mergeInto.getScmCommentPrefix(), toBeMerged.getScmCommentPrefix() ) );        
-        mergeInto.setRootProjectPath( 
-            mergeDefault( mergeInto.getRootProjectPath(), toBeMerged.getRootProjectPath() ) );
         mergeInto.setAdditionalArguments(
             mergeOverride( mergeInto.getAdditionalArguments(), toBeMerged.getAdditionalArguments() ) );
         mergeInto.setPreparationGoals(

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java Tue Jan 26 14:43:06 2010
@@ -88,7 +88,8 @@
      */
     private String pomSuffix;
 
-    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
+    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                  List reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
@@ -100,8 +101,8 @@
         return result;
     }
 
-    private void transform( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects,
-                            boolean simulate, ReleaseResult result )
+    private void transform( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                            List reactorProjects, boolean simulate, ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         for ( Iterator it = reactorProjects.iterator(); it.hasNext(); )
@@ -114,8 +115,9 @@
         }
     }
 
-    private void transformProject( MavenProject project, ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
-                                   List reactorProjects, boolean simulate, ReleaseResult result )
+    private void transformProject( MavenProject project, ReleaseDescriptor releaseDescriptor,
+                                   ReleaseEnvironment releaseEnvironment, List reactorProjects, boolean simulate,
+                                   ReleaseResult result )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         Document document;
@@ -147,7 +149,9 @@
             {
                 intro = content.substring( 0, index );
                 outtro = content.substring( index + w.toString().length() );
-            } else {
+            }
+            else
+            {
                 /*
                  * NOTE: Due to whitespace, attribute reordering or entity expansion the above indexOf test can easily
                  * fail. So let's try harder. Maybe some day, when JDOM offers a StaxBuilder and this builder employes
@@ -187,7 +191,8 @@
         ScmProvider provider;
         try
         {
-            scmRepository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, releaseEnvironment.getSettings() );
+            scmRepository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor,
+                                                                               releaseEnvironment.getSettings() );
 
             provider = scmRepositoryConfigurator.getRepositoryProvider( scmRepository );
         }
@@ -207,14 +212,13 @@
 
         if ( simulate )
         {
-            File outputFile =
-                new File( pomFile.getParentFile(), pomFile.getName() + "." + pomSuffix );
+            File outputFile = new File( pomFile.getParentFile(), pomFile.getName() + "." + pomSuffix );
             writePom( outputFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro );
         }
         else
         {
-            writePom( pomFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro,
-                      scmRepository, provider );
+            writePom( pomFile, document, releaseDescriptor, project.getModelVersion(), intro, outtro, scmRepository,
+                      provider );
         }
     }
 
@@ -297,7 +301,7 @@
         }
 
         transformScm( project, rootElement, namespace, releaseDescriptor, projectId, scmRepository, result,
-                      ReleaseUtil.getRootProject( reactorProjects ) );
+                      ReleaseUtil.getCommonBasedir( reactorProjects ) );
     }
 
     /**
@@ -305,7 +309,7 @@
      * comments around the original text value.
      *
      * @param element The element to update, must not be <code>null</code>.
-     * @param value The text string to set, must not be <code>null</code>.
+     * @param value   The text string to set, must not be <code>null</code>.
      */
     private void rewriteValue( Element element, String value )
     {
@@ -508,8 +512,9 @@
         XPath xpath;
         if ( !StringUtils.isEmpty( dependencyRoot.getNamespaceURI() ) )
         {
-            xpath = XPath.newInstance( "./pom:" + groupTagName + "/pom:" + tagName + "[normalize-space(pom:groupId)='" + groupId +
-                "' and normalize-space(pom:artifactId)='" + artifactId + "']" );
+            xpath = XPath.newInstance(
+                "./pom:" + groupTagName + "/pom:" + tagName + "[normalize-space(pom:groupId)='" + groupId +
+                    "' and normalize-space(pom:artifactId)='" + artifactId + "']" );
             xpath.addNamespace( "pom", dependencyRoot.getNamespaceURI() );
         }
         else
@@ -625,11 +630,11 @@
                                             // change the property only if the property is the same as what's in the reactor
                                             rewriteValue( property, mappedVersion );
                                         }
-                                        else if ( mappedVersion.equals( propertyValue ))
+                                        else if ( mappedVersion.equals( propertyValue ) )
                                         {
-                                           //this property may have been updated during processing a sibling.
+                                            //this property may have been updated during processing a sibling.
                                             logInfo( result, "Ignoring artifact version update for expression: " +
-                                                     mappedVersion+" because it is already updated." );
+                                                mappedVersion + " because it is already updated." );
                                         }
                                         else if ( !mappedVersion.equals( versionText ) )
                                         {
@@ -644,11 +649,11 @@
                                             else
                                             {
                                                 // the value of the expression conflicts with what the user wanted to release
-                                                throw new ReleaseFailureException( "The artifact (" + key +
-                                                    ") requires a " + "different version (" + mappedVersion +
-                                                    ") than what is found (" + propertyValue +
-                                                    ") for the expression (" + expression + ") in the " + "project (" +
-                                                    projectId + ")." );
+                                                throw new ReleaseFailureException(
+                                                    "The artifact (" + key + ") requires a " + "different version (" +
+                                                        mappedVersion + ") than what is found (" + propertyValue +
+                                                        ") for the expression (" + expression + ") in the " +
+                                                        "project (" + projectId + ")." );
                                             }
                                         }
                                     }
@@ -766,7 +771,8 @@
         }
     }
 
-    public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
+    public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                   List reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
@@ -816,7 +822,7 @@
 
     protected abstract void transformScm( MavenProject project, Element rootElement, Namespace namespace,
                                           ReleaseDescriptor releaseDescriptor, String projectId,
-                                          ScmRepository scmRepository, ReleaseResult result, MavenProject rootProject )
+                                          ScmRepository scmRepository, ReleaseResult result, String commonBasedir )
         throws ReleaseExecutionException;
 
     protected String getOriginalResolvedSnapshotVersion( String artifactVersionlessKey, Map resolvedSnapshots )

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java Tue Jan 26 14:43:06 2010
@@ -19,6 +19,10 @@
  * under the License.
  */
 
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.maven.shared.release.ReleaseExecutionException;
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
@@ -28,10 +32,6 @@
 import org.apache.maven.shared.release.exec.MavenExecutorException;
 import org.codehaus.plexus.util.StringUtils;
 
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * Run the integration tests for the project to verify that it builds before committing.
  *
@@ -50,8 +50,7 @@
     /**
      * @deprecated Use {@link AbstractRunGoalsPhase#execute(ReleaseDescriptor, ReleaseEnvironment, File, String)} instead.
      */
-    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor,
-                                  File workingDirectory,
+    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, File workingDirectory,
                                   String additionalArguments )
         throws ReleaseExecutionException
     {
@@ -71,15 +70,17 @@
             {
                 logInfo( result, "Executing goals '" + goals + "'..." );
 
-                MavenExecutor mavenExecutor = (MavenExecutor) mavenExecutors.get( releaseEnvironment.getMavenExecutorId() );
+                MavenExecutor mavenExecutor =
+                    (MavenExecutor) mavenExecutors.get( releaseEnvironment.getMavenExecutorId() );
 
                 if ( mavenExecutor == null )
                 {
-                    throw new ReleaseExecutionException( "Cannot find Maven executor with id: " + releaseEnvironment.getMavenExecutorId() );
+                    throw new ReleaseExecutionException(
+                        "Cannot find Maven executor with id: " + releaseEnvironment.getMavenExecutorId() );
                 }
 
                 mavenExecutor.executeGoals( determineWorkingDirectory( workingDirectory,
-                                            releaseDescriptor.getScmRelativePathProjectDirectory(), releaseDescriptor.getRootProjectPath() ),
+                                                                       releaseDescriptor.getScmRelativePathProjectDirectory() ),
                                             goals, releaseEnvironment, releaseDescriptor.isInteractive(),
                                             additionalArguments, result );
             }
@@ -122,23 +123,17 @@
      * @param checkoutDirectory            The checkout directory as java.io.File
      * @param relativePathProjectDirectory The relative path of the project directory within the checkout
      *                                     directory or ""
-     * @param rootProjectPath TODO
      * @return The working directory
      */
-    protected File determineWorkingDirectory( File checkoutDirectory, String relativePathProjectDirectory, String rootProjectPath )
+    protected File determineWorkingDirectory( File checkoutDirectory, String relativePathProjectDirectory )
     {
         File workingDirectory = checkoutDirectory;
-        
+
         if ( StringUtils.isNotEmpty( relativePathProjectDirectory ) )
         {
             workingDirectory = new File( checkoutDirectory, relativePathProjectDirectory );
         }
-        
-        if( StringUtils.isNotEmpty( rootProjectPath ) )
-        {
-            workingDirectory = new File( workingDirectory, rootProjectPath );
-        }
-        
+
         return workingDirectory;
     }
 }

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomVersionsPhase.java Tue Jan 26 14:43:06 2010
@@ -19,6 +19,9 @@
  * under the License.
  */
 
+import java.util.List;
+import java.util.Map;
+
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.shared.release.ReleaseExecutionException;
@@ -27,9 +30,6 @@
 import org.jdom.Element;
 import org.jdom.Namespace;
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * Rewrite POMs for future development
  *
@@ -41,7 +41,7 @@
 
     protected void transformScm( MavenProject project, Element rootElement, Namespace namespace,
                                  ReleaseDescriptor releaseDescriptor, String projectId, ScmRepository scmRepository,
-                                 ReleaseResult result, MavenProject rootProject )
+                                 ReleaseResult result, String commonBasedir )
         throws ReleaseExecutionException
     {
         // We are only updating versions no mods to scm needed

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForBranchPhase.java Tue Jan 26 14:43:06 2010
@@ -19,6 +19,9 @@
  * under the License.
  */
 
+import java.util.List;
+import java.util.Map;
+
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
@@ -26,12 +29,10 @@
 import org.apache.maven.shared.release.ReleaseResult;
 import org.apache.maven.shared.release.config.ReleaseDescriptor;
 import org.apache.maven.shared.release.scm.ScmTranslator;
+import org.apache.maven.shared.release.util.ReleaseUtil;
 import org.jdom.Element;
 import org.jdom.Namespace;
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * Rewrite POMs for branch.
  *
@@ -48,7 +49,7 @@
 
     protected void transformScm( MavenProject project, Element rootElement, Namespace namespace,
                                  ReleaseDescriptor releaseDescriptor, String projectId, ScmRepository scmRepository,
-                                 ReleaseResult result, MavenProject rootProject )
+                                 ReleaseResult result, String commonBasedir )
     {
         // If SCM is null in original model, it is inherited, no mods needed
         if ( project.getScm() != null )
@@ -58,7 +59,7 @@
             {
                 releaseDescriptor.mapOriginalScmInfo( projectId, project.getScm() );
 
-                translateScm( project, releaseDescriptor, scmRoot, namespace, scmRepository, result, rootProject );
+                translateScm( project, releaseDescriptor, scmRoot, namespace, scmRepository, result, commonBasedir );
             }
             else
             {
@@ -77,7 +78,7 @@
                         scmRoot.addContent( "\n  " );
 
                         if ( translateScm( project, releaseDescriptor, scmRoot, namespace, scmRepository, result,
-                                           rootProject ) )
+                                           commonBasedir ) )
                         {
                             rootElement.addContent( "\n  " ).addContent( scmRoot ).addContent( "\n" );
                         }
@@ -89,7 +90,7 @@
 
     private boolean translateScm( MavenProject project, ReleaseDescriptor releaseDescriptor, Element scmRoot,
                                   Namespace namespace, ScmRepository scmRepository, ReleaseResult relResult,
-                                  MavenProject rootProject )
+                                  String commonBasedir )
     {
         ScmTranslator translator = (ScmTranslator) scmTranslators.get( scmRepository.getProvider() );
         boolean result = false;
@@ -98,7 +99,6 @@
             Scm scm = project.getScm();
             String branchName = releaseDescriptor.getScmReleaseLabel();
             String branchBase = releaseDescriptor.getScmBranchBase();
-            String subDirectoryBranch = "";
 
             // TODO: svn utils should take care of prepending this
             if ( branchBase != null )
@@ -106,13 +106,18 @@
                 branchBase = "scm:svn:" + branchBase;
             }
 
-            Scm rootScm = rootProject.getScm();
+            int count =
+                ReleaseUtil.getBaseWorkingDirectoryParentCount( commonBasedir, project.getBasedir().getAbsolutePath() );
             if ( scm.getConnection() != null )
             {
-                if ( rootScm.getConnection() != null && scm.getConnection().indexOf( rootScm.getConnection() ) == 0 )
+                String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getConnection() );
+
+                String subDirectoryBranch = scm.getConnection().substring( rootUrl.length() );
+                if ( !subDirectoryBranch.startsWith( "/" ) )
                 {
-                    subDirectoryBranch = scm.getConnection().substring( rootScm.getConnection().length() );
+                    subDirectoryBranch = "/" + subDirectoryBranch;
                 }
+
                 String value =
                     translator.translateBranchUrl( scm.getConnection(), branchName + subDirectoryBranch, branchBase );
                 if ( !value.equals( scm.getConnection() ) )
@@ -124,14 +129,17 @@
 
             if ( scm.getDeveloperConnection() != null )
             {
-                if ( rootScm.getDeveloperConnection() != null &&
-                    scm.getDeveloperConnection().indexOf( rootScm.getDeveloperConnection() ) == 0 )
+                String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getDeveloperConnection() );
+
+                String subDirectoryBranch = scm.getDeveloperConnection().substring( rootUrl.length() );
+                if ( !subDirectoryBranch.startsWith( "/" ) )
                 {
-                    subDirectoryBranch =
-                        scm.getDeveloperConnection().substring( rootScm.getDeveloperConnection().length() );
+                    subDirectoryBranch = "/" + subDirectoryBranch;
                 }
+
                 String value =
-                    translator.translateBranchUrl( scm.getDeveloperConnection(), branchName + subDirectoryBranch, branchBase );
+                    translator.translateBranchUrl( scm.getDeveloperConnection(), branchName + subDirectoryBranch,
+                                                   branchBase );
                 if ( !value.equals( scm.getDeveloperConnection() ) )
                 {
                     rewriteElement( "developerConnection", value, scmRoot, namespace );
@@ -141,13 +149,17 @@
 
             if ( scm.getUrl() != null )
             {
-                if ( rootScm.getUrl() != null && scm.getUrl().indexOf( rootScm.getUrl() ) == 0 )
+                String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getUrl() );
+
+                String subDirectoryBranch = scm.getUrl().substring( rootUrl.length() );
+                if ( !subDirectoryBranch.startsWith( "/" ) )
                 {
-                    subDirectoryBranch = scm.getUrl().substring( rootScm.getUrl().length() );
+                    subDirectoryBranch = "/" + subDirectoryBranch;
                 }
+
                 // use original branch base without protocol
                 String value = translator.translateBranchUrl( scm.getUrl(), branchName + subDirectoryBranch,
-                                                           releaseDescriptor.getScmBranchBase() );
+                                                              releaseDescriptor.getScmBranchBase() );
                 if ( !value.equals( scm.getUrl() ) )
                 {
                     rewriteElement( "url", value, scmRoot, namespace );

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForDevelopmentPhase.java Tue Jan 26 14:43:06 2010
@@ -19,6 +19,9 @@
  * under the License.
  */
 
+import java.util.List;
+import java.util.Map;
+
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.repository.ScmRepository;
@@ -29,9 +32,6 @@
 import org.jdom.Element;
 import org.jdom.Namespace;
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * Rewrite POMs for future development
  *
@@ -47,7 +47,7 @@
 
     protected void transformScm( MavenProject project, Element rootElement, Namespace namespace,
                                  ReleaseDescriptor releaseDescriptor, String projectId, ScmRepository scmRepository,
-                                 ReleaseResult result, MavenProject rootProject )
+                                 ReleaseResult result, String commonBasedir )
         throws ReleaseExecutionException
     {
         // If SCM is null in original model, it is inherited, no mods needed

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhase.java Tue Jan 26 14:43:06 2010
@@ -19,6 +19,9 @@
  * under the License.
  */
 
+import java.util.List;
+import java.util.Map;
+
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
@@ -31,9 +34,6 @@
 import org.jdom.Element;
 import org.jdom.Namespace;
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * Rewrite POMs for release.
  *
@@ -49,7 +49,7 @@
 
     protected void transformScm( MavenProject project, Element rootElement, Namespace namespace,
                                  ReleaseDescriptor releaseDescriptor, String projectId, ScmRepository scmRepository,
-                                 ReleaseResult result, MavenProject rootProject )
+                                 ReleaseResult result, String commonBasedir )
     {
         // If SCM is null in original model, it is inherited, no mods needed
         if ( project.getScm() != null )
@@ -59,7 +59,7 @@
             {
                 releaseDescriptor.mapOriginalScmInfo( projectId, project.getScm() );
 
-                translateScm( project, releaseDescriptor, scmRoot, namespace, scmRepository, result, rootProject );
+                translateScm( project, releaseDescriptor, scmRoot, namespace, scmRepository, result, commonBasedir );
             }
             else
             {
@@ -78,7 +78,7 @@
                         scmRoot.addContent( "\n  " );
 
                         if ( translateScm( project, releaseDescriptor, scmRoot, namespace, scmRepository, result,
-                                           rootProject ) )
+                                           commonBasedir ) )
                         {
                             rootElement.addContent( "\n  " ).addContent( scmRoot ).addContent( "\n" );
                         }
@@ -90,7 +90,7 @@
 
     private boolean translateScm( MavenProject project, ReleaseDescriptor releaseDescriptor, Element scmRoot,
                                   Namespace namespace, ScmRepository scmRepository, ReleaseResult relResult,
-                                  MavenProject rootProject )
+                                  String commonBasedir )
     {
         ScmTranslator translator = (ScmTranslator) scmTranslators.get( scmRepository.getProvider() );
         boolean result = false;
@@ -99,7 +99,6 @@
             Scm scm = project.getScm();
             String tag = releaseDescriptor.getScmReleaseLabel();
             String tagBase = releaseDescriptor.getScmTagBase();
-            String subDirectoryTag = "";
 
             // TODO: svn utils should take care of prepending this
             if ( tagBase != null )
@@ -107,13 +106,18 @@
                 tagBase = "scm:svn:" + tagBase;
             }
 
-            Scm rootScm = rootProject.getScm();            
+            int count =
+                ReleaseUtil.getBaseWorkingDirectoryParentCount( commonBasedir, project.getBasedir().getAbsolutePath() );
             if ( scm.getConnection() != null )
             {
-                if ( rootScm.getConnection() != null && scm.getConnection().indexOf( rootScm.getConnection() ) == 0 )
+                String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getConnection() );
+
+                String subDirectoryTag = scm.getConnection().substring( rootUrl.length() );
+                if ( !subDirectoryTag.startsWith( "/" ) )
                 {
-                    subDirectoryTag = scm.getConnection().substring( getLengthOfRootScmConnectionUrl( rootScm.getConnection() ) );
+                    subDirectoryTag = "/" + subDirectoryTag;
                 }
+
                 String scmConnectionTag = tagBase;
                 if ( scmConnectionTag != null )
                 {
@@ -127,8 +131,6 @@
                 String value =
                     translator.translateTagUrl( scm.getConnection(), tag + subDirectoryTag, scmConnectionTag );
 
-                value = addRootProjectPath( rootProject, value );
-                
                 if ( !value.equals( scm.getConnection() ) )
                 {
                     rewriteElement( "connection", value, scmRoot, namespace );
@@ -138,17 +140,17 @@
 
             if ( scm.getDeveloperConnection() != null )
             {
-                if ( rootScm.getDeveloperConnection() != null &&
-                    scm.getDeveloperConnection().indexOf( rootScm.getDeveloperConnection() ) == 0 )
+                String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getDeveloperConnection() );
+
+                String subDirectoryTag = scm.getDeveloperConnection().substring( rootUrl.length() );
+                if ( !subDirectoryTag.startsWith( "/" ) )
                 {
-                    subDirectoryTag =
-                        scm.getDeveloperConnection().substring( getLengthOfRootScmConnectionUrl( rootScm.getDeveloperConnection() ) );
+                    subDirectoryTag = "/" + subDirectoryTag;
                 }
+
                 String value =
                     translator.translateTagUrl( scm.getDeveloperConnection(), tag + subDirectoryTag, tagBase );
 
-                value = addRootProjectPath( rootProject, value );
-                
                 if ( !value.equals( scm.getDeveloperConnection() ) )
                 {
                     rewriteElement( "developerConnection", value, scmRoot, namespace );
@@ -158,9 +160,12 @@
 
             if ( scm.getUrl() != null )
             {
-                if ( rootScm.getUrl() != null && scm.getUrl().indexOf( rootScm.getUrl() ) == 0 )
+                String rootUrl = ReleaseUtil.realignScmUrl( count, scm.getUrl() );
+
+                String subDirectoryTag = scm.getUrl().substring( rootUrl.length() );
+                if ( !subDirectoryTag.startsWith( "/" ) )
                 {
-                    subDirectoryTag = scm.getUrl().substring( getLengthOfRootScmConnectionUrl( rootScm.getUrl() ) );
+                    subDirectoryTag = "/" + subDirectoryTag;
                 }
 
                 String tagScmUrl = tagBase;
@@ -175,7 +180,6 @@
                 }
                 // use original tag base without protocol
                 String value = translator.translateTagUrl( scm.getUrl(), tag + subDirectoryTag, tagScmUrl );
-                value = addRootProjectPath( rootProject, value );
                 if ( !value.equals( scm.getUrl() ) )
                 {
                     rewriteElement( "url", value, scmRoot, namespace );
@@ -204,16 +208,6 @@
         return result;
     }
 
-    private String addRootProjectPath( MavenProject rootProject, String value )
-    {
-        String rootProjectPath = ReleaseUtil.getRootProjectPath( rootProject );
-        if( !StringUtils.isEmpty( rootProjectPath ) )
-        {
-            value = value + rootProjectPath;
-        }
-        return value;
-    }
-
     protected Map getOriginalVersionMap( ReleaseDescriptor releaseDescriptor, List reactorProjects )
     {
         return releaseDescriptor.getOriginalVersions( reactorProjects );
@@ -279,16 +273,4 @@
             return StringUtils.replace( urlPath, trunkPath.substring( i ), tagPath.substring( i ) );
         }
     }
-
-    private int getLengthOfRootScmConnectionUrl( String rootScmConnectionUrl )
-    {
-        if( rootScmConnectionUrl.endsWith( "/" ) )
-        {
-            return rootScmConnectionUrl.length() - 1;
-        }
-        else
-        {
-            return rootScmConnectionUrl.length();
-        }
-    }
 }

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java Tue Jan 26 14:43:06 2010
@@ -20,13 +20,8 @@
  */
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.Reader;
 import java.util.List;
 
-import org.apache.maven.model.Model;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmTagParameters;
@@ -44,9 +39,6 @@
 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
 import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator;
 import org.apache.maven.shared.release.util.ReleaseUtil;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.ReaderFactory;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
  * Tag the SCM repository after committing the release.
@@ -64,7 +56,8 @@
      */
     private ScmRepositoryConfigurator scmRepositoryConfigurator;
 
-    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
+    public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                  List reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult relResult = new ReleaseResult();
@@ -73,23 +66,17 @@
 
         logInfo( relResult, "Tagging release with the label " + releaseDescriptor.getScmReleaseLabel() + "..." );
 
+        ReleaseDescriptor basedirAlignedReleaseDescriptor =
+            ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
+
         ScmRepository repository;
         ScmProvider provider;
-
-        String workingDirectory = releaseDescriptor.getWorkingDirectory();
-        List modules = getModules( releaseDescriptor, workingDirectory );
-        String scmSourceUrl = releaseDescriptor.getScmSourceUrl();
-
-        // determine if project is a flat multi-module
-        if ( modules != null && !modules.isEmpty() )
-        {
-            workingDirectory = ReleaseUtil.getBaseWorkingDirectory( workingDirectory, modules );
-            releaseDescriptor.setScmSourceUrl( ReleaseUtil.getBaseScmUrl( scmSourceUrl, modules ) );
-        }
-
         try
         {
-            repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor, releaseEnvironment.getSettings() );
+            repository =
+                scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
+                                                                   releaseDescriptor,
+                                                                   releaseEnvironment.getSettings() );
 
             provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
         }
@@ -106,16 +93,18 @@
         try
         {
             // TODO: want includes/excludes?
-            ScmFileSet fileSet = new ScmFileSet( new File( workingDirectory ) );
+            ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
             String tagName = releaseDescriptor.getScmReleaseLabel();
-            ScmTagParameters scmTagParameters = new ScmTagParameters( releaseDescriptor.getScmCommentPrefix()
-                + " copy for tag " + tagName );
+            ScmTagParameters scmTagParameters =
+                new ScmTagParameters( releaseDescriptor.getScmCommentPrefix() + " copy for tag " + tagName );
             scmTagParameters.setRemoteTagging( releaseDescriptor.isRemoteTagging() );
             scmTagParameters.setScmRevision( releaseDescriptor.getScmReleasedPomRevision() );
-            if (getLogger().isDebugEnabled())
+            if ( getLogger().isDebugEnabled() )
             {
-                getLogger().debug( "ScmTagPhase :: scmTagParameters remotingTag " + releaseDescriptor.isRemoteTagging() );
-                getLogger().debug( "ScmTagPhase :: scmTagParameters scmRevision " + releaseDescriptor.getScmReleasedPomRevision() );
+                getLogger().debug(
+                    "ScmTagPhase :: scmTagParameters remotingTag " + releaseDescriptor.isRemoteTagging() );
+                getLogger().debug(
+                    "ScmTagPhase :: scmTagParameters scmRevision " + releaseDescriptor.getScmReleasedPomRevision() );
             }
             result = provider.tag( repository, fileSet, tagName, scmTagParameters );
         }
@@ -123,10 +112,6 @@
         {
             throw new ReleaseExecutionException( "An error is occurred in the tag process: " + e.getMessage(), e );
         }
-        finally
-        {
-            revertToOriginalScmSourceUrl( releaseDescriptor, scmSourceUrl );
-        }
 
         if ( !result.isSuccess() )
         {
@@ -138,80 +123,28 @@
         return relResult;
     }
 
-    private void revertToOriginalScmSourceUrl( ReleaseDescriptor releaseDescriptor, String scmSourceUrl )
-    {
-        if( !scmSourceUrl.equals( releaseDescriptor.getScmSourceUrl() ) )
-        {
-            releaseDescriptor.setScmSourceUrl( scmSourceUrl );
-        }
-    }
-
-    private List getModules( ReleaseDescriptor releaseDescriptor, String workingDirectory )
-    {
-        Reader in = null;
-        try
-        {
-            String pomFile = releaseDescriptor.getPomFileName();
-            if ( pomFile == null || "".equals( pomFile.trim() ) )
-            {
-                pomFile = ReleaseUtil.POMv4;
-            }
-
-            String pathToRootPom = workingDirectory + ReleaseUtil.FS + pomFile;
-
-            MavenXpp3Reader reader = new MavenXpp3Reader();
-            in = ReaderFactory.newXmlReader( new File( pathToRootPom ) );
-
-            Model model = reader.read( in );
-
-            return model.getModules();
-        }
-        catch ( FileNotFoundException e )
-        {
-            getLogger().warn( "Pom file not found : " + e.getMessage() );
-            getLogger().warn( "Assuming working directory in release descriptor is the base working directory." );
-
-        }
-        catch ( IOException e )
-        {
-            getLogger().warn( "IO error occurred while reading pom file : " + e.getMessage() );
-            getLogger().warn( "Assuming working directory in release descriptor is the base working directory." );
-        }
-        catch ( XmlPullParserException e )
-        {
-            getLogger().warn( "Error parsing pom file : " + e.getMessage() );
-            getLogger().warn( "Assuming working directory in release descriptor is the base working directory." );
-        }
-        finally
-        {
-            IOUtil.close( in );
-        }
-
-        return null;
-    }
-
-    public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects )
+    public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment,
+                                   List reactorProjects )
         throws ReleaseExecutionException, ReleaseFailureException
     {
         ReleaseResult result = new ReleaseResult();
 
         validateConfiguration( releaseDescriptor );
 
-        String workingDirectory = releaseDescriptor.getWorkingDirectory();
-        List modules = getModules( releaseDescriptor, workingDirectory );
-        String scmSourceUrl = releaseDescriptor.getScmSourceUrl();
+        ReleaseDescriptor basedirAlignedReleaseDescriptor =
+            ReleaseUtil.createBasedirAlignedReleaseDescriptor( releaseDescriptor, reactorProjects );
 
-     // determine if project is a flat multi-module
-        if ( modules != null && !modules.isEmpty() )
+        if ( releaseDescriptor.isRemoteTagging() )
         {
-            workingDirectory = ReleaseUtil.getBaseWorkingDirectory( workingDirectory, modules );
-            releaseDescriptor.setScmSourceUrl( ReleaseUtil.getBaseScmUrl( scmSourceUrl, modules ) );
+            logInfo( result,
+                     "Full run would be tagging working copy " + basedirAlignedReleaseDescriptor.getWorkingDirectory() +
+                         " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" );
+        }
+        else
+        {
+            logInfo( result, "Full run would be tagging remotely " + basedirAlignedReleaseDescriptor.getScmSourceUrl() +
+                " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" );
         }
-
-        logInfo( result, "Full run would be tagging " + workingDirectory + " with label: '" +
-            releaseDescriptor.getScmReleaseLabel() + "'" );
-
-        revertToOriginalScmSourceUrl( releaseDescriptor, scmSourceUrl );
 
         result.setResultCode( ReleaseResult.SUCCESS );
 

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/DefaultScmRepositoryConfigurator.java Tue Jan 26 14:43:06 2010
@@ -53,9 +53,15 @@
     public ScmRepository getConfiguredRepository( ReleaseDescriptor releaseDescriptor, Settings settings )
         throws ScmRepositoryException, NoSuchScmProviderException
     {
+        String url = releaseDescriptor.getScmSourceUrl();
+        return getConfiguredRepository( url, releaseDescriptor, settings );
+    }
+
+    public ScmRepository getConfiguredRepository( String url, ReleaseDescriptor releaseDescriptor, Settings settings )
+        throws ScmRepositoryException, NoSuchScmProviderException
+    {
         String username = releaseDescriptor.getScmUsername();
         String password = releaseDescriptor.getScmPassword();
-        String url = releaseDescriptor.getScmSourceUrl();
         String privateKey = releaseDescriptor.getScmPrivateKey();
         String passphrase = releaseDescriptor.getScmPrivateKeyPassPhrase();
 
@@ -141,7 +147,7 @@
             {
                 svnRepo.setTagBase( tagBase );
             }
-            
+
             String branchBase = releaseDescriptor.getScmBranchBase();
             if ( !StringUtils.isEmpty( branchBase ) )
             {

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmRepositoryConfigurator.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmRepositoryConfigurator.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmRepositoryConfigurator.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/scm/ScmRepositoryConfigurator.java Tue Jan 26 14:43:06 2010
@@ -59,4 +59,17 @@
      */
     ScmProvider getRepositoryProvider( ScmRepository repository )
         throws NoSuchScmProviderException;
+
+    /**
+     * Construct a configured SCM repository from a release configuration with an overridden base SCM URL.
+     *
+     * @param url               the SCM URL to use instead of the one from the release descriptor
+     * @param releaseDescriptor the configuration to insert into the repository
+     * @param settings          the settings.xml configuraiton
+     * @return the repository created
+     * @throws ScmRepositoryException     if it is not possible to create a suitable SCM repository
+     * @throws NoSuchScmProviderException if the requested SCM provider is not available
+     */
+    ScmRepository getConfiguredRepository( String url, ReleaseDescriptor releaseDescriptor, Settings settings )
+        throws ScmRepositoryException, NoSuchScmProviderException;
 }

Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java (original)
+++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java Tue Jan 26 14:43:06 2010
@@ -27,6 +27,9 @@
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.release.ReleaseExecutionException;
+import org.apache.maven.shared.release.config.ReleaseDescriptor;
+import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.ReaderFactory;
 
@@ -44,11 +47,6 @@
      * The line separator to use.
      */
     public static final String LS = System.getProperty( "line.separator" );
-    
-    /**
-     * The path separator to use.
-     */
-    public static final String FS = System.getProperty( "file.separator" );
 
     private ReleaseUtil()
     {
@@ -73,12 +71,16 @@
     public static File getStandardPom( MavenProject project )
     {
         if ( project == null )
+        {
             return null;
+        }
 
         File pom = project.getFile();
 
         if ( pom == null )
+        {
             return null;
+        }
 
         File releasePom = getReleasePom( project );
         if ( pom.equals( releasePom ) )
@@ -92,12 +94,16 @@
     public static File getReleasePom( MavenProject project )
     {
         if ( project == null )
+        {
             return null;
+        }
 
         File pom = project.getFile();
 
         if ( pom == null )
+        {
             return null;
+        }
 
         return new File( pom.getParent(), RELEASE_POMv4 );
     }
@@ -106,7 +112,7 @@
      * Gets the string contents of the specified XML file. Note: In contrast to an XML processor, the line separators in
      * the returned string will be normalized to use the platform's native line separator. This is basically to save
      * another normalization step when writing the string contents back to an XML file.
-     * 
+     *
      * @param file The path to the XML file to read in, must not be <code>null</code>.
      * @return The string contents of the XML file.
      * @throws IOException If the file could not be opened/read.
@@ -128,10 +134,10 @@
 
     /**
      * Normalizes the line separators in the specified string.
-     * 
-     * @param text The string to normalize, may be <code>null</code>.
+     *
+     * @param text      The string to normalize, may be <code>null</code>.
      * @param separator The line separator to use for normalization, typically "\n" or "\r\n", must not be
-     *            <code>null</code>.
+     *                  <code>null</code>.
      * @return The input string with normalized line separators or <code>null</code> if the string was <code>null</code>
      *         .
      */
@@ -144,132 +150,87 @@
         }
         return norm;
     }
-    
-    /**
-     * Determines the base working directory with regard to the longest relative path of the modules. 
-     * 
-     * @param workingDirectory The working directory of the project to be released
-     * @param modules The \<modules\> of the project to be released
-     * @return The base working directory of the project
-     */
-    public static String getBaseWorkingDirectory( String workingDirectory, List modules )
-    {        
-        int count = getLongestPathCount( modules );
-        workingDirectory = StringUtils.chomp( workingDirectory, FS );
-        
-        while( count > 0 )
-        {   
-            int lastSep = workingDirectory.lastIndexOf( FS );
-            workingDirectory = StringUtils.substring( workingDirectory, 0, lastSep );            
-            count--;
-        }
-        return workingDirectory;
-    }
-    
-    /**
-     * Determines the base scm url with regard to the longest relative path of the modules.
-     * 
-     * @param scmUrl The scm source url of the project to be released which is set in the release descriptor.
-     * @param modules The \<modules\> of the project to be released
-     * @return
-     */
-    public static String getBaseScmUrl( String scmUrl, List modules )
-    {                
-        int count = getLongestPathCount( modules );                
-        scmUrl = StringUtils.chomp( scmUrl, "/" );
-        
-        while( count > 0 )
-        {   
-            int lastSep = scmUrl.lastIndexOf( "/" );
-            scmUrl = StringUtils.substring( scmUrl, 0, lastSep );        
-            count--;
-        }
-        return scmUrl;
+
+    public static ReleaseDescriptor createBasedirAlignedReleaseDescriptor( ReleaseDescriptor releaseDescriptor,
+                                                                           List reactorProjects )
+        throws ReleaseExecutionException
+    {
+        String basedir = getCommonBasedir( reactorProjects );
+
+        int parentLevels =
+            getBaseWorkingDirectoryParentCount( basedir,
+                                                FileUtils.normalize( releaseDescriptor.getWorkingDirectory() ) );
+
+        String url = releaseDescriptor.getScmSourceUrl();
+        url = realignScmUrl( parentLevels, url );
+
+        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        descriptor.setWorkingDirectory( basedir );
+        descriptor.setScmSourceUrl( url );
+        return descriptor;
     }
-    
-    /**
-     * Returns the common path of the two paths specified.
-     * 
-     * @param path1 The first path
-     * @param path2 The second path
-     * @return The common path of the two paths.
-     */
-    public static String getCommonPath( String path1, String path2 )
+
+    public static String getCommonBasedir( List reactorProjects )
     {
-        if ( path2 == null || path2.equals( "" ) )
-        {
-            return path1;
-        }
-        else
+        String basedir = null;
+        for ( Iterator i = reactorProjects.iterator(); i.hasNext(); )
         {
-            int indexDiff = StringUtils.indexOfDifference( path1, path2 );            
-            if( indexDiff > 0 )
+            MavenProject p = (MavenProject) i.next();
+
+            String dir = FileUtils.normalize( p.getBasedir().getAbsolutePath() );
+
+            if ( basedir == null )
             {
-                return path1.substring( 0, indexDiff );
+                basedir = dir;
             }
             else
             {
-                return path1;
+                basedir = StringUtils.getCommonPrefix( new String[]{dir, basedir} );
+            }
+            if ( basedir.endsWith( "/" ) && basedir.length() > 1 )
+            {
+                basedir = basedir.substring( 0, basedir.length() - 1 );
             }
         }
+        return basedir;
     }
-    
-    private static int getLongestPathCount( List modules )
+
+    public static int getBaseWorkingDirectoryParentCount( String basedir, String workingDirectory )
     {
-        int count = 0;
-        if( modules == null || modules.isEmpty() )
+        int num = 0;
+        if ( !workingDirectory.equals( basedir ) && workingDirectory.startsWith( basedir ) )
         {
-            return 0;
-        }
-        
-        for( Iterator iter = modules.iterator(); iter.hasNext(); )
-        {
-            String module = ( String ) iter.next();
-            module = StringUtils.replace( module, "\\", "/" );
-            
-            // module is a path
-            if( module.indexOf( '/' ) != -1 )
-            {   
-                int tmp = StringUtils.countMatches( module, "/" );
-                if( tmp > count )
-                {
-                    count = tmp;
-                }
-            }                    
+            do
+            {
+                workingDirectory = new File( workingDirectory ).getParent();
+                num++;
+            }
+            while ( workingDirectory.length() > basedir.length() );
         }
-        return count;
+        return num;
     }
-    
-    /**
-     * Gets the path to the project root. Useful in determining whether the project has a flat structure.
-     * 
-     * @param project
-     * @return the root project path or <code>null</code>
-     */
-    public static String getRootProjectPath( MavenProject project )
+
+    public static String realignScmUrl( int parentLevels, String url )
     {
-        String relPath = null;
-        
-        // module is a flat multi-module project
-        if( getLongestPathCount( project.getModules() ) > 0 )
-        {     
-            String projectBaseDir = project.getBasedir().getPath();            
-        	projectBaseDir = StringUtils.replace( projectBaseDir, "\\", "/" );
-            
-            String projectPath = "";            
-            if( project.getScm() != null )
-            {
-            	String scmConnection = project.getScm().getConnection();
-            	scmConnection = StringUtils.replace( scmConnection, "\\", "/" );
-            	
-                projectPath =
-                    ReleaseUtil.getCommonPath( StringUtils.reverse( StringUtils.chomp( projectBaseDir, "/" ) ),
-                                               StringUtils.reverse( StringUtils.chomp( scmConnection, "/" ) ) );
+        if ( !StringUtils.isEmpty( url ) )
+        {
+            int index = url.length();
+            String suffix = "";
+            if ( url.endsWith( "/" ) )
+            {
+                index--;
+                suffix = "/";
+            }
+            for ( int i = 0; i < parentLevels && index > 0; i++ )
+            {
+                index = url.lastIndexOf( '/', index - 1 );
+            }
+
+            if ( index > 0 )
+            {
+                url = url.substring( 0, index ) + suffix;
             }
-            
-            relPath = StringUtils.reverse( projectPath );
         }
-        
-        return relPath;
+        return url;
     }
 }

Modified: maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo (original)
+++ maven/release/trunk/maven-release-manager/src/main/mdo/release-descriptor.mdo Tue Jan 26 14:43:06 2010
@@ -418,14 +418,6 @@
             This is very helpful for releasing large projects!
           </description>
         </field>
-        <field>
-          <name>rootProjectPath</name>
-          <version>2.0.0+</version>
-          <type>String</type>
-          <description>
-            Path to the root project. Used during release:perform and release:stage of flat multi-module projects.
-          </description>
-        </field>
 
         <!-- Announcement Information
 
@@ -615,8 +607,7 @@
              !saveEquals( checkoutDirectory, that.checkoutDirectory ) ||
              !saveEquals( performGoals, that.performGoals ) ||
              !saveEquals( defaultReleaseVersion, that.defaultReleaseVersion ) ||
-             !saveEquals( scmReleasedPomRevision, that.scmReleasedPomRevision ) ||
-             !saveEquals( rootProjectPath, that.rootProjectPath )
+             !saveEquals( scmReleasedPomRevision, that.scmReleasedPomRevision )
            )
         {
             return false;
@@ -820,7 +811,6 @@
         result = 29 * result + ( performGoals != null ? performGoals.hashCode() : 0 );
         result = 29 * result + ( defaultReleaseVersion != null ? defaultReleaseVersion.hashCode() : 0 );
         result = 29 * result + ( scmReleasedPomRevision != null ? scmReleasedPomRevision.hashCode() : 0 );
-        result = 29 * result + ( rootProjectPath != null ? rootProjectPath.hashCode() : 0 );
 
         return result;
     }

Modified: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java (original)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java Tue Jan 26 14:43:06 2010
@@ -326,6 +326,21 @@
         assertTrue( comparePomFiles( reactorProjects ) );
     }
 
+    public void testRewritePomWithDeepSubprojects()
+        throws Exception
+    {
+        List reactorProjects = createReactorProjects( "multimodule-with-deep-subprojects" );
+
+        ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
+        config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
+        config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
+        config.mapReleaseVersion( "groupId:subproject2", ALTERNATIVE_NEXT_VERSION );
+
+        phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
+
+        assertTrue( comparePomFiles( reactorProjects ) );
+    }
+
     public void testRewritePomForFlatMultiModule()
         throws Exception
     {

Modified: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java (original)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmTagPhaseTest.java Tue Jan 26 14:43:06 2010
@@ -97,6 +97,39 @@
         assertTrue( true );
     }
 
+    public void testCommitMultiModuleDeepFolders()
+        throws Exception
+    {
+        List reactorProjects = createReactorProjects( "scm-commit/", "multimodule-with-deep-subprojects", false );
+        String sourceUrl = "http://svn.example.com/repos/project/trunk/";
+        String scmUrl = "scm:svn:" + sourceUrl;
+        ReleaseDescriptor descriptor = new ReleaseDescriptor();
+        descriptor.setScmSourceUrl( scmUrl );
+        MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
+        descriptor.setWorkingDirectory( rootProject.getFile().getParentFile().getAbsolutePath() );
+        descriptor.setScmReleaseLabel( "release-label" );
+        descriptor.setScmCommentPrefix( "[my prefix]" );
+        descriptor.setScmTagBase( "http://svn.example.com/repos/project/releases/" );
+
+        ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile() );
+
+        Mock scmProviderMock = new Mock( ScmProvider.class );
+        SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository( sourceUrl );
+        scmProviderRepository.setTagBase( "http://svn.example.com/repos/project/releases/" );
+        ScmRepository repository = new ScmRepository( "svn", scmProviderRepository );
+        Constraint[] arguments = new Constraint[]{new IsEqual( repository ), new IsScmFileSetEquals( fileSet ),
+            new IsEqual( "release-label" ),
+            new IsScmTagParamtersEquals( new ScmTagParameters( "[my prefix] copy for tag release-label" ) )};
+        scmProviderMock.expects( new InvokeOnceMatcher() ).method( "tag" ).with( arguments ).will(
+            new ReturnStub( new TagScmResult( "...", Collections.singletonList( rootProject.getFile() ) ) ) );
+
+        ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
+        stub.setScmProvider( (ScmProvider) scmProviderMock.proxy() );
+        stub.addScmRepositoryForUrl( scmUrl, repository );
+
+        phase.execute( descriptor, new DefaultReleaseEnvironment(), reactorProjects );
+    }
+
     public void testCommitForFlatMultiModule()
         throws Exception
     {

Modified: maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java?rev=903243&r1=903242&r2=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java (original)
+++ maven/release/trunk/maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java Tue Jan 26 14:43:06 2010
@@ -1,20 +1,33 @@
-/**
- * 
- */
 package org.apache.maven.shared.release.util;
 
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Arrays;
+import java.util.Collections;
 
-import org.apache.maven.model.Scm;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.PlexusTestCase;
 
 /**
  * Tests for ReleaseUtil methods
- * 
- * @author aheritier
  */
 public class ReleaseUtilTest
     extends PlexusTestCase
@@ -23,154 +36,105 @@
      * MRELEASE-273 : Tests if there no pom passed as parameter
      */
     public void testProjectIsNull()
-        throws Exception
     {
         assertNull( ReleaseUtil.getReleasePom( null ) );
         assertNull( ReleaseUtil.getStandardPom( null ) );
     }
-    
-    public void testGetBaseWorkingDirectoryNoModules()
-        throws Exception
+
+    public void testGetCommonBasedirSingleProject()
     {
-        assertEquals( "/working/directory/flat-multi-module/project",
-                      ReleaseUtil.getBaseWorkingDirectory( "/working/directory/flat-multi-module/project", null ) );
-        
-        assertEquals( "/working/directory/flat-multi-module/project",
-                      ReleaseUtil.getBaseWorkingDirectory( "/working/directory/flat-multi-module/project", new ArrayList() ) );
+        assertEquals( "/working/directory/flat-multi-module/project", ReleaseUtil.getCommonBasedir(
+            Collections.singletonList( createProject( "/working/directory/flat-multi-module/project" ) ) ) );
     }
-    
-    public void testGetBaseWorkingDirOfFlatMultiModule()
+
+    public void testGetCommonBasedirOfFlatMultiModule()
         throws Exception
     {
-        List modules = new ArrayList();
-        modules.add( "../core" );
-        modules.add( "../webapp" );
+        assertEquals( "/working/directory/flat-multi-module", ReleaseUtil.getCommonBasedir( Arrays.asList(
+            new MavenProject[]{createProject( "/working/directory/flat-multi-module/root-project" ),
+                createProject( "/working/directory/flat-multi-module/core" ),
+                createProject( "/working/directory/flat-multi-module/webapp" )} ) ) );
+    }
 
-        assertEquals( "/working/directory/flat-multi-module",
-                      ReleaseUtil.getBaseWorkingDirectory( "/working/directory/flat-multi-module" + ReleaseUtil.FS +
-                          "root-project", modules ) );
-        assertEquals( "/working/directory/flat-multi-module",
-                      ReleaseUtil.getBaseWorkingDirectory( "/working/directory/flat-multi-module" + ReleaseUtil.FS +
-                          "root-project" + ReleaseUtil.FS, modules ) );
+    public void testGetCommonBasedirOfRegularMultiModule()
+        throws Exception
+    {
+        assertEquals( "/working/directory/flat-multi-module", ReleaseUtil.getCommonBasedir( Arrays.asList(
+            new MavenProject[]{createProject( "/working/directory/flat-multi-module" ),
+                createProject( "/working/directory/flat-multi-module/core" ),
+                createProject( "/working/directory/flat-multi-module/webapp" )} ) ) );
     }
 
-    public void testGetBaseWorkingDirectoryOfRegularMultiModule()
+    public void testGetCommonBasedirOfFlatMultiModuleWithMultipleLevels()
         throws Exception
     {
-        List modules = new ArrayList();
-        modules.add( "core" );
-        modules.add( "webapp" );
+        assertEquals( "/working/directory/flat-multi-module", ReleaseUtil.getCommonBasedir( Arrays.asList(
+            new MavenProject[]{createProject( "/working/directory/flat-multi-module/root-project" ),
+                createProject( "/working/directory/flat-multi-module/core" ),
+                createProject( "/working/directory/flat-multi-module/common/utils" ),
+                createProject( "/working/directory/flat-multi-module/common/xml" ),
+                createProject( "/working/directory/flat-multi-module/webapp" )} ) ) );
+    }
 
-        assertEquals( "/working/directory/flat-multi-module",
-                      ReleaseUtil.getBaseWorkingDirectory( "/working/directory/flat-multi-module", modules ) );
-        assertEquals( "/working/directory/flat-multi-module",
-                      ReleaseUtil.getBaseWorkingDirectory( "/working/directory/flat-multi-module" + ReleaseUtil.FS,
-                                                           modules ) );
+    public void testGetCommonBasedirOfFlatMultiModuleWithDescendingHierarchy()
+        throws Exception
+    {
+        assertEquals( "/working/directory/flat-multi-module", ReleaseUtil.getCommonBasedir( Arrays.asList(
+            new MavenProject[]{createProject( "/working/directory/flat-multi-module/level/1/2/3" ),
+                createProject( "/working/directory/flat-multi-module/level/1/2" ),
+                createProject( "/working/directory/flat-multi-module/level/1" ),
+                createProject( "/working/directory/flat-multi-module/level" ),
+                createProject( "/working/directory/flat-multi-module/other" )} ) ) );
     }
 
-    public void testGetBaseScmUrlNoModules()
+    public void testGetBaseScmUrlSingleLevel()
         throws Exception
     {
         assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk",
-                      ReleaseUtil.getBaseScmUrl( "scm:svn:http://svn.repo.com/flat-multi-module/trunk", null ) );
-        
-        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk",
-                      ReleaseUtil.getBaseScmUrl( "scm:svn:http://svn.repo.com/flat-multi-module/trunk", new ArrayList() ) );
+                      ReleaseUtil.realignScmUrl( 0, "scm:svn:http://svn.repo.com/flat-multi-module/trunk" ) );
+        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk/",
+                      ReleaseUtil.realignScmUrl( 0, "scm:svn:http://svn.repo.com/flat-multi-module/trunk/" ) );
     }
-    
-    public void testGetBaseScmUrlOfFlatMultiModule()
+
+    public void testGetBaseScmUrlReturnOriginal()
         throws Exception
     {
-        List modules = new ArrayList();
-        modules.add( "../core" );
-        modules.add( "../webapp" );
-
-        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk",
-                      ReleaseUtil.getBaseScmUrl( "scm:svn:http://svn.repo.com/flat-multi-module/trunk/root-project",
-                                                 modules ) );
-        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk",
-                      ReleaseUtil.getBaseScmUrl( "scm:svn:http://svn.repo.com/flat-multi-module/trunk/root-project/",
-                                                 modules ) );
+        assertEquals( "no-path-elements",
+                      ReleaseUtil.realignScmUrl( 1, "no-path-elements" ) );
+        assertEquals( "no-path-elements",
+                      ReleaseUtil.realignScmUrl( 15, "no-path-elements" ) );
     }
 
-    public void testGetBaseScmUrlOfRegularMultiModule()
+    public void testGetBaseScmUrlOfFlatMultiModule()
         throws Exception
     {
-        List modules = new ArrayList();
-        modules.add( "core" );
-        modules.add( "webapp" );
+        String actual =
+            ReleaseUtil.realignScmUrl( 1, "scm:svn:http://svn.repo.com/flat-multi-module/trunk/root-project" );
+        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk", actual );
 
-        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk",
-                      ReleaseUtil.getBaseScmUrl( "scm:svn:http://svn.repo.com/flat-multi-module/trunk", modules ) );
-        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk",
-                      ReleaseUtil.getBaseScmUrl( "scm:svn:http://svn.repo.com/flat-multi-module/trunk/", modules ) );
+        actual = ReleaseUtil.realignScmUrl( 1, "scm:svn:http://svn.repo.com/flat-multi-module/trunk/root-project/" );
+        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk/", actual );
     }
-    
-    public void testGetRootProjectPathFlatStructure()
+
+    public void testGetBaseScmUrlOfFlatMultiModuleMultipleLevels()
         throws Exception
-    {   
-        MavenProject project = new MavenProject()
-        {
-            public List getModules()
-            {
-                List modules = new ArrayList();
-                modules.add( "../core" );
-                modules.add( "../webapp" );
-                modules.add( "../commons" );
-                
-                return modules;
-            }
-            
-            public File getBasedir()
-            {
-                return new File( "/flat-multi-module/root-project" );
-            }
-            
-            public Scm getScm()
-            {
-                Scm scm = new Scm();
-                scm.setConnection( "scm:svn:file://localhost/target/svnroot/flat-multi-module/trunk/root-project" );
-                
-                return scm;
-            }
-        };
-        
-        assertEquals( "/root-project", ReleaseUtil.getRootProjectPath( project ) );
+    {
+        String actual =
+            ReleaseUtil.realignScmUrl( 3, "scm:svn:http://svn.repo.com/flat-multi-module/trunk/root-project/1/2" );
+        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk", actual );
+
+        actual = ReleaseUtil.realignScmUrl( 3, "scm:svn:http://svn.repo.com/flat-multi-module/trunk/root-project/1/2/" );
+        assertEquals( "scm:svn:http://svn.repo.com/flat-multi-module/trunk/", actual );
     }
-    
-    public void testGetRootProjectPathRegularMultiModuleStructure()
-        throws Exception
-    {   
-        MavenProject project = new MavenProject()
+
+    private static MavenProject createProject( final String basedir )
+    {
+        return new MavenProject()
         {
-            Scm scm = new Scm();
-            
-            public List getModules()
-            {
-                List modules = new ArrayList();
-                modules.add( "core" );
-                modules.add( "webapp" );
-                modules.add( "commons" );
-                
-                return modules;
-            }
-            
             public File getBasedir()
             {
-                return new File( "/regular-multi-module" );
-            }
-            
-            public Scm getScm()
-            {
-                scm.setConnection( "scm:svn:file://localhost/target/svnroot/regular-multi-module/trunk" );
-                
-                return scm;
+                return new File( basedir );
             }
         };
-        
-        assertNull( ReleaseUtil.getRootProjectPath( project ) );
-        
-        project.getScm().setConnection( "scm:svn:file://localhost/target/svnroot/regular-multi-module/trunk/" );        
-        assertNull( ReleaseUtil.getRootProjectPath( project ) );
     }
 }

Copied: maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/expected-pom.xml (from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/expected-pom.xml)
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/expected-pom.xml?p2=maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/expected-pom.xml&p1=maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/expected-pom.xml&r1=903017&r2=903243&rev=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/expected-pom.xml (original)
+++ maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/expected-pom.xml Tue Jan 26 14:43:06 2010
@@ -1,17 +1,20 @@
 <!--
-  ~ Copyright 2005-2006 The Apache Software Foundation.
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
   ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
+  ~   http://www.apache.org/licenses/LICENSE-2.0
   ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
   -->
 
 <project>
@@ -29,5 +32,6 @@
 
   <modules>
     <module>subproject1</module>
+    <module>sub/subproject2</module>
   </modules>
 </project>

Copied: maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/pom.xml (from r903017, maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/pom.xml)
URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/pom.xml?p2=maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/pom.xml&p1=maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/pom.xml&r1=903017&r2=903243&rev=903243&view=diff
==============================================================================
--- maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/pom-with-scm-of-parent-ending-with-a-slash/pom.xml (original)
+++ maven/release/trunk/maven-release-manager/src/test/resources/projects/rewrite-for-release/multimodule-with-deep-subprojects/pom.xml Tue Jan 26 14:43:06 2010
@@ -1,17 +1,20 @@
 <!--
-  ~ Copyright 2005-2006 The Apache Software Foundation.
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
   ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
+  ~   http://www.apache.org/licenses/LICENSE-2.0
   ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
   -->
 
 <project>
@@ -22,12 +25,13 @@
   <packaging>pom</packaging>
 
   <scm>
-    <connection>scm:svn:file://localhost/tmp/scm-repo/trunk/</connection>
-    <developerConnection>scm:svn:file://localhost/tmp/scm-repo/trunk/</developerConnection>
-    <url>file://localhost/tmp/scm-repo/trunk/</url>
+    <connection>scm:svn:file://localhost/tmp/scm-repo/trunk</connection>
+    <developerConnection>scm:svn:file://localhost/tmp/scm-repo/trunk</developerConnection>
+    <url>file://localhost/tmp/scm-repo/trunk</url>
   </scm>
 
   <modules>
     <module>subproject1</module>
+    <module>sub/subproject2</module>
   </modules>
 </project>