Index: maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java =================================================================== --- maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java (revision 728739) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java (working copy) @@ -34,6 +34,7 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException; 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 java.io.File; import java.util.List; @@ -84,7 +85,7 @@ try { // TODO: want includes/excludes? - ScmFileSet fileSet = new ScmFileSet( new File( releaseDescriptor.getWorkingDirectory() ) ); + ScmFileSet fileSet = new ScmFileSet( ReleaseUtil.getSvnBaseDir( reactorProjects ) ); String tagName = releaseDescriptor.getScmReleaseLabel(); result = provider.tag( repository, fileSet, tagName, releaseDescriptor.getScmCommentPrefix() + " copy for tag " + tagName ); @@ -111,7 +112,7 @@ validateConfiguration( releaseDescriptor ); - logInfo( result, "Full run would be tagging " + releaseDescriptor.getWorkingDirectory() + " with label: '" + + logInfo( result, "Full run would be tagging " + ReleaseUtil.getSvnBaseDir( reactorProjects ) + " with label: '" + releaseDescriptor.getScmReleaseLabel() + "'" ); result.setResultCode( ReleaseResult.SUCCESS ); Index: maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java =================================================================== --- maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java (revision 728739) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/RunPerformGoalsPhase.java (working copy) @@ -23,6 +23,7 @@ import org.apache.maven.shared.release.ReleaseResult; import org.apache.maven.shared.release.config.ReleaseDescriptor; import org.apache.maven.shared.release.env.ReleaseEnvironment; +import org.apache.maven.shared.release.util.ReleaseUtil; import org.codehaus.plexus.util.StringUtils; import java.io.File; @@ -64,7 +65,7 @@ additionalArguments = "-f pom.xml"; } - return execute( releaseDescriptor, releaseEnvironment, new File( releaseDescriptor.getCheckoutDirectory() ), additionalArguments ); + return execute( releaseDescriptor, releaseEnvironment, new File( releaseDescriptor.getCheckoutDirectory(), ReleaseUtil.getSvnRelativePath( reactorProjects ) ), additionalArguments ); } public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects ) Index: maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java =================================================================== --- maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java (revision 728739) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java (working copy) @@ -35,6 +35,7 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException; 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 java.io.File; import java.util.Arrays; @@ -96,7 +97,7 @@ try { result = - provider.status( repository, new ScmFileSet( new File( releaseDescriptor.getWorkingDirectory() ) ) ); + provider.status( repository, new ScmFileSet( ReleaseUtil.getSvnBaseDir( reactorProjects ) ) ); } catch ( ScmException e ) { Index: maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java =================================================================== --- maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java (revision 728739) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmCommitPhase.java (working copy) @@ -104,7 +104,7 @@ else { List pomFiles = createPomFiles( releaseDescriptor, reactorProjects ); - ScmFileSet fileSet = new ScmFileSet( new File( releaseDescriptor.getWorkingDirectory() ), pomFiles ); + ScmFileSet fileSet = new ScmFileSet( ReleaseUtil.getSvnBaseDir( reactorProjects ), pomFiles ); checkin( provider, repository, fileSet, createMessage( releaseDescriptor ) ); } Index: maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmBranchPhase.java =================================================================== --- maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmBranchPhase.java (revision 728739) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmBranchPhase.java (working copy) @@ -34,6 +34,7 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException; 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 java.io.File; import java.util.List; @@ -83,7 +84,8 @@ BranchScmResult result; try { - ScmFileSet fileSet = new ScmFileSet( new File( releaseDescriptor.getWorkingDirectory() ) ); + + ScmFileSet fileSet = new ScmFileSet(ReleaseUtil.getSvnBaseDir( reactorProjects )); String branchName = releaseDescriptor.getScmReleaseLabel(); result = provider.branch( repository, fileSet, branchName, releaseDescriptor.getScmCommentPrefix() + " copy for branch " + branchName ); Index: maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java =================================================================== --- maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java (revision 728739) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java (working copy) @@ -22,10 +22,13 @@ import java.io.File; import java.io.IOException; import java.io.Reader; +import java.net.URI; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.maven.project.MavenProject; +import org.apache.maven.scm.ScmFileSet; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.ReaderFactory; @@ -50,6 +53,9 @@ public static MavenProject getRootProject( List reactorProjects ) { + if ( reactorProjects == null || reactorProjects.size() == 0 ) + return null; + MavenProject project = (MavenProject) reactorProjects.get( 0 ); for ( Iterator i = reactorProjects.iterator(); i.hasNext(); ) { @@ -139,4 +145,118 @@ return norm; } + + + /** + * Finds is the longest path that is parent of all basedirs. + * Using a hierarchical layout this is the basedir of the root-project. + * For a layout like this, it is "parent": + *
+ * foo/ + * parent/ + * module1/ + * module2/ + *+ * For a flat layouts like this, it is "foo": + *
+ * foo/ + * parent + * module1 + * module2 + *+ * + * @param reactorProjects + * List of all projects of the release. + * @return + * A File Object with the longest path that is parent of all basedirs of the reactorProjects. + */ + public static File getSvnBaseDir( List reactorProjects ) + { + if ( reactorProjects == null || reactorProjects.size() == 0 ) + return null; + + // Extract all project basedirs + List files = new ArrayList(); + if ( reactorProjects != null ) + { + for ( Iterator it = reactorProjects.iterator(); it.hasNext(); ) + { + MavenProject project = (MavenProject) it.next(); + files.add( project.getBasedir() ); + } + } + + // Get common parent basedir + return getCommonParent( files ); + + } + + /** + * The relative path from the the common svn basedir to the root projects basedir. + * For a hierarchical layout it is an empty String because the basedir of the root project + * equals the common svn basedir. + * For a layout like this, with common svnBasdir="foo" it would return "parent": + *
+ * foo/ + * parent + * module1 + * module2 + *+ * @param reactorProjects + * List of all projects of the release. + * @return + * The relative path from the the common svn basedir to the root projects basedir. + */ + public static String getSvnRelativePath( List reactorProjects){ + if(reactorProjects == null || reactorProjects.size() == 0) + return ""; + URI svnBaseDir = getSvnBaseDir( reactorProjects ).toURI(); + URI rootBaseDir = getRootProject( reactorProjects ).getBasedir().toURI(); + return svnBaseDir.relativize( rootBaseDir ).getPath(); + } + + /** + * Select the longest path that contains all {@link File} elements of the given list. If one of the files containing + * every other file of the list, this file is returned. + * + * @param files A list of {@link File} elements. + * @return The file with longest path that contains all given files. + */ + private static File getCommonParent( List files ) + { + + if ( files == null || files.size() == 0 ) + return null; + + for ( File current = (File) files.get( 0 ); current != null; current = current.getParentFile() ) + { + if ( isCommonParent( current, files ) ) + return current; + } + throw new IllegalStateException( "Could not find common parent dir for all projects:" + files ); + + } + + private static boolean isCommonParent( File parent, List dirs ) + { + + for ( Iterator it = dirs.iterator(); it.hasNext(); ) + { + File dir = (File) it.next(); + if ( !isParent( parent, dir ) ) + return false; + + } + return true; + + } + + private static boolean isParent( File parent, File dir ) + { + for ( File current = dir; current != null; current = current.getParentFile() ) + if ( current.equals( parent ) ) + return true; + return false; + } + }