You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm-commits@maven.apache.org by ol...@apache.org on 2010/11/13 12:56:30 UTC
svn commit: r1034733 - in
/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg:
./ command/ command/checkin/ command/inventory/ command/tag/
Author: olamy
Date: Sat Nov 13 11:56:29 2010
New Revision: 1034733
URL: http://svn.apache.org/viewvc?rev=1034733&view=rev
Log:
[SCM-583] mvn release:prepare fails when there is a different branch in hg outgoing changes
SUbmitted by Laurent Perez
Added:
maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgChangeSet.java (with props)
maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgOutgoingConsumer.java (with props)
Modified:
maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgUtils.java
maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommandConstants.java
maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkin/HgCheckInCommand.java
maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java
Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgUtils.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgUtils.java?rev=1034733&r1=1034732&r2=1034733&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgUtils.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgUtils.java Sat Nov 13 11:56:29 2010
@@ -27,6 +27,8 @@ import org.apache.maven.scm.log.DefaultL
import org.apache.maven.scm.log.ScmLogger;
import org.apache.maven.scm.provider.hg.command.HgCommandConstants;
import org.apache.maven.scm.provider.hg.command.HgConsumer;
+import org.apache.maven.scm.provider.hg.command.inventory.HgChangeSet;
+import org.apache.maven.scm.provider.hg.command.inventory.HgOutgoingConsumer;
import org.codehaus.plexus.util.cli.CommandLineException;
import org.codehaus.plexus.util.cli.CommandLineUtils;
import org.codehaus.plexus.util.cli.Commandline;
@@ -98,9 +100,9 @@ public class HgUtils
{
HgConfig config = new HgConfig( workingDir );
providerMsg =
- "\nEXECUTION FAILED" + "\n Execution of cmd : " + cmdAndArgs[0] + " failed with exit code: "
- + exitCode + "." + "\n Working directory was: " + "\n " + workingDir.getAbsolutePath()
- + config.toString( workingDir ) + "\n";
+ "\nEXECUTION FAILED" + "\n Execution of cmd : " + cmdAndArgs[0] + " failed with exit code: " +
+ exitCode + "." + "\n Working directory was: " + "\n " + workingDir.getAbsolutePath() +
+ config.toString( workingDir ) + "\n";
if ( logger.isErrorEnabled() )
{
logger.error( providerMsg );
@@ -112,8 +114,8 @@ public class HgUtils
catch ( ScmException se )
{
String msg =
- "EXECUTION FAILED" + "\n Execution failed before invoking the Hg command. Last exception:"
- + "\n " + se.getMessage();
+ "EXECUTION FAILED" + "\n Execution failed before invoking the Hg command. Last exception:" + "\n " +
+ se.getMessage();
//Add nested cause if any
if ( se.getCause() != null )
@@ -197,13 +199,22 @@ public class HgUtils
throws ScmException
{
- String[] revCmd = new String[]{HgCommandConstants.REVNO_CMD};
+ String[] revCmd = new String[]{ HgCommandConstants.REVNO_CMD };
HgRevNoConsumer consumer = new HgRevNoConsumer( logger );
HgUtils.execute( consumer, logger, workingDir, revCmd );
return consumer.getCurrentRevisionNumber();
}
+ public static String getCurrentBranchName( ScmLogger logger, File workingDir )
+ throws ScmException
+ {
+ String[] branchnameCmd = new String[]{ HgCommandConstants.BRANCH_NAME_CMD };
+ HgBranchnameConsumer consumer = new HgBranchnameConsumer( logger );
+ HgUtils.execute( consumer, logger, workingDir, branchnameCmd );
+ return consumer.getBranchName();
+ }
+
/**
* Get current (working) revision.
* <p/>
@@ -237,4 +248,67 @@ public class HgUtils
return revNo;
}
}
+
+ /**
+ * Get current (working) branch name
+ */
+ private static class HgBranchnameConsumer
+ extends HgConsumer
+ {
+
+ private String branchName;
+
+ HgBranchnameConsumer( ScmLogger logger )
+ {
+ super( logger );
+ }
+
+ public void doConsume( ScmFileStatus status, String trimmedLine )
+ {
+ branchName = String.valueOf( trimmedLine );
+ }
+
+ String getBranchName()
+ {
+ return branchName;
+ }
+ }
+
+
+ /**
+ * Check if there are outgoing changes on a different branch. If so, Mercurial default behaviour
+ * is to block the push and warn using a 'push creates new remote branch !' message.
+ * We also warn, and return true if a different outgoing branch was found
+ * <p/>
+ * Method users should not stop the push on a negative return, instead, they should hg push -r(branch being released)
+ *
+ * @param logger the logger
+ * @param workingDir the working dir
+ * @param workingbranchName the working branch name
+ * @return true if a different outgoing branch was found
+ * @throws ScmException on outgoing command error
+ */
+ public static boolean differentOutgoingBranchFound( ScmLogger logger, File workingDir, String workingbranchName )
+ throws ScmException
+ {
+ String[] outCmd = new String[]{ HgCommandConstants.OUTGOING_CMD };
+ HgOutgoingConsumer outConsumer = new HgOutgoingConsumer( logger );
+ ScmResult outResult = HgUtils.execute( outConsumer, logger, workingDir, outCmd );
+ List changes = outConsumer.getChanges();
+ if ( outResult.isSuccess() )
+ {
+ for ( int i = 0; i < changes.size(); i++ )
+ {
+ HgChangeSet set = (HgChangeSet) changes.get( i );
+ if ( set.getBranch() != null )
+ {
+ logger.warn( "A different branch than " + workingbranchName +
+ " was found in outgoing changes, branch name was " + set.getBranch() +
+ ". Only local branch named " + workingbranchName + " will be pushed." );
+ return true;
+ }
+ }
+ }
+ return false;
+ }
}
Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommandConstants.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommandConstants.java?rev=1034733&r1=1034732&r2=1034733&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommandConstants.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommandConstants.java Sat Nov 13 11:56:29 2010
@@ -65,7 +65,7 @@ public class HgCommandConstants
* Commit changes into a new revision
*/
public static final String COMMIT_CMD = "commit";
-
+
/**
* update working-copy to tip
*/
@@ -107,6 +107,16 @@ public class HgCommandConstants
public static final String INVENTORY_CMD = "locate";
/**
+ * Outgoing changes command
+ */
+ public static final String OUTGOING_CMD = "outgoing";
+
+ /**
+ * Named branch command
+ */
+ public static final String BRANCH_NAME_CMD = "branch";
+
+ /**
* no recurse option does not exist in mercurial
*/
public static final String NO_RECURSE_OPTION = "";
@@ -120,6 +130,8 @@ public class HgCommandConstants
public static final String VERSION = "version";
public static final String CHECK = "check";
-
+
public static final String ALL_OPTION = "-A";
+
+
}
Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkin/HgCheckInCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkin/HgCheckInCommand.java?rev=1034733&r1=1034732&r2=1034733&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkin/HgCheckInCommand.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkin/HgCheckInCommand.java Sat Nov 13 11:56:29 2010
@@ -60,6 +60,11 @@ public class HgCheckInCommand
throw new ScmException( "This provider can't handle tags for this operation" );
}
+
+ File workingDir = fileSet.getBasedir();
+ String branchName = HgUtils.getCurrentBranchName( getLogger(), workingDir );
+ boolean differentOutgoingBranch = HgUtils.differentOutgoingBranchFound( getLogger(), workingDir, branchName );
+
// Get files that will be committed (if not specified in fileSet)
List commitedFiles = new ArrayList();
File[] files = fileSet.getFiles();
@@ -96,12 +101,16 @@ public class HgCheckInCommand
// Push to parent branch if any
HgScmProviderRepository repository = (HgScmProviderRepository) repo;
+
if ( repo.isPushChanges() )
{
if ( !repository.getURI().equals( fileSet.getBasedir().getAbsolutePath() ) )
{
- String[] pushCmd = new String[]{ HgCommandConstants.PUSH_CMD, repository.getURI() };
+ String[] pushCmd = new String[]{ HgCommandConstants.PUSH_CMD,
+ differentOutgoingBranch ? HgCommandConstants.REVISION_OPTION + branchName : null,
+ repository.getURI() };
+
result = HgUtils.execute( new HgConsumer( getLogger() ), getLogger(), fileSet.getBasedir(), pushCmd );
}
Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgChangeSet.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgChangeSet.java?rev=1034733&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgChangeSet.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgChangeSet.java Sat Nov 13 11:56:29 2010
@@ -0,0 +1,51 @@
+package org.apache.maven.scm.provider.hg.command.inventory;
+
+/*
+* 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 org.apache.maven.scm.ChangeSet;
+
+/**
+ * Mercurial changeset
+ *
+ * @author <a href="mailto:lperez@xebia.fr">Laurent Perez</a>
+ * @version $Id$
+ */
+public class HgChangeSet
+ extends ChangeSet
+{
+
+ private String branch;
+
+ public HgChangeSet()
+ {
+ super();
+ }
+
+ public HgChangeSet( String branch )
+ {
+ this.branch = branch;
+ }
+
+ public String getBranch()
+ {
+ return branch;
+ }
+
+}
Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgChangeSet.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgChangeSet.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgOutgoingConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgOutgoingConsumer.java?rev=1034733&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgOutgoingConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgOutgoingConsumer.java Sat Nov 13 11:56:29 2010
@@ -0,0 +1,63 @@
+package org.apache.maven.scm.provider.hg.command.inventory;
+
+/*
+* 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 org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Get a list of outgoing changes
+ *
+ * @author <a href="mailto:lperez@xebia.fr">Laurent Perez</a>
+ * @version $Id$
+ */
+public class HgOutgoingConsumer
+ extends HgConsumer
+{
+ private List changes = new ArrayList();
+
+ private static final String BRANCH = "branch";
+
+ public HgOutgoingConsumer( ScmLogger logger )
+ {
+ super( logger );
+ }
+
+ public void consumeLine( String line )
+ {
+ String branch = null;
+
+ if ( line.startsWith( BRANCH ) )
+ {
+ branch = line.substring( BRANCH.length() + 7 );
+ }
+ changes.add( new HgChangeSet( branch ) );
+
+ }
+
+ public List getChanges()
+ {
+ return changes;
+ }
+
+}
Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgOutgoingConsumer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgOutgoingConsumer.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java?rev=1034733&r1=1034732&r2=1034733&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java Sat Nov 13 11:56:29 2010
@@ -19,11 +19,6 @@ package org.apache.maven.scm.provider.hg
* under the License.
*/
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
import org.apache.maven.scm.ScmException;
import org.apache.maven.scm.ScmFile;
import org.apache.maven.scm.ScmFileSet;
@@ -41,6 +36,11 @@ import org.apache.maven.scm.provider.hg.
import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository;
import org.codehaus.plexus.util.StringUtils;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
/**
* Tag
*
@@ -81,8 +81,8 @@ public class HgTagCommand
// build the command
String[] tagCmd =
- new String[] { HgCommandConstants.TAG_CMD, HgCommandConstants.MESSAGE_OPTION,
- scmTagParameters.getMessage(), tag };
+ new String[]{ HgCommandConstants.TAG_CMD, HgCommandConstants.MESSAGE_OPTION, scmTagParameters.getMessage(),
+ tag };
// keep the command about in string form for reporting
StringBuffer cmd = joinCmd( tagCmd );
@@ -98,7 +98,14 @@ public class HgTagCommand
{
if ( !repository.getURI().equals( fileSet.getBasedir().getAbsolutePath() ) )
{
- String[] pushCmd = new String[] { HgCommandConstants.PUSH_CMD, repository.getURI() };
+ String branchName = HgUtils.getCurrentBranchName( getLogger(), workingDir );
+ boolean differentOutgoingBranch =
+ HgUtils.differentOutgoingBranchFound( getLogger(), workingDir, branchName );
+
+ String[] pushCmd = new String[]{ HgCommandConstants.PUSH_CMD,
+ differentOutgoingBranch ? HgCommandConstants.REVISION_OPTION + branchName : null,
+ repository.getURI() };
+
result =
HgUtils.execute( new HgConsumer( getLogger() ), getLogger(), fileSet.getBasedir(), pushCmd );
}
@@ -110,7 +117,7 @@ public class HgTagCommand
}
// do an inventory to return the files tagged (all of them)
- String[] listCmd = new String[] { HgCommandConstants.INVENTORY_CMD };
+ String[] listCmd = new String[]{ HgCommandConstants.INVENTORY_CMD };
HgListConsumer listconsumer = new HgListConsumer( getLogger() );
result = HgUtils.execute( listconsumer, getLogger(), fileSet.getBasedir(), listCmd );
if ( result.isSuccess() )