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 st...@apache.org on 2009/08/24 21:41:05 UTC

svn commit: r807349 [1/2] - in /maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/maven/ src/main/java/org/apache/maven/scm/ src/main/java/...

Author: struberg
Date: Mon Aug 24 19:41:04 2009
New Revision: 807349

URL: http://svn.apache.org/viewvc?rev=807349&view=rev
Log:
[SCM-461] add maven-scm-provider-tfs for the Microsoft Team Foundation Server SCM system
Contributed by Subhash Gopalakrishnan and Martin Woodward - txs!


Added:
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/pom.xml   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProviderRepository.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsListCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/ErrorStreamConsumer.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsListCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommandTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommandTest.java   (with props)

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Aug 24 19:41:04 2009
@@ -0,0 +1,8 @@
+target
+.project
+.settings
+.classpath
+*.imp
+*.ipr
+.git
+.gitignore

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/pom.xml
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/pom.xml?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/pom.xml (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/pom.xml Mon Aug 24 19:41:04 2009
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.maven.scm</groupId>
+    <artifactId>maven-scm-providers</artifactId>
+    <version>1.3-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>maven-scm-provider-tfs</artifactId>
+
+  <name>TFS SCM Provider</name>
+  <url>http://labs.teamprise.com/maven</url>
+
+  <description>A Maven 2 SCM Provider for Microsoft Visual Studio Team Foundation Server.</description>
+
+  <developers>
+    <developer>
+      <id>martin</id>
+      <name>Martin Woodward</name>
+      <email>martin@teamprise.com</email>
+      <url>http://www.woodwardweb.com</url>
+      <organization>Teamprise</organization>
+      <organizationUrl>http://www.teamprise.com</organizationUrl>
+      <roles>
+        <role>developer</role>
+      </roles>
+      <timezone>0</timezone>
+    </developer>
+    <developer>
+      <id>subhashgo</id>
+      <name>Subhash Gopalakrishnan</name>
+      <email>subhash@teamprise.com</email>
+      <organization>Teamprise</organization>
+      <organizationUrl>http://www.teamprise.com</organizationUrl>
+      <roles>
+        <role>developer</role>
+      </roles>
+      <timezone>+5.5</timezone>
+    </developer>
+  </developers>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.plexus</groupId>
+        <artifactId>plexus-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>descriptor</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,240 @@
+package org.apache.maven.scm.provider.tfs;
+
+/*
+ * 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.net.URI;
+
+import org.apache.maven.scm.CommandParameters;
+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.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;
+import org.apache.maven.scm.command.diff.DiffScmResult;
+import org.apache.maven.scm.command.edit.EditScmResult;
+import org.apache.maven.scm.command.export.ExportScmResult;
+import org.apache.maven.scm.command.list.ListScmResult;
+import org.apache.maven.scm.command.status.StatusScmResult;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.command.unedit.UnEditScmResult;
+import org.apache.maven.scm.command.update.UpdateScmResult;
+import org.apache.maven.scm.provider.AbstractScmProvider;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.TfsAddCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsBranchCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsChangeLogCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsCheckInCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsCheckOutCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsEditCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsListCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsStatusCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsTagCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsUnEditCommand;
+import org.apache.maven.scm.provider.tfs.command.TfsUpdateCommand;
+import org.apache.maven.scm.repository.ScmRepositoryException;
+
+/**
+ * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="tfs"
+ */
+public class TfsScmProvider
+    extends AbstractScmProvider
+{
+
+    public static final String TFS_URL_FORMAT =
+        "[[domain\\]username[;password]@]http[s]://server_name[:port]:workspace:$/TeamProject/Path/To/Project";
+
+    // ----------------------------------------------------------------------
+    // ScmProvider Implementation
+    // ----------------------------------------------------------------------
+
+    public String getScmType()
+    {
+        return "tfs";
+    }
+
+    public ScmProviderRepository makeProviderScmRepository( String scmUrl, char delimiter )
+        throws ScmRepositoryException
+    {
+        // Look for the TFS URL after any '@' delmiter used to pass
+        // usernames/password etc
+        // We deliberately look for the last '@' character as username could
+        // contain an '@' also.
+        int lastAtPos = scmUrl.lastIndexOf( '@' );
+        getLogger().info( "scmUrl - " + scmUrl );
+
+        String tfsUrl = ( lastAtPos < 0 ) ? scmUrl : scmUrl.substring( lastAtPos + 1 );
+        String usernamePassword = ( lastAtPos < 0 ) ? null : scmUrl.substring( 0, lastAtPos );
+
+        // Look for TFS path after the end of the TFS URL
+        int tfsPathPos = tfsUrl.lastIndexOf( delimiter + "$/" );
+        String serverPath = "$/";
+        if ( tfsPathPos > 0 )
+        {
+            serverPath = tfsUrl.substring( tfsPathPos + 1 );
+            tfsUrl = tfsUrl.substring( 0, tfsPathPos );
+        }
+
+        // Look for workspace ater the end of the TFS URL
+        int workspacePos = tfsUrl.lastIndexOf( delimiter );
+        String workspace = tfsUrl.substring( workspacePos + 1 );
+        tfsUrl = tfsUrl.substring( 0, workspacePos );
+
+        try
+        {
+            // Use URI's validation to determine if valid URI.
+            URI tfsUri = URI.create( tfsUrl );
+            String scheme = tfsUri.getScheme();
+            getLogger().info( "Scheme - " + scheme );
+            if ( scheme == null || !( scheme.equalsIgnoreCase( "http" ) || scheme.equalsIgnoreCase( "https" ) ) )
+            {
+                throw new ScmRepositoryException( "TFS Url \"" + tfsUrl + "\" is not a valid URL. "
+                    + "The TFS Url syntax is " + TFS_URL_FORMAT );
+            }
+        }
+        catch ( IllegalArgumentException e )
+        {
+            throw new ScmRepositoryException( "TFS Url \"" + tfsUrl + "\" is not a valid URL. The TFS Url syntax is "
+                + TFS_URL_FORMAT );
+        }
+
+        String username = null;
+        String password = null;
+
+        if ( usernamePassword != null )
+        {
+            // Deliberately not using .split here in case password contains a
+            // ';'
+            int delimPos = usernamePassword.indexOf( ';' );
+            username = ( delimPos < 0 ) ? usernamePassword : usernamePassword.substring( 0, delimPos );
+            password = ( delimPos < 0 ) ? null : usernamePassword.substring( delimPos + 1 );
+        }
+
+        return new TfsScmProviderRepository( tfsUrl, username, password, serverPath, workspace );
+
+    }
+
+    protected ChangeLogScmResult changelog( ScmProviderRepository repository, ScmFileSet fileSet,
+                                            CommandParameters parameters )
+        throws ScmException
+    {
+        TfsChangeLogCommand command = new TfsChangeLogCommand();
+        command.setLogger( getLogger() );
+        return (ChangeLogScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected CheckOutScmResult checkout( ScmProviderRepository repository, ScmFileSet fileSet,
+                                          CommandParameters parameters )
+        throws ScmException
+    {
+        TfsCheckOutCommand command = new TfsCheckOutCommand();
+        command.setLogger( getLogger() );
+        return (CheckOutScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected EditScmResult edit( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsEditCommand command = new TfsEditCommand();
+        command.setLogger( getLogger() );
+        return (EditScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected UnEditScmResult unedit( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsUnEditCommand command = new TfsUnEditCommand();
+        command.setLogger( getLogger() );
+        return (UnEditScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected StatusScmResult status( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsStatusCommand command = new TfsStatusCommand();
+        command.setLogger( getLogger() );
+        return (StatusScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected UpdateScmResult update( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsUpdateCommand command = new TfsUpdateCommand();
+        command.setLogger( getLogger() );
+        return (UpdateScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected CheckInScmResult checkin( ScmProviderRepository repository, ScmFileSet fileSet,
+                                        CommandParameters parameters )
+        throws ScmException
+    {
+        TfsCheckInCommand command = new TfsCheckInCommand();
+        command.setLogger( getLogger() );
+        return (CheckInScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected AddScmResult add( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsAddCommand command = new TfsAddCommand();
+        command.setLogger( getLogger() );
+        return (AddScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected TagScmResult tag( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsTagCommand command = new TfsTagCommand();
+        command.setLogger( getLogger() );
+        return (TagScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected BranchScmResult branch( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsBranchCommand command = new TfsBranchCommand();
+        command.setLogger( getLogger() );
+        return (BranchScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected ListScmResult list( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsListCommand command = new TfsListCommand();
+        command.setLogger( getLogger() );
+        return (ListScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+    protected DiffScmResult diff( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        // Because tf launches only external diffs
+        return super.diff( repository, fileSet, parameters );
+    }
+
+    protected ExportScmResult export( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        // Use checkout instead
+        return super.export( repository, fileSet, parameters );
+    }
+
+}
\ No newline at end of file

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProviderRepository.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProviderRepository.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProviderRepository.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProviderRepository.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,74 @@
+package org.apache.maven.scm.provider.tfs;
+
+/*
+ * 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.provider.ScmProviderRepository;
+import org.codehaus.plexus.util.StringUtils;
+
+public class TfsScmProviderRepository
+    extends ScmProviderRepository
+{
+    private final String tfsUrl;
+
+    private final String serverPath;
+
+    private final String workspace;
+
+    public TfsScmProviderRepository( String tfsUrl, String user, String password, String serverPath, String workspace )
+    {
+        super();
+        setUser( user );
+        setPassword( password );
+        this.tfsUrl = tfsUrl;
+        this.serverPath = serverPath;
+        this.workspace = workspace;
+    }
+
+    public String getTfsUrl()
+    {
+        return tfsUrl;
+    }
+
+    public String getWorkspace()
+    {
+        return workspace;
+    }
+
+    public String getServerPath()
+    {
+        return serverPath;
+    }
+
+    public String getUserPassword()
+    {
+        String userPassword = null;
+
+        if ( !StringUtils.isEmpty( getUser() ) )
+        {
+            userPassword = getUser();
+
+            if ( !StringUtils.isEmpty( getPassword() ) )
+            {
+                userPassword += ";" + getPassword();
+            }
+        }
+        return userPassword;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProviderRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProviderRepository.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,54 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.add.AbstractAddCommand;
+import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+
+public class TfsAddCommand
+    extends AbstractAddCommand
+{
+
+    protected ScmResult executeAddCommand( ScmProviderRepository r, ScmFileSet f, String m, boolean b )
+        throws ScmException
+    {
+        TfsCommand command = createCommand( r, f );
+        FileListConsumer fileConsumer = new FileListConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        int status = command.execute( fileConsumer, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new AddScmResult( command.getCommandline(), "Error code for TFS add command - " + status,
+                                     err.getOutput(), false );
+        return new AddScmResult( command.getCommandline(), fileConsumer.getFiles() );
+    }
+
+    TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f )
+    {
+        TfsCommand command = new TfsCommand( "add", r, f, getLogger() );        
+        command.addArgument( f );
+        return command;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsAddCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,62 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.util.ArrayList;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+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.tfs.command.consumer.ErrorStreamConsumer;
+import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
+
+public class TfsBranchCommand
+    extends AbstractBranchCommand
+{
+
+    protected ScmResult executeBranchCommand( ScmProviderRepository r, ScmFileSet f, String branch, String message )
+        throws ScmException
+    {
+        TfsCommand command = createCommand( r, f, branch );
+        StringStreamConsumer out = new StringStreamConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        int status = command.execute( out, err );
+        if ( status != 0 || err.hasBeenFed() )
+        {
+            return new BranchScmResult( command.getCommandline(), "Error code for TFS branch command - " + status,
+                                        err.getOutput(), false );
+        }
+        return new BranchScmResult( command.getCommandline(), new ArrayList() );
+    }
+
+    TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f, String branch )
+    {
+        TfsCommand command = new TfsCommand( "branch", r, f, getLogger() );
+        command.addArgument( f.getBasedir().getAbsolutePath() );
+        command.addArgument( "-checkin" );
+        command.addArgument( branch );
+        return command;
+    }
+    
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsBranchCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,259 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.text.DateFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.maven.scm.ChangeFile;
+import org.apache.maven.scm.ChangeSet;
+import org.apache.maven.scm.ScmBranch;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
+import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
+import org.apache.maven.scm.command.changelog.ChangeLogSet;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+import org.apache.maven.scm.util.AbstractConsumer;
+
+public class TfsChangeLogCommand
+    extends AbstractChangeLogCommand
+{
+
+    protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository r, ScmFileSet f, Date startDate,
+                                                          Date endDate, ScmBranch branch, String datePattern )
+        throws ScmException
+    {
+        ArrayList changeLogs = new ArrayList();
+        Iterator iter = f.getFileList().iterator();
+        if ( !iter.hasNext() )
+        {
+            ArrayList dir = new ArrayList();
+            // No files to iterate
+            dir.add( f.getBasedir() );
+            iter = dir.iterator();
+        }
+        TfsCommand command = null;
+        // tf history takes only one file arg
+        while ( iter.hasNext() )
+        {
+            TfsChangeLogConsumer out = new TfsChangeLogConsumer( getLogger() );
+            ErrorStreamConsumer err = new ErrorStreamConsumer();
+
+            command = createCommand( r, f, ( (File) iter.next() ) );
+            int status = command.execute( out, err );
+
+            if ( status != 0 || ( !out.hasBeenFed() && err.hasBeenFed() ) )
+                return new ChangeLogScmResult( command.getCommandline(), "Error code for TFS changelog command - "
+                    + status, err.getOutput(), false );
+            changeLogs.addAll( out.getLogs() );
+        }
+        return new ChangeLogScmResult( command.getCommandline(), new ChangeLogSet( changeLogs, startDate, endDate ) );
+
+    }
+
+    protected TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f, File file )
+    {
+        TfsCommand command = new TfsCommand( "history", r, f, getLogger() );
+        command.addArgument( "-format:detailed" );
+        command.addArgument( file.getName() );
+        return command;
+    }
+}
+
+class TfsChangeLogConsumer
+    extends AbstractConsumer
+{
+
+    private static final String PATTERN =
+        "^[^:]*:[ \t]([0-9]*)\n" + "[^:]*:[ \t](.*)\n[^:]*:[ \t](.*)\n"
+            + "[^:]*:((?:\n.*)*)\n\n[^\n :]*:(?=\n  )((?:\n[ \t]+.*)*)";
+
+    private static final String PATTERN_ITEM = "\n  ([^$]+) (\\$/.*)";
+
+    ArrayList logs = new ArrayList();
+
+    String buffer = "";
+
+    boolean fed = false;
+
+    public TfsChangeLogConsumer( ScmLogger logger )
+    {
+        super( logger );
+    }
+
+    public void consumeLine( String line )
+    {
+        fed = true;
+        if ( line.startsWith( "-----" ) )
+        {
+            addChangeLog();
+        }
+        buffer += line + "\n";
+    }
+
+    public List getLogs()
+    {
+        addChangeLog();
+        return logs;
+    }
+
+    private void addChangeLog()
+    {
+        if ( !buffer.equals( "" ) )
+        {
+            Pattern p = Pattern.compile( PATTERN );
+            Matcher m = p.matcher( buffer );
+            if ( m.find() )
+            {
+                String revision = m.group( 1 ).trim();
+                String username = m.group( 2 ).trim();
+                String dateString = m.group( 3 ).trim();
+                String comment = m.group( 4 ).trim();
+                Pattern itemPattern = Pattern.compile( PATTERN_ITEM );
+                Matcher itemMatcher = itemPattern.matcher( m.group( 5 ) );
+                List files = new ArrayList();
+                while ( itemMatcher.find() )
+                {
+                    ChangeFile file = new ChangeFile( itemMatcher.group( 2 ).trim(), revision );
+                    files.add( file );
+                }
+                Date date;
+                try
+                {
+                    date = parseDate( dateString );
+                }
+                catch ( ParseException e )
+                {
+                    getLogger().error( "Date parse error", e );
+                    throw new RuntimeException( e );
+                }
+
+                ChangeSet change = new ChangeSet( date, comment, username, files );
+                logs.add( change );
+            }
+            buffer = "";
+        }
+    }
+
+    public boolean hasBeenFed()
+    {
+        return fed;
+    }
+
+    protected static Date parseDate( String dateString )
+        throws ParseException
+    {
+        Date date = null;
+        try
+        {
+            // Use the depricated Date.parse method as this is very good at
+            // detecting
+            // dates commonly output by the US and UK standard locales of
+            // dotnet that
+            // are output by the Microsoft command line client.
+            date = new Date( Date.parse( dateString ) );
+        }
+        catch ( IllegalArgumentException e )
+        {
+            // ignore - parse failed.
+        }
+        if ( date == null )
+        {
+            // The old fashioned way did not work. Let's try it using a more
+            // complex
+            // alternative.
+            DateFormat[] formats = createDateFormatsForLocaleAndTimeZone( null, null );
+            return parseWithFormats( dateString, formats );
+        }
+        return date;
+    }
+
+    private static Date parseWithFormats( String input, DateFormat[] formats )
+        throws ParseException
+    {
+        ParseException parseException = null;
+        for ( int i = 0; i < formats.length; i++ )
+        {
+            try
+            {
+                return formats[i].parse( input );
+            }
+            catch ( ParseException ex )
+            {
+                parseException = ex;
+            }
+        }
+
+        throw parseException;
+    }
+
+    /**
+     * Build an array of DateFormats that are commonly used for this locale and timezone.
+     */
+    private static DateFormat[] createDateFormatsForLocaleAndTimeZone( Locale locale, TimeZone timeZone )
+    {
+        if ( locale == null )
+        {
+            locale = Locale.getDefault();
+        }
+
+        if ( timeZone == null )
+        {
+            timeZone = TimeZone.getDefault();
+        }
+
+        List formats = new ArrayList();
+
+        for ( int dateStyle = DateFormat.FULL; dateStyle <= DateFormat.SHORT; dateStyle++ )
+        {
+            for ( int timeStyle = DateFormat.FULL; timeStyle <= DateFormat.SHORT; timeStyle++ )
+            {
+                DateFormat df = DateFormat.getDateTimeInstance( dateStyle, timeStyle, locale );
+                if ( timeZone != null )
+                {
+                    df.setTimeZone( timeZone );
+                }
+                formats.add( df );
+            }
+        }
+
+        for ( int dateStyle = DateFormat.FULL; dateStyle <= DateFormat.SHORT; dateStyle++ )
+        {
+            DateFormat df = DateFormat.getDateInstance( dateStyle, locale );
+            df.setTimeZone( timeZone );
+            formats.add( df );
+        }
+
+        return (DateFormat[]) formats.toArray( new DateFormat[formats.size()] );
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsChangeLogCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,58 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.checkin.AbstractCheckInCommand;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+
+public class TfsCheckInCommand
+    extends AbstractCheckInCommand
+{
+
+    protected CheckInScmResult executeCheckInCommand( ScmProviderRepository r, ScmFileSet f, String m, ScmVersion v )
+        throws ScmException
+    {
+
+        TfsCommand command = createCommand( r, f, m );
+        FileListConsumer fileConsumer = new FileListConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        int status = command.execute( fileConsumer, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new CheckInScmResult( command.getCommandline(), "Error code for TFS checkin command - " + status,
+                                         err.getOutput(), false );
+        return new CheckInScmResult( command.getCommandline(), fileConsumer.getFiles() );
+    }
+
+    TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f, String m )
+    {
+        TfsCommand command = new TfsCommand( "checkin", r, f, getLogger() );
+        command.addArgument( "-noprompt" );
+        if ( m != null && !m.equals( "" ) )
+            command.addArgument( "-comment:" + m + "" );
+        command.addArgument( f );
+        return command;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckInCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,187 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.List;
+
+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.ScmVersion;
+import org.apache.maven.scm.command.checkout.AbstractCheckOutCommand;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.TfsScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+// Usage: mvn scm:checkout -DcheckoutDirectory=<dir>
+public class TfsCheckOutCommand
+    extends AbstractCheckOutCommand
+{
+
+    protected CheckOutScmResult executeCheckOutCommand( ScmProviderRepository r, ScmFileSet f, ScmVersion v,
+                                                        boolean recursive )
+        throws ScmException
+    {
+        TfsScmProviderRepository tfsRepo = (TfsScmProviderRepository) r;
+        String url = tfsRepo.getServerPath();
+        String tfsUrl = tfsRepo.getTfsUrl();
+        String workspace = tfsRepo.getWorkspace();
+
+        // Try creating workspace
+        boolean workspaceProvided = workspace != null && !workspace.trim().equals( "" );
+        if ( workspaceProvided )
+            createWorkspace( r, f, workspace, tfsUrl );
+
+        TfsCommand command;
+        int status;
+
+        if ( workspaceProvided )
+            status = executeUnmapCommand( r, f );
+
+        ErrorStreamConsumer out = new ErrorStreamConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        if ( workspaceProvided )
+        {
+            command = new TfsCommand( "workfold", r, null, getLogger() );
+            command.addArgument( "-workspace:" + workspace );
+            command.addArgument( "-map" );
+            command.addArgument( url );
+            command.addArgument( f.getBasedir().getAbsolutePath() );
+            status = command.execute( out, err );
+            if ( status != 0 || err.hasBeenFed() )
+                return new CheckOutScmResult( command.getCommandline(),
+                                              "Error code for TFS checkout (workfold map) command - " + status,
+                                              err.getOutput(), false );
+        }
+        FileListConsumer fileConsumer = new FileListConsumer();
+        err = new ErrorStreamConsumer();
+        command = createGetCommand( r, f, v, recursive );
+        status = command.execute( fileConsumer, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new CheckOutScmResult( command.getCommandline(), "Error code for TFS checkout (get) command - "
+                + status, err.getOutput(), false );
+        return new CheckOutScmResult( command.getCommandline(), fileConsumer.getFiles() );
+    }
+
+    TfsCommand createGetCommand( ScmProviderRepository r, ScmFileSet f, ScmVersion v, boolean recursive )
+    {
+        TfsCommand command = new TfsCommand( "get", r, f, getLogger() );
+        if ( recursive )
+            command.addArgument( "-recursive" );
+        command.addArgument( "-force" );
+        if ( v != null && !v.equals( "" ) )
+        {
+            String vType = "";
+            if ( v.getType().equals( "Tag" ) )
+                vType = "L";
+            if ( v.getType().equals( "Revision" ) )
+                vType = "C";
+            command.addArgument( "-version:" + vType + v.getName() );
+        }
+        command.addArgument( f.getBasedir().getAbsolutePath() );
+        return command;
+    }
+
+    public int executeUnmapCommand( ScmProviderRepository r, ScmFileSet f )
+        throws ScmException
+    {
+        TfsScmProviderRepository tfsRepo = (TfsScmProviderRepository) r;
+        String url = tfsRepo.getServerPath();
+        String workspace = tfsRepo.getWorkspace();
+        ErrorStreamConsumer out = new ErrorStreamConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        TfsCommand command = new TfsCommand( "workfold", r, null, getLogger() );
+        command.addArgument( "-workspace:" + workspace );
+        command.addArgument( "-unmap" );
+        command.addArgument( url );
+        return command.execute( out, err );
+    }
+
+    private void createWorkspace( ScmProviderRepository r, ScmFileSet f, String workspace, String url )
+        throws ScmException
+    {
+        ErrorStreamConsumer out = new ErrorStreamConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        // Checkout dir may not exist yet
+        TfsCommand command = new TfsCommand( "workspace", r, null, getLogger() );
+        command.addArgument( "-new" );
+        command.addArgument( "-comment:Creating workspace for maven command" );
+        command.addArgument( "-server:" + url );
+        command.addArgument( workspace );
+        int status = command.execute( out, err );
+    }
+
+}
+
+class FileListConsumer
+    implements StreamConsumer
+{
+
+    boolean fed = false;
+
+    String currentDir = "";
+
+    ArrayList files = new ArrayList();
+
+    public void consumeLine( String line )
+    {
+        fed = true;
+        if ( line.endsWith( ":" ) )
+        {
+            currentDir = line.substring( 0, line.lastIndexOf( ':' ) );
+            ScmFile scmFile = new ScmFile( currentDir, ScmFileStatus.CHECKED_OUT );
+            if ( !files.contains( scmFile ) )
+                files.add( scmFile );
+        }
+        else if ( line.trim().equals( "" ) )
+        {
+            currentDir = "";
+        }
+        else if ( !currentDir.equals( "" ) && line.contains( " " ) )
+        {
+            String filename = line.split( " " )[1];
+            files.add( getScmFile( filename ) );
+        }
+        else
+        {
+            files.add( getScmFile( line ) );
+        }
+    }
+
+    protected ScmFile getScmFile( String filename )
+    {
+        return new ScmFile( new File( currentDir, filename ).getAbsolutePath(), ScmFileStatus.CHECKED_OUT );
+    }
+
+    public List getFiles()
+    {
+        return files;
+    }
+
+    public boolean hasBeenFed()
+    {
+        return fed;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCheckOutCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,120 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.Iterator;
+
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
+
+public class TfsCommand
+{
+
+    private ScmLogger logger;
+
+    Commandline command;
+
+    public TfsCommand( String cmd, ScmProviderRepository r, ScmFileSet f, ScmLogger logger )
+    {
+        command = new Commandline();
+        command.setExecutable( "tf" );
+        if ( f != null )
+            command.setWorkingDirectory( f.getBasedir().getAbsolutePath() );
+        command.createArgument().setValue( cmd );
+        if ( r.getUser() != null )
+        {
+            command.createArgument().setValue( "-login:" + r.getUser() + "," + r.getPassword() );
+        }
+        this.logger = logger;
+    }
+
+    public void addArgument( ScmFileSet f )
+    {
+        info( "files: " + f.getBasedir().getAbsolutePath() );
+        Iterator iter = f.getFileList().iterator();
+        while ( iter.hasNext() )
+            command.createArgument().setValue( ( (File) iter.next() ).getPath() );
+    }
+
+    public void addArgument( String s )
+    {
+        command.createArgument().setValue( s );
+    }
+
+    public int execute( StreamConsumer out, ErrorStreamConsumer err )
+        throws ScmException
+    {
+        info( "Command line - " + getCommandline() );
+        int status;
+        try
+        {
+            status = CommandLineUtils.executeCommandLine( command, out, err );
+        }
+        catch ( CommandLineException e )
+        {
+            throw new ScmException( "Error while executing TFS command line - " + getCommandline(), e );
+        }
+        info( "err - " + err.getOutput() );
+        if ( out instanceof StringStreamConsumer )
+        {
+            StringStreamConsumer sc = (StringStreamConsumer) out;
+            debug( sc.getOutput() );
+        }
+        if ( out instanceof FileListConsumer )
+        {
+            FileListConsumer f = (FileListConsumer) out;
+            for ( Iterator i = f.getFiles().iterator(); i.hasNext(); )
+            {
+                ScmFile file = (ScmFile) i.next();
+                debug( file.getPath() );
+            }
+        }
+
+        return status;
+    }
+
+    public String getCommandline()
+    {
+        return command.toString();
+    }
+
+    private void info( String message )
+    {
+        if ( logger != null )
+            logger.info( message );
+    }
+
+    private void debug( String message )
+    {
+        if ( logger != null )
+            logger.debug( message );
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,54 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.edit.AbstractEditCommand;
+import org.apache.maven.scm.command.edit.EditScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+
+//Usage: mvn scm:edit -DworkingDirectory=<dir> -Dincludes=*
+public class TfsEditCommand
+    extends AbstractEditCommand
+{
+
+    protected ScmResult executeEditCommand( ScmProviderRepository r, ScmFileSet f )
+        throws ScmException
+    {
+        FileListConsumer out = new FileListConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        TfsCommand command = createCommand( r, f );
+        int status = command.execute( out, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new EditScmResult( command.getCommandline(), "Error code for TFS edit command - " + status,
+                                      err.getOutput(), false );
+        return new EditScmResult( command.getCommandline(), out.getFiles() );
+    }
+
+    protected TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f )
+    {
+        TfsCommand command = new TfsCommand( "checkout", r, f, getLogger() );
+        command.addArgument( f );
+        return command;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsEditCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsListCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsListCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsListCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsListCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,70 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.list.AbstractListCommand;
+import org.apache.maven.scm.command.list.ListScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+
+public class TfsListCommand
+    extends AbstractListCommand
+{
+
+    protected ListScmResult executeListCommand( ScmProviderRepository r, ScmFileSet f, boolean recursive, ScmVersion v )
+        throws ScmException
+    {
+        FileListConsumer out = new ServerFileListConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        TfsCommand command = createCommand( r, f, recursive );
+        int status = command.execute( out, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new ListScmResult( command.getCommandline(), "Error code for TFS list command - " + status,
+                                      err.getOutput(), false );
+        return new ListScmResult( command.getCommandline(), out.getFiles() );
+    }
+
+    TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f, boolean recursive )
+    {
+        TfsCommand command = new TfsCommand( "dir", r, f, getLogger() );
+        if ( recursive )
+            command.addArgument( "-recursive" );
+        command.addArgument( f );
+        return command;
+    }
+
+}
+
+class ServerFileListConsumer
+    extends FileListConsumer
+{
+    protected ScmFile getScmFile( String filename )
+    {
+        if ( filename.startsWith( "$" ) )
+            filename = filename.replace( "$", "" );
+        String path = currentDir + "/" + filename;
+        return new ScmFile( path, ScmFileStatus.UNKNOWN );
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsListCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsListCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,156 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.util.ArrayList;
+import java.util.HashMap;
+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;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.command.status.AbstractStatusCommand;
+import org.apache.maven.scm.command.status.StatusScmResult;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.TfsScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+public class TfsStatusCommand
+    extends AbstractStatusCommand
+{
+
+    protected StatusScmResult executeStatusCommand( ScmProviderRepository r, ScmFileSet f )
+        throws ScmException
+    {
+        TfsScmProviderRepository tfsRepo = (TfsScmProviderRepository) r;
+
+        TfsCommand command = createCommand( tfsRepo, f );
+        ChangedFileConsumer out = new ChangedFileConsumer( getLogger() );
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        int status = command.execute( out, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new StatusScmResult( command.getCommandline(), "Error code for TFS status command - " + status,
+                                        err.getOutput(), false );
+        Iterator iter = out.getChangedFiles().iterator();
+        getLogger().debug( "Iterating" );
+        while ( iter.hasNext() )
+        {
+            ScmFile file = (ScmFile) iter.next();
+            getLogger().debug( file.getPath() + ":" + file.getStatus() );
+        }
+        return new StatusScmResult( command.getCommandline(), out.getChangedFiles() );
+    }
+
+    TfsCommand createCommand( TfsScmProviderRepository r, ScmFileSet f )
+    {
+        String url = r.getServerPath();
+        String workspace = r.getWorkspace();
+        TfsCommand command = new TfsCommand( "status", r, f, getLogger() );
+        if ( workspace != null && !workspace.trim().equals( "" ) )
+            command.addArgument( "-workspace:" + workspace );
+        command.addArgument( "-recursive" );
+        command.addArgument( "-format:detailed" );
+        command.addArgument( url );
+        return command;
+    }
+}
+
+class ChangedFileConsumer
+    implements StreamConsumer
+{
+
+    private ScmLogger logger;
+
+    static final String KEY_CHANGE = "Change";
+
+    static final String KEY_LOCAL_ITEM = "Local item";
+
+    static final String CHANGE_EDIT = "edit";
+
+    static final String CHANGE_ADD = "add";
+
+    HashMap values = new HashMap();
+
+    ArrayList changedFiles = new ArrayList();
+
+    public ChangedFileConsumer( ScmLogger logger )
+    {
+        this.logger = logger;
+    }
+
+    public void consumeLine( String line )
+    {
+        if ( line.contains( ":" ) )
+        {
+            String[] s = line.split( ":", 2 );
+            if ( s.length > 1 )
+                values.put( s[0].trim(), s[1].trim() );
+        }
+        if ( line.trim().equals( "" ) )
+        {
+            extractChangedFile();
+        }
+        logger.debug( "line -" + line );
+    }
+
+    private void extractChangedFile()
+    {
+        String change = getChange();
+        if ( change != null )
+        {
+            ScmFileStatus stat = ScmFileStatus.UNKNOWN;
+            if ( change.equals( ChangedFileConsumer.CHANGE_EDIT ) )
+                stat = ScmFileStatus.MODIFIED;
+            if ( change.equals( ChangedFileConsumer.CHANGE_ADD ) )
+                stat = ScmFileStatus.ADDED;
+            changedFiles.add( new ScmFile( getLocalPath(), stat ) );
+            values.clear();
+        }
+    }
+
+    public List getChangedFiles()
+    {
+        if ( values.size() > 0 )
+        {
+            extractChangedFile();
+        }
+        return changedFiles;
+    }
+
+    private String getChange()
+    {
+        return (String) values.get( KEY_CHANGE );
+    }
+
+    private String getLocalPath()
+    {
+        String local = (String) values.get( KEY_LOCAL_ITEM );
+        if ( local != null )
+        {
+            local = local.split( "]", 2 )[1].trim();
+        }
+        return local;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsStatusCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,77 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmTagParameters;
+import org.apache.maven.scm.command.tag.AbstractTagCommand;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.TfsScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
+
+public class TfsTagCommand
+    extends AbstractTagCommand
+{
+
+    protected ScmResult executeTagCommand( ScmProviderRepository r, ScmFileSet f, String tag, String message )
+        throws ScmException
+    {
+        return executeTagCommand( r, f, tag, new ScmTagParameters( message ) );
+    }
+
+    protected ScmResult executeTagCommand( ScmProviderRepository r, ScmFileSet f, String tag,
+                                           ScmTagParameters scmTagParameters )
+        throws ScmException
+    {
+        TfsCommand command = createCommand( r, f, tag, scmTagParameters );
+
+        StringStreamConsumer out = new StringStreamConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+
+        int status = command.execute( out, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new TagScmResult( command.getCommandline(), "Error code for TFS label command - " + status,
+                                     err.getOutput(), false );
+        return new TagScmResult( command.getCommandline(), f.getFileList() );
+
+    }
+
+    TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f, String tag,
+                                        ScmTagParameters scmTagParameters )
+    {
+        TfsScmProviderRepository tfsRepo = (TfsScmProviderRepository) r;
+        String url = tfsRepo.getServerPath();
+
+        TfsCommand command = new TfsCommand( "label", r, f, getLogger() );
+        command.addArgument( tag );
+        command.addArgument( url );
+        command.addArgument( "-recursive" );
+        command.addArgument( "-child:replace" );
+        String message = scmTagParameters.getMessage();
+        if ( message != null && !message.equals( "" ) )
+            command.addArgument( "-comment:" + message );
+        return command;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsTagCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,54 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.unedit.AbstractUnEditCommand;
+import org.apache.maven.scm.command.unedit.UnEditScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+
+// Usage: mvn scm:unedit -DworkingDirectory=<dir> -Dincludes=*
+public class TfsUnEditCommand
+    extends AbstractUnEditCommand
+{
+
+    protected ScmResult executeUnEditCommand( ScmProviderRepository r, ScmFileSet f )
+        throws ScmException
+    {
+        FileListConsumer out = new FileListConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        TfsCommand command = createCommand( r, f );
+        int status = command.execute( out, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new UnEditScmResult( command.getCommandline(), "Error code for TFS unedit command - " + status,
+                                        err.getOutput(), false );
+        return new UnEditScmResult( command.getCommandline(), out.getFiles() );
+    }
+
+    TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f )
+    {
+        TfsCommand command = new TfsCommand( "undo", r, f, getLogger() );
+        command.addArgument( f );
+        return command;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUnEditCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommand.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommand.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,73 @@
+package org.apache.maven.scm.provider.tfs.command;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.changelog.ChangeLogCommand;
+import org.apache.maven.scm.command.update.AbstractUpdateCommand;
+import org.apache.maven.scm.command.update.UpdateScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.TfsScmProviderRepository;
+import org.apache.maven.scm.provider.tfs.command.consumer.ErrorStreamConsumer;
+
+public class TfsUpdateCommand
+    extends AbstractUpdateCommand
+{
+
+    protected UpdateScmResult executeUpdateCommand( ScmProviderRepository r, ScmFileSet f, ScmVersion v )
+        throws ScmException
+    {
+        FileListConsumer fileConsumer = new FileListConsumer();
+        ErrorStreamConsumer err = new ErrorStreamConsumer();
+        TfsCommand command = createCommand( r, f, v );
+        int status = command.execute( fileConsumer, err );
+        if ( status != 0 || err.hasBeenFed() )
+            return new UpdateScmResult( command.getCommandline(), "Error code for TFS update command - " + status,
+                                        err.getOutput(), false );
+        return new UpdateScmResult( command.getCommandline(), fileConsumer.getFiles() );
+    }
+
+    TfsCommand createCommand( ScmProviderRepository r, ScmFileSet f, ScmVersion v )
+    {
+        String serverPath = ( (TfsScmProviderRepository) r ).getServerPath();
+        TfsCommand command = new TfsCommand( "get", r, f, getLogger() );
+        command.addArgument( serverPath );
+        if ( v != null && !v.equals( "" ) )
+        {
+            String vType = "";
+            if ( v.getType().equals( "Tag" ) )
+                vType = "L";
+            if ( v.getType().equals( "Revision" ) )
+                vType = "C";
+            command.addArgument( "-version:" + vType + v.getName() );
+        }
+        return command;
+    }
+
+    protected ChangeLogCommand getChangeLogCommand()
+    {
+        TfsChangeLogCommand changeLogCommand = new TfsChangeLogCommand();
+        changeLogCommand.setLogger( getLogger() );
+        return changeLogCommand;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/TfsUpdateCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/ErrorStreamConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/ErrorStreamConsumer.java?rev=807349&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/ErrorStreamConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/ErrorStreamConsumer.java Mon Aug 24 19:41:04 2009
@@ -0,0 +1,41 @@
+package org.apache.maven.scm.provider.tfs.command.consumer;
+
+/*
+ * 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.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
+
+public class ErrorStreamConsumer
+    extends StringStreamConsumer
+{
+
+    private boolean fed = false;
+
+    public void consumeLine( String line )
+    {
+        fed = true;
+        super.consumeLine( line );
+    }
+
+    public boolean hasBeenFed()
+    {
+        return fed;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/ErrorStreamConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/consumer/ErrorStreamConsumer.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision