### Eclipse Workspace Patch 1.0 #P maven-release Index: maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java =================================================================== --- maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java (revision 1034759) +++ maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java (working copy) @@ -91,6 +91,14 @@ } /** + * Commits to do are atomic or by project. + * + * @parameter expression="${commitByProject}" default-value="false" + * @since 2.0-beta-5 + */ + private boolean commitByProject; + + /** * {@inheritDoc} */ public void execute() @@ -113,7 +121,8 @@ { releaseDescriptor.setScmSourceUrl( connectionUrl ); } - + + releaseDescriptor.setCommitByProject( commitByProject ); releaseDescriptor.setCheckoutDirectory( workingDirectory.getAbsolutePath() ); releaseDescriptor.setUseReleaseProfile( useReleaseProfile ); 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 1034759) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/ScmTagPhase.java (working copy) @@ -20,8 +20,10 @@ */ import java.io.File; +import java.util.Iterator; import java.util.List; +import org.apache.maven.project.MavenProject; import org.apache.maven.scm.ScmException; import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.ScmTagParameters; @@ -91,11 +93,10 @@ throw new ReleaseExecutionException( "Unable to configure SCM repository: " + e.getMessage(), e ); } - TagScmResult result; + TagScmResult result = new TagScmResult(null, null, null, true); try { // TODO: want includes/excludes? - ScmFileSet fileSet = new ScmFileSet( new File( basedirAlignedReleaseDescriptor.getWorkingDirectory() ) ); String tagName = releaseDescriptor.getScmReleaseLabel(); ScmTagParameters scmTagParameters = new ScmTagParameters( releaseDescriptor.getScmCommentPrefix() + " copy for tag " + tagName ); @@ -104,18 +105,28 @@ if ( getLogger().isDebugEnabled() ) { getLogger().debug( - "ScmTagPhase :: scmTagParameters remotingTag " + releaseDescriptor.isRemoteTagging() ); + "ScmTagPhase :: scmTagParameters remotingTag " + releaseDescriptor.isRemoteTagging() ); getLogger().debug( - "ScmTagPhase :: scmTagParameters scmRevision " + releaseDescriptor.getScmReleasedPomRevision() ); + "ScmTagPhase :: scmTagParameters scmRevision " + releaseDescriptor.getScmReleasedPomRevision() ); } - result = provider.tag( repository, fileSet, tagName, scmTagParameters ); + 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 { + 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.isSuccess() ) + if ( result == null || !result.isSuccess() ) { throw new ReleaseScmCommandException( "Unable to tag SCM", result ); } Index: maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java =================================================================== --- maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java (revision 1034759) +++ maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java (working copy) @@ -1,26 +1,20 @@ package org.apache.maven.shared.release.phase; /* - * 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. + * 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.io.IOException; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import org.apache.maven.project.MavenProject; @@ -47,139 +41,174 @@ /** * @author Emmanuel Venisse * @version $Id$ - * @plexus.component role="org.apache.maven.shared.release.phase.ReleasePhase" role-hint="checkout-project-from-scm" + * @plexus.component role="org.apache.maven.shared.release.phase.ReleasePhase" + * role-hint="checkout-project-from-scm" */ -public class CheckoutProjectFromScm - extends AbstractReleasePhase -{ +public class CheckoutProjectFromScm extends AbstractReleasePhase { /** * Tool that gets a configured SCM repository from release configuration. - * + * * @plexus.requirement */ private ScmRepositoryConfigurator scmRepositoryConfigurator; - public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, - List reactorProjects ) - throws ReleaseExecutionException, ReleaseFailureException - { + public ReleaseResult execute(ReleaseDescriptor releaseDescriptor, + ReleaseEnvironment releaseEnvironment, List reactorProjects) + throws ReleaseExecutionException, ReleaseFailureException { ReleaseResult result = new ReleaseResult(); - logInfo( result, "Checking out the project to perform the release ..." ); + logInfo(result, "Checking out the project to perform the release ..."); ScmRepository repository; ScmProvider provider; - if ( releaseDescriptor.isLocalCheckout() ) - { + if (releaseDescriptor.isLocalCheckout()) { // in the release phase we have to change the checkout URL // to do a local checkout instead of going over the network. - // the first step is a bit tricky, we need to know which provider! like e.g. "scm:jgit:http://" + // the first step is a bit tricky, we need to know which provider! like e.g. + // "scm:jgit:http://" // the offset of 4 is because 'scm:' has 4 characters... - String providerPart = releaseDescriptor.getScmSourceUrl().substring( 0, - releaseDescriptor.getScmSourceUrl().indexOf( - ':', 4 ) ); - releaseDescriptor.setScmSourceUrl( providerPart + ":file://" + releaseDescriptor.getWorkingDirectory() ); - getLogger().info( "Performing a LOCAL checkout from " + releaseDescriptor.getScmSourceUrl() ); + String providerPart = releaseDescriptor.getScmSourceUrl().substring(0, + releaseDescriptor.getScmSourceUrl().indexOf(':', 4)); + releaseDescriptor.setScmSourceUrl(providerPart + ":file://" + + releaseDescriptor.getWorkingDirectory()); + getLogger().info( + "Performing a LOCAL checkout from " + releaseDescriptor.getScmSourceUrl()); } - 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 ); - } - - MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects ); + MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects); // TODO: sanity check that it is not . or .. or lower File checkoutDirectory; - if ( StringUtils.isEmpty( releaseDescriptor.getCheckoutDirectory() ) ) - { - checkoutDirectory = new File( rootProject.getFile().getParentFile(), "target/checkout" ); - releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() ); + if (StringUtils.isEmpty(releaseDescriptor.getCheckoutDirectory())) { + checkoutDirectory = new File(rootProject.getFile().getParentFile(), "target/checkout"); + releaseDescriptor.setCheckoutDirectory(checkoutDirectory.getAbsolutePath()); + } else { + checkoutDirectory = new File(releaseDescriptor.getCheckoutDirectory()); } - else - { - checkoutDirectory = new File( releaseDescriptor.getCheckoutDirectory() ); - } - if ( checkoutDirectory.exists() ) - { - try - { - FileUtils.deleteDirectory( checkoutDirectory ); - } - catch ( IOException e ) - { - result.setResultCode( ReleaseResult.ERROR ); - logError( result, e.getMessage() ); + if (checkoutDirectory.exists()) { + try { + FileUtils.deleteDirectory(checkoutDirectory); + } catch (IOException e) { + result.setResultCode(ReleaseResult.ERROR); + logError(result, e.getMessage()); - throw new ReleaseExecutionException( "Unable to remove old checkout directory: " + e.getMessage(), e ); + throw new ReleaseExecutionException("Unable to remove old checkout directory: " + + e.getMessage(), e); } } checkoutDirectory.mkdirs(); - CheckOutScmResult scmResult; + CheckOutScmResult scmResult = new CheckOutScmResult(null, null, null, true); - try - { - scmResult = provider.checkOut( repository, new ScmFileSet( checkoutDirectory ), - new ScmTag( releaseDescriptor.getScmReleaseLabel() ) ); - } - catch ( ScmException e ) - { - result.setResultCode( ReleaseResult.ERROR ); - logError( result, e.getMessage() ); + 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()); - throw new ReleaseExecutionException( "An error is occurred in the checkout process: " + e.getMessage(), e ); + 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 { + 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 ); + 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 ); + if (rootProjectBasedir.length() > basedir.length()) { + scmRelativePathProjectDirectory = rootProjectBasedir + .substring(basedir.length() + 1); } } - releaseDescriptor.setScmRelativePathProjectDirectory( scmRelativePathProjectDirectory ); + releaseDescriptor.setScmRelativePathProjectDirectory(scmRelativePathProjectDirectory); - if ( !scmResult.isSuccess() ) - { - result.setResultCode( ReleaseResult.ERROR ); - logError( result, scmResult.getProviderMessage() ); + if (!scmResult.isSuccess()) { + result.setResultCode(ReleaseResult.ERROR); + logError(result, scmResult.getProviderMessage()); - throw new ReleaseScmCommandException( "Unable to checkout from SCM", scmResult ); + throw new ReleaseScmCommandException("Unable to checkout from SCM", scmResult); } - result.setResultCode( ReleaseResult.SUCCESS ); + result.setResultCode(ReleaseResult.SUCCESS); return result; } - public ReleaseResult simulate( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, - List reactorProjects ) - throws ReleaseExecutionException, ReleaseFailureException - { - return simulate( releaseDescriptor, releaseEnvironment, reactorProjects ); + public ReleaseResult simulate(ReleaseDescriptor releaseDescriptor, + ReleaseEnvironment releaseEnvironment, List reactorProjects) + throws ReleaseExecutionException, ReleaseFailureException { + return simulate(releaseDescriptor, releaseEnvironment, reactorProjects); } }