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 2011/01/19 22:54:37 UTC

svn commit: r1061024 - in /maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src: main/java/org/apache/maven/scm/provider/hg/ main/java/org/apache/maven/scm/provider/hg/command/ main/java/org/apache/maven/scm/provider/hg/command/branch/ main/ja...

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
 {