Author: olamy Date: Wed Jan 19 21:54:37 2011 New Revision: 1061024 URL: http://svn.apache.org/viewvc?rev=1061024&view=rev Log: [SCM-587] Branch support for Mercurial (hg) SCM provider Submitted by Henning Schmiedehausen
Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.java (with props) Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.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/checkout/HgCheckOutCommand.java maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommandTckTest.java Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.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/HgScmProvider.java?rev=1061024&r1=1061023&r2=1061024&view=diff ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java (original) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java Wed Jan 19 21:54:37 2011 @@ -28,6 +28,7 @@ import org.apache.maven.scm.ScmException import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.command.add.AddScmResult; import org.apache.maven.scm.command.blame.BlameScmResult; +import org.apache.maven.scm.command.branch.BranchScmResult; import org.apache.maven.scm.command.changelog.ChangeLogScmResult; import org.apache.maven.scm.command.checkin.CheckInScmResult; import org.apache.maven.scm.command.checkout.CheckOutScmResult; @@ -40,6 +41,7 @@ import org.apache.maven.scm.provider.Abs import org.apache.maven.scm.provider.ScmProviderRepository; import org.apache.maven.scm.provider.hg.command.add.HgAddCommand; import org.apache.maven.scm.provider.hg.command.blame.HgBlameCommand; +import org.apache.maven.scm.provider.hg.command.branch.HgBranchCommand; import org.apache.maven.scm.provider.hg.command.changelog.HgChangeLogCommand; import org.apache.maven.scm.provider.hg.command.checkin.HgCheckInCommand; import org.apache.maven.scm.provider.hg.command.checkout.HgCheckOutCommand; @@ -298,4 +300,15 @@ public class HgScmProvider return (BlameScmResult) command.execute( repository, fileSet, parameters ); } + + /** {@inheritDoc} */ + public BranchScmResult branch( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) + throws ScmException + { + HgBranchCommand command = new HgBranchCommand(); + + command.setLogger( getLogger() ); + + return (BranchScmResult) command.execute( repository, fileSet, parameters ); + } } 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=1061024&r1=1061023&r2=1061024&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 Wed Jan 19 21:54:37 2011 @@ -59,7 +59,12 @@ public class HgCommandConstants /** * Create a new copy of a branch. Alias get or clone */ - public static final String BRANCH_CMD = "clone"; + public static final String CLONE_CMD = "clone"; + + /** + * Create a new branch in the repo. + */ + public static final String BRANCH_CMD = "branch"; /** * Commit changes into a new revision @@ -133,5 +138,7 @@ public class HgCommandConstants public static final String ALL_OPTION = "-A"; + public static final String NEW_BRANCH_OPTION = "--new-branch"; + } Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.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/branch/HgBranchCommand.java?rev=1061024&view=auto ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.java (added) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.java Wed Jan 19 21:54:37 2011 @@ -0,0 +1,173 @@ +package org.apache.maven.scm.provider.hg.command.branch; + +/* + * 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.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.maven.scm.ScmBranchParameters; +import org.apache.maven.scm.ScmException; +import org.apache.maven.scm.ScmFile; +import org.apache.maven.scm.ScmFileSet; +import org.apache.maven.scm.ScmFileStatus; +import org.apache.maven.scm.ScmResult; +import org.apache.maven.scm.command.Command; +import org.apache.maven.scm.command.branch.AbstractBranchCommand; +import org.apache.maven.scm.command.branch.BranchScmResult; +import org.apache.maven.scm.provider.ScmProviderRepository; +import org.apache.maven.scm.provider.hg.HgUtils; +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.HgListConsumer; +import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository; +import org.codehaus.plexus.util.StringUtils; + +/** + * Branch. Mercurial has weird branches. After a branch is created, it must be committed to the server, otherwise + * the branch does not exist (yet) in the repository. + * + * @author Henning Schmiedehausen + * @version $Id$ + */ +public class HgBranchCommand + extends AbstractBranchCommand + implements Command +{ + + protected ScmResult executeBranchCommand( ScmProviderRepository scmProviderRepository, ScmFileSet fileSet, String branch, + String message ) + throws ScmException + { + return executeBranchCommand( scmProviderRepository, fileSet, branch, new ScmBranchParameters( message ) ); + } + + /** + * {@inheritDoc} + */ + protected ScmResult executeBranchCommand( ScmProviderRepository scmProviderRepository, ScmFileSet fileSet, String branch, + ScmBranchParameters scmBranchParameters ) + throws ScmException + { + + if ( StringUtils.isBlank( branch ) ) + { + throw new ScmException( "branch must be specified" ); + } + + if ( !fileSet.getFileList().isEmpty() ) + { + throw new ScmException( "This provider doesn't support branchging subsets of a directory" ); + } + + File workingDir = fileSet.getBasedir(); + + // build the command + String[] branchCmd = + new String[]{ HgCommandConstants.BRANCH_CMD, branch }; + + // keep the command about in string form for reporting + ; + HgConsumer branchConsumer = new HgConsumer( getLogger() ) { + public void doConsume( ScmFileStatus status, String trimmedLine ) + { + } + }; + + ScmResult result = HgUtils.execute( branchConsumer, getLogger(), workingDir, branchCmd ); + HgScmProviderRepository repository = (HgScmProviderRepository) scmProviderRepository; + + if ( !result.isSuccess() ) + { + throw new ScmException( "Error while executing command " + joinCmd( branchCmd ) ); + } + + // First commit. + String[] commitCmd = new String[]{ HgCommandConstants.COMMIT_CMD, HgCommandConstants.MESSAGE_OPTION, scmBranchParameters.getMessage() }; + + + result = HgUtils.execute( new HgConsumer( getLogger() ), getLogger(), workingDir, commitCmd ); + + if ( !result.isSuccess() ) + { + throw new ScmException( "Error while executing command " + joinCmd( commitCmd ) ); + } + + // now push, if we should. + + if ( repository.isPushChanges() ) + { + if ( !repository.getURI().equals( fileSet.getBasedir().getAbsolutePath() ) ) + { + + String[] pushCmd = new String[] { + HgCommandConstants.PUSH_CMD, + HgCommandConstants.NEW_BRANCH_OPTION, + repository.getURI() + }; + + result = HgUtils.execute( new HgConsumer( getLogger() ), getLogger(), fileSet.getBasedir(), pushCmd ); + + if ( !result.isSuccess() ) + { + throw new ScmException( "Error while executing command " + joinCmd( pushCmd ) ); + } + } + } + + // do an inventory to return the files branched (all of them) + String[] listCmd = new String[]{ HgCommandConstants.INVENTORY_CMD }; + HgListConsumer listconsumer = new HgListConsumer( getLogger() ); + + result = HgUtils.execute( listconsumer, getLogger(), fileSet.getBasedir(), listCmd ); + + if ( !result.isSuccess() ) + { + throw new ScmException( "Error while executing command " + joinCmd(listCmd) ); + } + + List<ScmFile> files = listconsumer.getFiles(); + List<ScmFile> fileList = new ArrayList<ScmFile>(); + for ( Iterator<ScmFile> i = files.iterator(); i.hasNext(); ) + { + ScmFile f = i.next(); + + fileList.add( new ScmFile( f.getPath(), ScmFileStatus.TAGGED ) ); + } + + return new BranchScmResult( fileList, result ); + } + + private String joinCmd( String[] cmd ) + { + StringBuilder result = new StringBuilder(); + for ( int i = 0; i < cmd.length; i++ ) + { + String s = cmd[i]; + result.append( s ); + if ( i < cmd.length - 1 ) + { + result.append( " " ); + } + } + return result.toString(); + } +} Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/branch/HgBranchCommand.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/branch/HgBranchCommand.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/checkout/HgCheckOutCommand.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/checkout/HgCheckOutCommand.java?rev=1061024&r1=1061023&r2=1061024&view=diff ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java (original) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/checkout/HgCheckOutCommand.java Wed Jan 19 21:54:37 2011 @@ -70,7 +70,7 @@ public class HgCheckOutCommand // Do the actual checkout String[] checkoutCmd = new String[] { - HgCommandConstants.BRANCH_CMD, + HgCommandConstants.CLONE_CMD, HgCommandConstants.REVISION_OPTION, scmVersion != null && !StringUtils.isEmpty( scmVersion.getName() ) ? scmVersion.getName() : "tip", url, Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommandTckTest.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommandTckTest.java?rev=1061024&r1=1061023&r2=1061024&view=diff ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommandTckTest.java (original) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/diff/HgDiffCommandTckTest.java Wed Jan 19 21:54:37 2011 @@ -19,7 +19,12 @@ package org.apache.maven.scm.provider.hg * under the License. */ -import org.apache.maven.scm.ChangeFile; +import java.io.File; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; + import org.apache.maven.scm.ScmFile; import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.ScmTestCase; @@ -30,12 +35,6 @@ import org.apache.maven.scm.provider.hg. import org.apache.maven.scm.repository.ScmRepository; import org.apache.maven.scm.tck.command.diff.DiffCommandTckTest; -import java.io.File; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeSet; - public class HgDiffCommandTckTest extends DiffCommandTckTest {