Ok, this is the patch, as attachments don't work...
Index:
maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
===================================================================
---
maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
(revision 778269)
+++
maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRunGoalsPhase.java
(working copy)
@@ -78,8 +78,20 @@
throw new ReleaseExecutionException( "Cannot find Maven
executor with id: " + releaseEnvironment.getMavenExecutorId() );
}
- mavenExecutor.executeGoals( determineWorkingDirectory(
workingDirectory,
-
releaseDescriptor.getScmRelativePathProjectDirectory(),
releaseDescriptor.getRootProjectPath() ),
+ // We have the problem that the determined working directory
sometimes does not exist!
+ File newWorkingDirectory = determineWorkingDirectory(
workingDirectory,
+
releaseDescriptor.getScmRelativePathProjectDirectory(),
releaseDescriptor.getRootProjectPath() );
+
+ if (!newWorkingDirectory.exists())
+ {
+ try {
+ newWorkingDirectory.mkdirs();
+ } catch (Exception e) {
+ // we ignore the exception, just as maven does it now.
+ }
+ }
+
+ mavenExecutor.executeGoals( newWorkingDirectory,
goals, releaseEnvironment,
releaseDescriptor.isInteractive(),
additionalArguments, result );
}
@@ -136,7 +148,25 @@
if( StringUtils.isNotEmpty( rootProjectPath ) )
{
- workingDirectory = new File( workingDirectory, rootProjectPath );
+ // Is the beginning of the rootProjectPath the end of the
workingDirectory?
+ String tmpWorkingDirectoryPath =
workingDirectory.getAbsolutePath();
+ String tmpRootProjectPath = rootProjectPath;
+ // First of all we have to make the directory delimiters equal
+ tmpWorkingDirectoryPath =
tmpWorkingDirectoryPath.replaceAll("\\\\", "/");
+ tmpRootProjectPath = tmpRootProjectPath.replaceAll("\\\\", "/");
+
+ // Is there a standard solution for this problem?
+ int matchAt = 1; // We have to start at 1 or we have an instant
match :-)
+ boolean found = false;
+ while(tmpWorkingDirectoryPath.length() > matchAt &&
tmpRootProjectPath.length() > matchAt && !found)
+ {
+ found =
tmpWorkingDirectoryPath.regionMatches(tmpWorkingDirectoryPath.length() -
matchAt , tmpRootProjectPath, 0, matchAt);
+ if (!found)
+ {
+ matchAt++;
+ }
+ }
+ workingDirectory = new File( workingDirectory,
rootProjectPath.substring(matchAt) );
}
return workingDirectory;
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 778269)
+++
maven-release-manager/src/main/java/org/apache/maven/shared/release/util/ReleaseUtil.java
(working copy)
@@ -194,23 +194,55 @@
* @param path2 The second path
* @return The common path of the two paths.
*/
- public static String getCommonPath( String path1, String path2 )
+ public static String getCommonPath( String path1, String path2)
{
+ return ReleaseUtil.getCommonPath(path1, path2, null, false);
+ }
+
+ /**
+ * Returns the common path of the two paths specified.
+ * The paths are split by the separator.
+ * Only whole segments are added to the resulting path.
+ *
+ * @param path1 The first path
+ * @param path2 The second path
+ * @param separator The separator. Can be null. In this case each letter
is handled as a segment.
+ * @param reverse Affects the position of the separator in case if a
segment comparison
+ * @return The common path of the two paths.
+ */
+ public static String getCommonPath( String path1, String path2, String
separator, boolean reverse)
+ {
if ( path2 == null || path2.equals( "" ) )
{
return path1;
}
else
{
- int indexDiff = StringUtils.indexOfDifference( path1, path2 );
- if( indexDiff > 0 )
+ if (separator == null)
{
- return path1.substring( 0, indexDiff );
+ // With no separator specified we compare the whole strings
+ int indexDiff = StringUtils.indexOfDifference( path1, path2 );
+ if( indexDiff > 0 )
+ {
+ return path1.substring( 0, indexDiff );
+ }
+ else
+ {
+ return path1;
+ }
+ } else {
+ // We split the paths and just take the segments that are
equal up to the first difference
+ String[] splittedPath1 = path1.split(separator);
+ String[] splittedPath2 = path2.split(separator);
+ StringBuffer commonPathSB = new StringBuffer();
+ int indexSP = 0;
+ while(indexSP < splittedPath1.length && indexSP <
splittedPath2.length && splittedPath1[indexSP].equals(splittedPath2[indexSP]))
+ {
+ commonPathSB.append(reverse ? "" : separator)
.append(splittedPath1[indexSP]).append(reverse ? separator : "");
+ indexSP++;
+ }
+ return commonPathSB.toString();
}
- else
- {
- return path1;
- }
}
}
@@ -262,9 +294,13 @@
String scmConnection = project.getScm().getConnection();
scmConnection = StringUtils.replace( scmConnection, "\\", "/" );
+ // We have to take care of the SCM delimiters : and |
+ String[] splitScmConnection = scmConnection.split("[:\\|]");
+ String tmpScmConnection =
splitScmConnection[splitScmConnection.length - 1];
+
projectPath =
ReleaseUtil.getCommonPath( StringUtils.reverse(
StringUtils.chomp( projectBaseDir, "/" ) ),
- StringUtils.reverse(
StringUtils.chomp( scmConnection, "/" ) ) );
+ StringUtils.reverse(
StringUtils.chomp( tmpScmConnection, "/" ) ), "/", true);
}
relPath = StringUtils.reverse( projectPath );
Index:
maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java
===================================================================
---
maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java
(revision 778269)
+++
maven-release-manager/src/test/java/org/apache/maven/shared/release/util/ReleaseUtilTest.java
(working copy)
@@ -138,6 +138,70 @@
assertEquals( "/root-project", ReleaseUtil.getRootProjectPath( project
) );
}
+ public void testGetRootProjectPathFlatStructureWithSegments()
+ 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( "/dev/root-project" );
+ }
+
+ public Scm getScm()
+ {
+ Scm scm = new Scm();
+ scm.setConnection(
"scm:cvs:pserver:usern...@host:port:repository:anythingdev/root-project" );
+
+ return scm;
+ }
+ };
+
+ assertEquals( "/root-project", ReleaseUtil.getRootProjectPath( project
) );
+ }
+
+ public void
testGetRootProjectPathFlatStructureWithSegmentsAndSCMDelimiters()
+ 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( "/dev/root-project" );
+ }
+
+ public Scm getScm()
+ {
+ Scm scm = new Scm();
+ scm.setConnection(
"scm:cvs:pserver:usern...@host:port:repository:dev/root-project" );
+
+ return scm;
+ }
+ };
+
+ assertEquals( "/dev/root-project", ReleaseUtil.getRootProjectPath(
project ) );
+ }
+
public void testGetRootProjectPathRegularMultiModuleStructure()
throws Exception
{
Index:
maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
===================================================================
---
maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
(revision 778269)
+++
maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
(working copy)
@@ -40,6 +40,13 @@
{
/**
+ * Commits to do are atomic or by project.
+ *
+ * @parameter expression="${commitByProject}" default-value="false"
+ */
+ private boolean commitByProject;
+
+ /**
* {...@inheritdoc}
*/
public void execute()
@@ -48,6 +55,8 @@
super.execute();
ReleaseDescriptor config = createReleaseDescriptor();
+ // If a preparation can be committed by project, also a rollback
should be committed by project
+ config.setCommitByProject( commitByProject );
try
{