[
http://jira.codehaus.org/browse/MRELEASE-516?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mathias Arens updated MRELEASE-516:
-----------------------------------
Attachment: MRELEASE-516-flat-project-structure-support.txt
Hello,
I have a project with a flat structure as described in the first comment. I was
a little disappointed that flat structures are not supported.
I tried to fix the problem and in my environment Maven 2.2.1 / Release Plugin
2.2-SNAPSHOT / CVS it works. I attached a patch file. Unfortunately my eclipse
formatter formatted the source files so it is difficult to see where the code
changes are.
Here is a short description of what I had to change:
{code:title=ScmTagPhase.java(SVN-Version 922071)|borderStyle=solid}
[...]
TagScmResult result = new TagScmResult(null, null, null, true); //
modified
try
{
// TODO: want includes/excludes?
String tagName = releaseDescriptor.getScmReleaseLabel();
ScmTagParameters scmTagParameters =
new ScmTagParameters( releaseDescriptor.getScmCommentPrefix() +
" copy for tag " + tagName );
scmTagParameters.setRemoteTagging(
releaseDescriptor.isRemoteTagging() );
scmTagParameters.setScmRevision(
releaseDescriptor.getScmReleasedPomRevision() );
if ( getLogger().isDebugEnabled() )
{
getLogger().debug(
"ScmTagPhase :: scmTagParameters remotingTag " +
releaseDescriptor.isRemoteTagging() );
getLogger().debug(
"ScmTagPhase :: scmTagParameters scmRevision " +
releaseDescriptor.getScmReleasedPomRevision() );
}
// new code
if (releaseDescriptor.isCommitByProject()) {
Iterator reactorProjectsIter = reactorProjects.iterator();
while (reactorProjectsIter.hasNext() && result.isSuccess()) {
MavenProject mavenProject = (MavenProject)
reactorProjectsIter.next();
ScmFileSet fileSet = new ScmFileSet(
mavenProject.getBasedir() );
result = provider.tag( repository, fileSet, tagName,
scmTagParameters );
}
} else {
// end - new code
ScmFileSet fileSet = new ScmFileSet( new File(
basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
result = provider.tag( repository, fileSet, tagName,
scmTagParameters );
}
}
catch ( ScmException e )
{
throw new ReleaseExecutionException( "An error is occurred in the
tag process: " + e.getMessage(), e );
}
if ( result == null || !result.isSuccess() )
{
throw new ReleaseScmCommandException( "Unable to tag SCM", result );
}
[...]
{code}
Basically I iterate over the maven projects and tag each maven project instead
of the root project only if the commitByProject flag is set to true.
With this change the release:prepare phase already worked. I could run the
prepare goal with this statement (I included some personal profiles):
{code}
mvn org.apache.maven.plugins:maven-release-plugin:2.2-SNAPSHOT:prepare
-DautoVersionSubmodules=true -Darguments="-P NOTESTS,PRODUCTION"
-DcommitByProject=true -Dusername=xxxx -Dpassword=xxxx
{code}
To make the release:perform goal work I had to update the
{code:title=CheckoutProjectFromScm.java(SVN-Version 903713)|borderStyle=solid}
[...]
checkoutDirectory.mkdirs();
CheckOutScmResult scmResult = new CheckOutScmResult(null, null, null,
true); // modified
// new code
if (releaseDescriptor.isCommitByProject()) {
// flat project structure
String rootProjectBaseDir =
ReleaseUtil.getCommonBasedir(reactorProjects);
Iterator reactorProjectsIter = reactorProjects.iterator();
while (reactorProjectsIter.hasNext() && scmResult.isSuccess()) {
MavenProject mavenProject = (MavenProject)
reactorProjectsIter.next();
File mavenCheckoutProjectDirectory;
String mavenProjectBaseDir =
mavenProject.getBasedir().getAbsolutePath();
if (mavenProjectBaseDir.length() > rootProjectBaseDir.length())
{
String relativeProjectDir =
mavenProjectBaseDir.substring(rootProjectBaseDir
.length() + 1);
mavenCheckoutProjectDirectory = new File(checkoutDirectory,
relativeProjectDir);
} else {
mavenCheckoutProjectDirectory = checkoutDirectory;
}
try {
repository =
scmRepositoryConfigurator.getConfiguredRepository(mavenProject.getScm().getConnection(),
releaseDescriptor,
releaseEnvironment.getSettings());
provider =
scmRepositoryConfigurator.getRepositoryProvider(repository);
} catch (ScmRepositoryException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseScmRepositoryException(e.getMessage(),
e.getValidationMessages());
} catch (NoSuchScmProviderException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseExecutionException("Unable to configure
SCM repository: "
+ e.getMessage(), e);
}
try {
scmResult = provider.checkOut(repository, new ScmFileSet(
mavenCheckoutProjectDirectory), new
ScmTag(releaseDescriptor
.getScmReleaseLabel()));
} catch (ScmException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseExecutionException(
"An error is occurred in the checkout process: " +
e.getMessage(), e);
}
}
} else {
// end - new code
try {
repository =
scmRepositoryConfigurator.getConfiguredRepository(releaseDescriptor,
releaseEnvironment.getSettings());
provider =
scmRepositoryConfigurator.getRepositoryProvider(repository);
} catch (ScmRepositoryException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseScmRepositoryException(e.getMessage(),
e.getValidationMessages());
} catch (NoSuchScmProviderException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseExecutionException("Unable to configure SCM
repository: "
+ e.getMessage(), e);
}
// standard project structure
try {
scmResult = provider.checkOut(repository, new
ScmFileSet(checkoutDirectory),
new ScmTag(releaseDescriptor.getScmReleaseLabel()));
} catch (ScmException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseExecutionException(
"An error is occurred in the checkout process: " +
e.getMessage(), e);
}
}
String scmRelativePathProjectDirectory =
scmResult.getRelativePathProjectDirectory();
if (StringUtils.isEmpty(scmRelativePathProjectDirectory)) {
String basedir = ReleaseUtil.getCommonBasedir(reactorProjects);
String rootProjectBasedir =
rootProject.getBasedir().getAbsolutePath();
if (rootProjectBasedir.length() > basedir.length()) {
scmRelativePathProjectDirectory = rootProjectBasedir
.substring(basedir.length() + 1);
}
}
{code}
Here again I had to iterate over the maven projects to check them out to the
target/checkout directory. There might be a smarter implementation though
because I have a little code duplication in the if/else statement.
Basically with these two changes I could support the flat project structure.
The third but last minor modification was in the PerformReleaseMojo. I had to
copy the commitByProject attribute from the PrepareReleaseMojo to the
PerformReleaseMojo but these changes are all contained in the patch file.
With this command line command I could perform a release:
{code}
mvn org.apache.maven.plugins:maven-release-plugin:2.2-SNAPSHOT:perform
-DreleaseProfiles="NOTESTS,PRODUCTION" -DcommitByProject=true -Dgoals="clean
install"
{code}
It would be great if somebody with an svn flat project structure could test the
code.
> release:prepare should support a nested/flat hybrid SCM structure
> -----------------------------------------------------------------
>
> Key: MRELEASE-516
> URL: http://jira.codehaus.org/browse/MRELEASE-516
> Project: Maven 2.x Release Plugin
> Issue Type: Improvement
> Components: perform, prepare
> Affects Versions: 2.0-beta-9
> Environment: OS X 10.5.8, Windows XP Prof, JDK 1.5.0_12, SVN, GIT, CVS
> Reporter: Eric Miles
> Attachments: maven-release-issue.zip,
> MRELEASE-516-flat-project-structure-support.txt, odd-tags.png
>
>
> This issue is related to MRELEASE-261 in that release prepare is having some
> difficulty in dealing with certain SCM structures during the prepare goal.
> Our project structure is flat as you would see in a typical IDE setup:
> {noformat}
> release-workspace\
> |
> |--release-parent
> | |+pom.xml (modules: ../release-module1, ../release-module2)
> |
> |--release-module1
> | |+pom.xml (parent: ../release-parent)
> |
> |--release-module2
> |+pom.xml (parent: ../release-parent)
> {noformat}
> Our SCM (svn) structure is as follows:
> {noformat}
> svnroot
> |
> +--release-parent/trunk/pom.xml
> +--release-parent/tags/release-parent-1.0.9/pom.xml
> |
> +--release-module1/trunk/pom.xml
> +--release-module1/tags/release-module1-1.0.9/pom.xml
> |
> +--release-module1/trunk/pom.xml
> +--release-module2/tags/release-module2-1.0.9/pom.xml
> {noformat}
> If we execute release:prepare with no configuration to the release plugin, we
> get the following error:
> {noformat}
> [INFO] [INFO]
> ------------------------------------------------------------------------
> [INFO] Checking in modified POMs...
> [INFO] Executing: /bin/sh -c cd
> /Users/emiles/Projects/release-workspace/release-parent && svn
> --non-interactive commit --file
> /var/folders/fH/fHNZYBGdFd0bMMIPiloA2U+++TI/-Tmp-/maven-scm-1253932520.commit
> --targets
> /var/folders/fH/fHNZYBGdFd0bMMIPiloA2U+++TI/-Tmp-/maven-scm-4376558781490229966-targets
> [INFO] Working directory:
> /Users/emiles/Projects/release-workspace/release-parent
> [INFO]
> ------------------------------------------------------------------------
> [ERROR] BUILD FAILURE
> [INFO]
> ------------------------------------------------------------------------
> [INFO] Unable to commit files
> Provider message:
> The svn command failed.
> Command output:
> svn: '/Users/emiles/Projects/release-workspace' is not a working copy
> {noformat}
> If we use the 2.0-beta-10-SNAPSHOT with flat project support and provide the
> -DcommitByProject=true JVM parameter, we do not get any errors, however
> tagging does not happen as expected. Rather than having tags for each of the
> projects, some odd tagging happened at the parent level where an entire
> structure was created (with branches, tags and trunk under the tag folder).
> I'm attaching a screen shot for reference.
> Ignoring the fact that the prepare only somewhat worked, when I attempted to
> perform the release, I get an error:
> {noformat}
> emiles-macbook:release-parent emiles$ mvn release:perform
> -DcommitByProject=true
> [INFO] Scanning for projects...
> [INFO] Reactor build order:
> [INFO] Unnamed - com.captechventures:release-parent:pom:0.0.3-SNAPSHOT
> [INFO] Unnamed - com.captechventures:release-module1:jar:0.0.3-SNAPSHOT
> [INFO] Unnamed - com.captechventures:release-module2:jar:0.0.3-SNAPSHOT
> [INFO]
> ------------------------------------------------------------------------
> [INFO] Building Unnamed -
> com.captechventures:release-parent:pom:0.0.3-SNAPSHOT
> [INFO] task-segment: [release:perform] (aggregator-style)
> [INFO]
> ------------------------------------------------------------------------
> [INFO] [release:perform {execution: default-cli}]
> [INFO] Checking out the project to perform the release ...
> [INFO] Executing: /bin/sh -c cd
> /Users/emiles/Projects/release-workspace/release-parent/target && svn
> --non-interactive checkout
> http://localhost/dev/release-parent/tags/release-parent-0.0.2
> /Users/emiles/Projects/release-workspace/release-parent/target/checkout
> [INFO] Working directory:
> /Users/emiles/Projects/release-workspace/release-parent/target
> [INFO] Executing goals 'deploy'...
> [WARNING] Base directory is a file. Using base directory as POM location.
> [WARNING] Maven will be executed in interactive mode, but no input stream has
> been configured for this MavenInvoker instance.
> [INFO]
> ------------------------------------------------------------------------
> [ERROR] BUILD ERROR
> [INFO]
> ------------------------------------------------------------------------
> [INFO] Error executing Maven.
> Working directory
> "/Users/emiles/Projects/release-workspace/release-parent/target/checkout/Users/emiles/Projects/release-workspace/release-parent"
> does not exist!
> [INFO]
> ------------------------------------------------------------------------
> [INFO] For more information, run Maven with the -e switch
> [INFO]
> ------------------------------------------------------------------------
> [INFO] Total time: 5 seconds
> [INFO] Finished at: Mon Jan 04 12:22:31 EST 2010
> [INFO] Final Memory: 11M/20M
> [INFO]
> ------------------------------------------------------------------------
> {noformat}
> Although this isn't the flat model as identifed in MRELEASE-261, I feel this
> flat structure should be supported as all the relevant SCM metadata is
> included in each POM so the plugin should have no difficulty determining
> where to check stuff into SCM.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira