You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm-commits@maven.apache.org by ol...@apache.org on 2010/06/08 22:30:56 UTC

svn commit: r952808 - in /maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src: main/java/org/apache/maven/scm/provider/tfs/ main/java/org/apache/maven/scm/provider/tfs/command/blame/ test/java/org/apache/maven/scm/provider/tfs/command/blame/...

Author: olamy
Date: Tue Jun  8 20:30:55 2010
New Revision: 952808

URL: http://svn.apache.org/viewvc?rev=952808&view=rev
Log:
[SCM-545] Add blame command to TFS provider
Submitted by Evgeny Mandrikov

Added:
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt   (with props)
Modified:
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java

Modified: 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=952808&r1=952807&r2=952808&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java Tue Jun  8 20:30:55 2010
@@ -25,6 +25,7 @@ import org.apache.maven.scm.CommandParam
 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;
@@ -50,6 +51,7 @@ import org.apache.maven.scm.provider.tfs
 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.provider.tfs.command.blame.TfsBlameCommand;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 
 /**
@@ -222,6 +224,14 @@ public class TfsScmProvider
         return (ListScmResult) command.execute( repository, fileSet, parameters );
     }
 
+    protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        TfsBlameCommand command = new TfsBlameCommand();
+        command.setLogger( getLogger() );
+        return (BlameScmResult) command.execute( repository, fileSet, parameters );
+    }
+
     protected DiffScmResult diff( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
         throws ScmException
     {

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.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/blame/TfsBlameCommand.java?rev=952808&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java Tue Jun  8 20:30:55 2010
@@ -0,0 +1,75 @@
+package org.apache.maven.scm.provider.tfs.command.blame;
+
+/*
+ * 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.command.blame.AbstractBlameCommand;
+import org.apache.maven.scm.command.blame.BlameScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class TfsBlameCommand
+    extends AbstractBlameCommand
+{
+    public BlameScmResult executeBlameCommand( ScmProviderRepository repo, ScmFileSet workingDirectory, String filename )
+        throws ScmException
+    {
+        Commandline cl = createCommandLine( workingDirectory.getBasedir(), filename );
+
+        TfsBlameConsumer consumer = new TfsBlameConsumer( getLogger() );
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        int exitCode;
+        try
+        {
+            exitCode = CommandLineUtils.executeCommandLine( cl, consumer, stderr );
+        }
+        catch ( CommandLineException ex )
+        {
+            throw new ScmException( "Error while executing command.", ex );
+        }
+        if ( exitCode != 0 )
+        {
+            return new BlameScmResult( cl.toString(), "The tfs command failed.", stderr.getOutput(), false );
+        }
+
+        return new BlameScmResult( cl.toString(), consumer.getLines() );
+    }
+
+    public static Commandline createCommandLine( File workingDirectory, String filename )
+    {
+        Commandline command = new Commandline();
+        command.setWorkingDirectory( workingDirectory );
+        command.setExecutable( "tfpt" );
+        command.createArg().setValue( "annotate" );
+        command.createArg().setValue( "/noprompt" );
+        command.createArg().setValue( filename );
+        return command;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.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/blame/TfsBlameCommand.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/blame/TfsBlameConsumer.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/blame/TfsBlameConsumer.java?rev=952808&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java Tue Jun  8 20:30:55 2010
@@ -0,0 +1,76 @@
+package org.apache.maven.scm.provider.tfs.command.blame;
+
+/*
+ * 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.command.blame.BlameLine;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.util.AbstractConsumer;
+import org.apache.regexp.RE;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class TfsBlameConsumer
+    extends AbstractConsumer
+{
+    private static final String TFS_TIMESTAMP_PATTERN = "MM/dd/yyyy";
+
+    /* 3 username 3/13/2006 line */
+    // TODO simplify
+
+    private static final String LINE_PATTERN = "([^ ]+)[ ]+([^ ]+)[ ]+([^ ]+)";
+
+    /**
+     * @see #LINE_PATTERN
+     */
+    private RE lineRegexp;
+
+    private List lines = new ArrayList();
+
+    public TfsBlameConsumer( ScmLogger logger )
+    {
+        super( logger );
+        lineRegexp = new RE( LINE_PATTERN );
+    }
+
+    public void consumeLine( String line )
+    {
+        if ( lineRegexp.match( line ) )
+        {
+            String revision = lineRegexp.getParen( 1 ).trim();
+            String author = lineRegexp.getParen( 2 ).trim();
+            String dateStr = lineRegexp.getParen( 3 ).trim();
+
+            Date date = parseDate( dateStr, null, TFS_TIMESTAMP_PATTERN );
+
+            lines.add( new BlameLine( date, revision, author ) );
+        }
+    }
+
+    public List getLines()
+    {
+        return lines;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.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/blame/TfsBlameConsumer.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java?rev=952808&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java Tue Jun  8 20:30:55 2010
@@ -0,0 +1,66 @@
+package org.apache.maven.scm.provider.tfs.command.blame;
+
+/*
+ * 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 junit.framework.Assert;
+import org.apache.maven.scm.ScmTestCase;
+import org.apache.maven.scm.command.blame.BlameLine;
+import org.apache.maven.scm.log.DefaultLog;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+/**
+ * @author Evgeny Mandrikov
+ */
+public class TfsBlameConsumerTest
+    extends ScmTestCase
+{
+
+    public void testConsumer()
+        throws Exception
+    {
+        File testFile = getTestFile( "src/test/resources/tfs/annotatelog.txt" );
+
+        TfsBlameConsumer consumer = new TfsBlameConsumer( new DefaultLog() );
+
+        FileInputStream fis = new FileInputStream( testFile );
+        BufferedReader in = new BufferedReader( new InputStreamReader( fis ) );
+        String s = in.readLine();
+        while ( s != null )
+        {
+            consumer.consumeLine( s );
+            s = in.readLine();
+        }
+
+        Assert.assertEquals( 3, consumer.getLines().size() );
+
+        BlameLine line1 = (BlameLine) consumer.getLines().get( 0 );
+        Assert.assertEquals( "3", line1.getRevision() );
+        Assert.assertEquals( "hatusr01", line1.getAuthor() );
+
+        BlameLine line2 = (BlameLine) consumer.getLines().get( 1 );
+        Assert.assertEquals( "4", line2.getRevision() );
+        Assert.assertEquals( "buckh", line2.getAuthor() );
+    }
+
+}

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

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

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt?rev=952808&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt Tue Jun  8 20:30:55 2010
@@ -0,0 +1,3 @@
+3 hatusr01 3/13/2006 public class Example {
+4 buckh    3/14/2006   int field;
+3 hatusr01 3/13/2006 }

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision