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/03/11 21:45:01 UTC

svn commit: r922015 [1/2] - in /maven/scm/trunk: maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/ maven-scm-api/src/main/java/org/apache/maven/scm/manager/ maven-scm-api/src/main/java/org/apache/maven/scm/provider/ maven-scm-providers/ma...

Author: olamy
Date: Thu Mar 11 20:44:59 2010
New Revision: 922015

URL: http://svn.apache.org/viewvc?rev=922015&view=rev
Log:
[SCM-532] add support for blame command
Submitted by Evgeny Mandrikov

Added:
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java   (with props)
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameConsumer.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/test/java/org/apache/maven/scm/provider/bazaar/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/test/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommandTckTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameConsumer.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommandTckTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitExeBlameCommandTckTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gittest/src/main/java/org/apache/maven/scm/provider/git/command/blame/GitBlameCommandTckTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/SvnBlameCommand.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/SvnBlameConsumer.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/blame/SvnExeBlameCommandTckTest.java   (with props)
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svntest/src/main/java/org/apache/maven/scm/provider/svn/command/blame/
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svntest/src/main/java/org/apache/maven/scm/provider/svn/command/blame/SvnBlameCommandTckTest.java   (with props)
    maven/scm/trunk/maven-scm-test/src/main/java/org/apache/maven/scm/tck/command/blame/
    maven/scm/trunk/maven-scm-test/src/main/java/org/apache/maven/scm/tck/command/blame/BlameCommandTckTest.java   (with props)
Modified:
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/AbstractScmManager.java
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/ScmManager.java
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java
    maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/BazaarScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/pom.xml
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/test/java/org/apache/maven/scm/provider/git/TestGitScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/TestSvnScmProvider.java
    maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java
    maven/scm/trunk/maven-scm-test/src/main/java/org/apache/maven/scm/manager/ScmManagerStub.java
    maven/scm/trunk/maven-scm-test/src/main/java/org/apache/maven/scm/provider/ScmProviderStub.java

Added: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,49 @@
+package org.apache.maven.scm.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.CommandParameter;
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.AbstractCommand;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public abstract class AbstractBlameCommand
+    extends AbstractCommand
+{
+    public abstract BlameScmResult executeBlameCommand( ScmProviderRepository repo, ScmFileSet workingDirectory,
+                                                        String filename )
+        throws ScmException;
+
+    protected ScmResult executeCommand( ScmProviderRepository repository, ScmFileSet workingDirectory,
+                                        CommandParameters parameters )
+        throws ScmException
+    {
+        String file = parameters.getString( CommandParameter.FILE );
+
+        return executeBlameCommand( repository, workingDirectory, file );
+    }
+}

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/AbstractBlameCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java (added)
+++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,85 @@
+package org.apache.maven.scm.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 java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class BlameLine
+    implements Serializable
+{
+    private Date date;
+
+    private String revision;
+
+    private String author;
+
+    public BlameLine( Date date, String revision, String author )
+    {
+        setDate( date );
+        setRevision( revision );
+        setAuthor( author );
+    }
+
+    public String getRevision()
+    {
+        return revision;
+    }
+
+    public void setRevision( String revision )
+    {
+        this.revision = revision;
+    }
+
+    public String getAuthor()
+    {
+        return author;
+    }
+
+    public void setAuthor( String author )
+    {
+        this.author = author;
+    }
+
+    public Date getDate()
+    {
+        if ( date != null )
+        {
+            return (Date) date.clone();
+        }
+        return null;
+    }
+
+    public void setDate( Date date )
+    {
+        if ( date != null )
+        {
+            this.date = new Date( date.getTime() );
+        }
+        else
+        {
+            this.date = null;
+        }
+    }
+}

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameLine.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java (added)
+++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,58 @@
+package org.apache.maven.scm.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.ScmResult;
+
+import java.util.List;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class BlameScmResult
+    extends ScmResult
+{
+    private List lines;
+
+    public BlameScmResult( String commandLine, List /* BlameLine */ lines )
+    {
+        this( commandLine, null, null, true );
+
+        this.lines = lines;
+    }
+
+    public BlameScmResult( String commandLine, String providerMessage, String commandOutput, boolean success )
+    {
+        super( commandLine, providerMessage, commandOutput, success );
+    }
+
+    public BlameScmResult( List /* BlameLine */ lines, ScmResult scmResult )
+    {
+        super( scmResult );
+
+        this.lines = lines;
+    }
+
+    public List /* BlameLine */ getLines()
+    {
+        return lines;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/command/blame/BlameScmResult.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/AbstractScmManager.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/AbstractScmManager.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/AbstractScmManager.java (original)
+++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/AbstractScmManager.java Thu Mar 11 20:44:59 2010
@@ -24,6 +24,7 @@ import org.apache.maven.scm.ScmException
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmVersion;
 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;
@@ -571,4 +572,11 @@ public abstract class AbstractScmManager
         return this.getProviderByRepository( repository ).update( repository, fileSet, version, lastUpdate,
                                                                   datePattern );
     }
+
+     /** {@inheritDoc} */
+    public BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
+        throws ScmException
+    {
+        return this.getProviderByRepository( repository ).blame( repository, fileSet, filename );
+    }
 }

Modified: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/ScmManager.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/ScmManager.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/ScmManager.java (original)
+++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/manager/ScmManager.java Thu Mar 11 20:44:59 2010
@@ -24,6 +24,7 @@ import org.apache.maven.scm.ScmException
 import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmVersion;
 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;
@@ -114,7 +115,7 @@ public interface ScmManager
      *
      * @param providerType           The provider type, eg. <code>cvs</code>
      * @param providerImplementation The provider implementation (the role-hint of the provider),
-     * eg. <code>cvs</code>, <code>cvs_native</code>
+     *                               eg. <code>cvs</code>, <code>cvs_native</code>
      */
     void setScmProviderImplementation( String providerType, String providerImplementation );
 
@@ -600,4 +601,17 @@ public interface ScmManager
     UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate,
                             String datePattern )
         throws ScmException;
+
+    /**
+     * Returns the blame of specified file
+     *
+     * @param repository the source control system
+     * @param fileSet    location of your local copy
+     * @param filename   file
+     * @return blame for specified file
+     * @since 1.4
+     * @throws ScmException if any
+     */
+    BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
+        throws ScmException;
 }

Modified: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java Thu Mar 11 20:44:59 2010
@@ -30,6 +30,7 @@ import org.apache.maven.scm.ScmRevision;
 import org.apache.maven.scm.ScmTagParameters;
 import org.apache.maven.scm.ScmVersion;
 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;
@@ -896,6 +897,26 @@ public abstract class AbstractScmProvide
         throw new NoSuchCommandScmException( "update" );
     }
 
+    /** {@inheritDoc} */
+    public BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
+        throws ScmException
+    {
+        login( repository, fileSet );
+
+        CommandParameters parameters = new CommandParameters();
+
+        parameters.setString( CommandParameter.FILE, filename);
+        
+        return blame( repository.getProviderRepository(), fileSet, parameters );
+    }
+
+    protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet,
+                                    CommandParameters parameters )
+        throws ScmException
+    {
+        throw new NoSuchCommandScmException( "blame" );
+    }
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------

Modified: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java Thu Mar 11 20:44:59 2010
@@ -26,6 +26,7 @@ import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.ScmTagParameters;
 import org.apache.maven.scm.ScmVersion;
 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;
@@ -156,11 +157,11 @@ public interface ScmProvider
      */
     BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName, String message )
         throws ScmException;
-    
+
     /**
      * Branch (or label in some systems) will create a branch of the source file with a certain
      * branch name
-     * 
+     *
      * @param repository the source control system
      * @param fileSet the files to branch. Implementations can also give the changes from the
      *            {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
@@ -171,7 +172,7 @@ public interface ScmProvider
      * @throws ScmException if any
      */
     BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName, ScmBranchParameters scmBranchParameters )
-        throws ScmException;    
+        throws ScmException;
 
     /**
      * Returns the changes that have happend in the source control system in a certain period of time.
@@ -600,7 +601,7 @@ public interface ScmProvider
      */
     TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, String message )
         throws ScmException;
-    
+
     /**
      * Tag (or label in some systems) will tag the source file with a certain tag
      *
@@ -612,9 +613,9 @@ public interface ScmProvider
      * @return
      * @since 1.2
      * @throws ScmException if any
-     */    
+     */
     TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, ScmTagParameters scmTagParameters )
-        throws ScmException;    
+        throws ScmException;
 
     /**
      * Updates the copy on the local machine with the changes in the repository
@@ -833,4 +834,17 @@ public interface ScmProvider
      */
     ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion version )
         throws ScmException;
+
+    /**
+     * Returns the blame of specified file
+     *
+     * @param repository the source control system
+     * @param fileSet    location of your local copy
+     * @param filename   file
+     * @since 1.4
+     * @return blame for specified file
+     * @throws ScmException
+     */
+    BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
+        throws ScmException;
 }

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/BazaarScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/BazaarScmProvider.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/BazaarScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/BazaarScmProvider.java Thu Mar 11 20:44:59 2010
@@ -24,6 +24,7 @@ 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.AddScmResult;
+import org.apache.maven.scm.command.blame.BlameScmResult;
 import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
 import org.apache.maven.scm.command.checkin.CheckInScmResult;
 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
@@ -36,6 +37,7 @@ import org.apache.maven.scm.provider.Abs
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.provider.bazaar.command.BazaarConstants;
 import org.apache.maven.scm.provider.bazaar.command.add.BazaarAddCommand;
+import org.apache.maven.scm.provider.bazaar.command.blame.BazaarBlameCommand;
 import org.apache.maven.scm.provider.bazaar.command.changelog.BazaarChangeLogCommand;
 import org.apache.maven.scm.provider.bazaar.command.checkin.BazaarCheckInCommand;
 import org.apache.maven.scm.provider.bazaar.command.checkout.BazaarCheckOutCommand;
@@ -227,4 +229,15 @@ public class BazaarScmProvider
 
         return (UpdateScmResult) command.execute( repository, fileSet, parameters );
     }
+
+    /** {@inheritDoc} */
+    protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        BazaarBlameCommand command = new BazaarBlameCommand();
+
+        command.setLogger( getLogger() );
+
+        return (BlameScmResult) command.execute( repository, fileSet, parameters );
+    }
 }
\ No newline at end of file

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommand.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommand.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,53 @@
+package org.apache.maven.scm.provider.bazaar.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.ScmResult;
+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.apache.maven.scm.provider.bazaar.BazaarUtils;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class BazaarBlameCommand
+    extends AbstractBlameCommand
+{
+    public static final String BLAME_CMD = "blame";
+
+    /**
+     * {@inheritDoc}
+     */
+    public BlameScmResult executeBlameCommand( ScmProviderRepository repo, ScmFileSet workingDirectory,
+                                               String filename )
+        throws ScmException
+    {
+        String[] cmd = new String[]{BLAME_CMD, "--all",  // Show annotations on all lines
+            "--long", // Show commit date in annotations
+            filename};
+        BazaarBlameConsumer consumer = new BazaarBlameConsumer( getLogger() );
+        ScmResult result = BazaarUtils.execute( consumer, getLogger(), workingDirectory.getBasedir(), cmd );
+        return new BlameScmResult( consumer.getLines(), result );
+    }
+}

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

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

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameConsumer.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameConsumer.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,69 @@
+package org.apache.maven.scm.provider.bazaar.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.ScmFileStatus;
+import org.apache.maven.scm.command.blame.BlameLine;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.bazaar.command.BazaarConsumer;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class BazaarBlameConsumer
+    extends BazaarConsumer
+{
+    private static final String BAZAAR_TIMESTAMP_PATTERN = "yyyyMMdd";
+
+    private List lines = new ArrayList();
+
+    public BazaarBlameConsumer( ScmLogger logger )
+    {
+        super( logger );
+    }
+
+    public void doConsume( ScmFileStatus status, String trimmedLine )
+    {
+        /*1   godin@godin 20100131*/
+        String annotation = trimmedLine.substring( 0, trimmedLine.indexOf( '|' ) ).trim();
+
+        String dateStr = annotation.substring( annotation.lastIndexOf( ' ' ) + 1 );
+        annotation = annotation.substring( 0, annotation.lastIndexOf( ' ' ) );
+
+        String author = annotation.substring( annotation.lastIndexOf( ' ' ) + 1 );
+        annotation = annotation.substring( 0, annotation.lastIndexOf( ' ' ) );
+
+        String revision = annotation.trim();
+
+        Date date = parseDate( dateStr, null, BAZAAR_TIMESTAMP_PATTERN );
+
+        lines.add( new BlameLine( date, revision, author ) );
+    }
+
+    public List getLines()
+    {
+        return lines;
+    }
+}

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

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

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/main/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameConsumer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/test/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommandTckTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/test/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommandTckTest.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/test/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommandTckTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/test/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommandTckTest.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,59 @@
+package org.apache.maven.scm.provider.bazaar.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.command.blame.BlameScmResult;
+import org.apache.maven.scm.provider.bazaar.BazaarRepoUtils;
+import org.apache.maven.scm.tck.command.blame.BlameCommandTckTest;
+
+import java.util.List;
+
+/**
+ * @author Evgeny Mandrikov
+ */
+public class BazaarBlameCommandTckTest
+    extends BlameCommandTckTest
+{
+    public String getScmUrl()
+        throws Exception
+    {
+        return BazaarRepoUtils.getScmUrl();
+    }
+
+    public void initRepo()
+        throws Exception
+    {
+        BazaarRepoUtils.initRepo();
+    }
+
+    protected boolean isTestDateTime()
+    {
+        return false;
+    }
+
+    protected void verifyResult( BlameScmResult result )
+    {
+        List lines = result.getLines();
+        assertEquals( "Expected 1 line in blame", 1, lines.size() );
+        BlameLine line = (BlameLine) lines.get( 0 );
+        assertEquals( "1", line.getRevision() );
+    }
+}

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

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

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-bazaar/src/test/java/org/apache/maven/scm/provider/bazaar/command/blame/BazaarBlameCommandTckTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java Thu Mar 11 20:44:59 2010
@@ -27,6 +27,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.changelog.ChangeLogScmResult;
 import org.apache.maven.scm.command.checkin.CheckInScmResult;
 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
@@ -38,6 +39,7 @@ import org.apache.maven.scm.command.upda
 import org.apache.maven.scm.provider.AbstractScmProvider;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.provider.hg.command.add.HgAddCommand;
+import org.apache.maven.scm.provider.hg.command.blame.HgBlameCommand;
 import org.apache.maven.scm.provider.hg.command.changelog.HgChangeLogCommand;
 import org.apache.maven.scm.provider.hg.command.checkin.HgCheckInCommand;
 import org.apache.maven.scm.provider.hg.command.checkout.HgCheckOutCommand;
@@ -285,4 +287,16 @@ public class HgScmProvider
 
         return (UpdateScmResult) command.execute( repository, fileSet, parameters );
     }
+
+    /** {@inheritDoc} */
+    protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet,
+                                    CommandParameters parameters )
+        throws ScmException
+    {
+        HgBlameCommand command = new HgBlameCommand();
+
+        command.setLogger( getLogger() );
+
+        return (BlameScmResult) command.execute( repository, fileSet, parameters );
+    }
 }

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommand.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommand.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,54 @@
+package org.apache.maven.scm.provider.hg.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.ScmResult;
+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.apache.maven.scm.provider.hg.HgUtils;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class HgBlameCommand
+    extends AbstractBlameCommand
+{
+    public static final String BLAME_CMD = "blame";
+
+    /**
+     * {@inheritDoc}
+     */
+    public BlameScmResult executeBlameCommand( ScmProviderRepository repo, ScmFileSet workingDirectory,
+                                               String filename )
+        throws ScmException
+    {
+        String[] cmd = new String[]{BLAME_CMD, "--user",   // list the author
+            "--date",   // list the date
+            "--number", // list the revision number
+            filename};
+        HgBlameConsumer consumer = new HgBlameConsumer( getLogger() );
+        ScmResult result = HgUtils.execute( consumer, getLogger(), workingDirectory.getBasedir(), cmd );
+        return new BlameScmResult( consumer.getLines(), result );
+    }
+}

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

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

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameConsumer.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameConsumer.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,69 @@
+package org.apache.maven.scm.provider.hg.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.ScmFileStatus;
+import org.apache.maven.scm.command.blame.BlameLine;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class HgBlameConsumer
+    extends HgConsumer
+{
+    private List lines = new ArrayList();
+
+    private static final String HG_TIMESTAMP_PATTERN = "EEE MMM dd HH:mm:ss yyyy Z";
+
+    public HgBlameConsumer( ScmLogger logger )
+    {
+        super( logger );
+
+    }
+
+    public void doConsume( ScmFileStatus status, String trimmedLine )
+    {
+        /* godin 0 Sun Jan 31 03:04:54 2010 +0300 */
+        String annotation = trimmedLine.substring( 0, trimmedLine.indexOf( ": " ) );
+
+        String author = annotation.substring( 0, annotation.indexOf( ' ' ) );
+        annotation = annotation.substring( annotation.indexOf( ' ' ) + 1 );
+
+        String revision = annotation.substring( 0, annotation.indexOf( ' ' ) );
+        annotation = annotation.substring( annotation.indexOf( ' ' ) + 1 );
+
+        String dateStr = annotation;
+        Date dateTime = parseDate( dateStr, null, HG_TIMESTAMP_PATTERN );
+
+        lines.add( new BlameLine( dateTime, revision, author ) );
+    }
+
+    public List getLines()
+    {
+        return lines;
+    }
+}

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

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

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameConsumer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommandTckTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommandTckTest.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommandTckTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommandTckTest.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,54 @@
+package org.apache.maven.scm.provider.hg.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.command.blame.BlameScmResult;
+import org.apache.maven.scm.provider.hg.HgRepoUtils;
+import org.apache.maven.scm.tck.command.blame.BlameCommandTckTest;
+
+import java.util.List;
+
+/**
+ * @author Evgeny Mandrikov
+ */
+public class HgBlameCommandTckTest
+    extends BlameCommandTckTest
+{
+    public String getScmUrl()
+        throws Exception
+    {
+        return HgRepoUtils.getScmUrl();
+    }
+
+    public void initRepo()
+        throws Exception
+    {
+        HgRepoUtils.initRepo();
+    }
+
+    protected void verifyResult( BlameScmResult result )
+    {
+        List lines = result.getLines();
+        assertEquals( "Expected 1 line in blame", 1, lines.size() );
+        BlameLine line = (BlameLine) lines.get( 0 );
+        assertEquals( "0", line.getRevision() );
+    }
+}

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

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

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/blame/HgBlameCommandTckTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/pom.xml
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/pom.xml?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/pom.xml (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/pom.xml Thu Mar 11 20:44:59 2010
@@ -35,6 +35,11 @@
 
   <dependencies>
     <dependency>
+      <groupId>regexp</groupId>
+      <artifactId>regexp</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.maven.scm</groupId>
       <artifactId>maven-scm-provider-cvstest</artifactId>
       <scope>test</scope>

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,62 @@
+package org.apache.maven.scm.provider.cvslib.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.apache.maven.scm.provider.cvslib.command.CvsCommand;
+import org.apache.maven.scm.provider.cvslib.command.CvsCommandUtils;
+import org.apache.maven.scm.provider.cvslib.repository.CvsScmProviderRepository;
+import org.codehaus.plexus.util.cli.Commandline;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public abstract class AbsrtactCvsBlameCommand
+    extends AbstractBlameCommand
+    implements CvsCommand
+{
+    /**
+     * {@inheritDoc}
+     */
+    public BlameScmResult executeBlameCommand( ScmProviderRepository repo, ScmFileSet fileSet, String filename )
+        throws ScmException
+    {
+        CvsScmProviderRepository repository = (CvsScmProviderRepository) repo;
+
+        Commandline cl = CvsCommandUtils.getBaseCommand( "annotate", repository, fileSet );
+        cl.createArg().setValue( filename );
+
+        if ( getLogger().isInfoEnabled() )
+        {
+            getLogger().info( "Executing: " + cl );
+            getLogger().info( "Working directory: " + cl.getWorkingDirectory().getAbsolutePath() );
+        }
+
+        return executeCvsCommand( cl, repository );
+    }
+
+    protected abstract BlameScmResult executeCvsCommand( Commandline cl, CvsScmProviderRepository repository )
+        throws ScmException;
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/AbsrtactCvsBlameCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,85 @@
+package org.apache.maven.scm.provider.cvslib.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 java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+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;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class CvsBlameConsumer
+    extends AbstractConsumer
+{
+    private static final String CVS_TIMESTAMP_PATTERN = "dd-MMM-yy";
+
+    /* 1.1          (tor      24-Mar-03): */
+
+    private static final String LINE_PATTERN = "(.*)\\((.*)\\s+(.*)\\)";
+
+    /**
+     * @see #LINE_PATTERN
+     */
+    private RE lineRegexp;
+
+    private List lines = new ArrayList();
+
+    public CvsBlameConsumer( ScmLogger logger )
+    {
+        super( logger );
+
+        lineRegexp = new RE( LINE_PATTERN );
+    }
+
+    public void consumeLine( String line )
+    {
+        if (line != null && line.indexOf( ":" ) > 0 )
+        {
+            String annotation = line.substring( 0, line.indexOf( ':' ) );
+            if ( lineRegexp.match( annotation ) )
+            {
+                String revision = lineRegexp.getParen( 1 ).trim();
+                String author = lineRegexp.getParen( 2 ).trim();
+                String dateTimeStr = lineRegexp.getParen( 3 ).trim();
+
+                Date dateTime = parseDate( dateTimeStr, null, CVS_TIMESTAMP_PATTERN );
+                getLines().add( new BlameLine( dateTime, revision, author ) );
+
+                if ( getLogger().isDebugEnabled() )
+                {
+                    getLogger().debug( author + " " + dateTimeStr );
+                }
+            }
+        }
+    }
+
+    public List getLines()
+    {
+        return lines;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/blame/CvsBlameConsumer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,61 @@
+package org.apache.maven.scm.provider.cvslib.cvsexe.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.command.blame.BlameScmResult;
+import org.apache.maven.scm.provider.cvslib.command.blame.AbsrtactCvsBlameCommand;
+import org.apache.maven.scm.provider.cvslib.command.blame.CvsBlameConsumer;
+import org.apache.maven.scm.provider.cvslib.repository.CvsScmProviderRepository;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class CvsExeBlameCommand
+    extends AbsrtactCvsBlameCommand
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected BlameScmResult executeCvsCommand( Commandline cl, CvsScmProviderRepository repository )
+        throws ScmException
+    {
+        CvsBlameConsumer consumer = new CvsBlameConsumer( 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 cvs command.", ex );
+        }
+        if ( exitCode != 0 )
+        {
+            return new BlameScmResult( cl.toString(), "The cvs command failed.", stderr.getOutput(), false );
+        }
+        return new BlameScmResult( cl.toString(), consumer.getLines() );
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsexe/src/main/java/org/apache/maven/scm/provider/cvslib/cvsexe/command/blame/CvsExeBlameCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,75 @@
+package org.apache.maven.scm.provider.cvslib.cvsjava.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.BlameScmResult;
+import org.apache.maven.scm.provider.cvslib.command.blame.AbsrtactCvsBlameCommand;
+import org.apache.maven.scm.provider.cvslib.command.blame.CvsBlameConsumer;
+import org.apache.maven.scm.provider.cvslib.cvsjava.util.CvsConnection;
+import org.apache.maven.scm.provider.cvslib.cvsjava.util.CvsLogListener;
+import org.apache.maven.scm.provider.cvslib.repository.CvsScmProviderRepository;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+
+/**
+ * @author Evgeny Mandrikov
+ * @since 1.4
+ */
+public class CvsJavaBlameCommand
+    extends AbsrtactCvsBlameCommand
+{
+    /**
+     * {@inheritDoc}
+     */
+    protected BlameScmResult executeCvsCommand( Commandline cl, CvsScmProviderRepository repository )
+    {
+        CvsLogListener logListener = new CvsLogListener();
+        CvsBlameConsumer consumer = new CvsBlameConsumer( getLogger() );
+        try
+        {
+            boolean isSuccess =
+                CvsConnection.processCommand( cl.getArguments(), cl.getWorkingDirectory().getAbsolutePath(),
+                                              logListener, getLogger() );
+            if ( !isSuccess )
+            {
+                return new BlameScmResult( cl.toString(), "The cvs command failed.", logListener.getStderr().toString(),
+                                           false );
+            }
+            BufferedReader stream = new BufferedReader(
+                new InputStreamReader( new ByteArrayInputStream( logListener.getStdout().toString().getBytes() ) ) );
+            String line;
+            while ( ( line = stream.readLine() ) != null )
+            {
+                consumer.consumeLine( line );
+            }
+        }
+        catch ( Exception e )
+        {
+            getLogger().error( e );
+            return new BlameScmResult( cl.toString(), "The cvs command failed.", logListener.getStdout().toString(),
+                                       false );
+        }
+
+        return new BlameScmResult( cl.toString(), consumer.getLines() );
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvsjava/src/main/java/org/apache/maven/scm/provider/cvslib/cvsjava/command/blame/CvsJavaBlameCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/main/java/org/apache/maven/scm/provider/git/AbstractGitScmProvider.java Thu Mar 11 20:44:59 2010
@@ -24,6 +24,7 @@ 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.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;
@@ -310,4 +311,15 @@ public abstract class AbstractGitScmProv
         return (GitInfoScmResult) executeCommand( cmd, repository, fileSet, parameters );
     }
 
+    /** {@inheritDoc} */
+    protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        GitCommand cmd = getBlameCommand();
+
+        return (BlameScmResult) executeCommand( cmd, repository, fileSet, parameters );
+    }
+
+    protected abstract GitCommand getBlameCommand();
+
 }

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/test/java/org/apache/maven/scm/provider/git/TestGitScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/test/java/org/apache/maven/scm/provider/git/TestGitScmProvider.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/test/java/org/apache/maven/scm/provider/git/TestGitScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-git-commons/src/test/java/org/apache/maven/scm/provider/git/TestGitScmProvider.java Thu Mar 11 20:44:59 2010
@@ -91,6 +91,11 @@ public class TestGitScmProvider
         return null;
     }
 
+    protected GitCommand getBlameCommand()
+    {
+        return null;
+    }
+
     protected String getRepositoryURL( File path )
     {
         return null;

Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java?rev=922015&r1=922014&r2=922015&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java (original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/GitExeScmProvider.java Thu Mar 11 20:44:59 2010
@@ -26,6 +26,7 @@ import org.apache.maven.scm.provider.git
 import org.apache.maven.scm.provider.git.command.info.GitInfoItem;
 import org.apache.maven.scm.provider.git.command.info.GitInfoScmResult;
 import org.apache.maven.scm.provider.git.gitexe.command.add.GitAddCommand;
+import org.apache.maven.scm.provider.git.gitexe.command.blame.GitBlameCommand;
 import org.apache.maven.scm.provider.git.gitexe.command.branch.GitBranchCommand;
 import org.apache.maven.scm.provider.git.gitexe.command.changelog.GitChangeLogCommand;
 import org.apache.maven.scm.provider.git.gitexe.command.checkin.GitCheckInCommand;
@@ -127,6 +128,12 @@ public class GitExeScmProvider
     }
 
     /** {@inheritDoc} */
+    protected GitCommand getBlameCommand()
+    {
+        return new GitBlameCommand();
+    }
+
+    /** {@inheritDoc} */
     protected String getRepositoryURL( File path )
         throws ScmException
     {

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,68 @@
+package org.apache.maven.scm.provider.git.gitexe.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.apache.maven.scm.provider.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+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 GitBlameCommand
+    extends AbstractBlameCommand
+    implements GitCommand
+{
+    /**
+     * {@inheritDoc}
+     */
+    public BlameScmResult executeBlameCommand( ScmProviderRepository repo, ScmFileSet workingDirectory,
+                                               String filename )
+        throws ScmException
+    {
+        Commandline cl = createCommandLine( workingDirectory.getBasedir(), filename );
+        GitBlameConsumer consumer = new GitBlameConsumer( getLogger() );
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        int exitCode = GitCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            throw new UnsupportedOperationException();
+        }
+        return new BlameScmResult( cl.toString(), consumer.getLines() );
+    }
+
+    public static Commandline createCommandLine( File workingDirectory, String filename )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "blame" );
+        cl.createArg().setValue( "-c" );
+        cl.createArg().setValue( filename );
+        return cl;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,78 @@
+package org.apache.maven.scm.provider.git.gitexe.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 GitBlameConsumer
+    extends AbstractConsumer
+{
+    private static final String GIT_TIMESTAMP_PATTERN = "yyyy-MM-dd HH:mm:ss Z";
+
+    private static final String LINE_PATTERN = "(.*)\t\\((.*)\t(.*)\t.*\\)";
+
+    /**
+     * @see #LINE_PATTERN
+     */
+    private RE lineRegexp;
+
+    private List lines = new ArrayList();
+
+    public GitBlameConsumer( ScmLogger logger )
+    {
+        super( logger );
+
+        lineRegexp = new RE( LINE_PATTERN );
+    }
+
+    public void consumeLine( String line )
+    {
+        if ( lineRegexp.match( line ) )
+        {
+            String revision = lineRegexp.getParen( 1 );
+            String author = lineRegexp.getParen( 2 );
+            String dateTimeStr = lineRegexp.getParen( 3 );
+
+            Date dateTime = parseDate( dateTimeStr, null, GIT_TIMESTAMP_PATTERN );
+            getLines().add( new BlameLine( dateTime, revision, author ) );
+
+            if ( getLogger().isDebugEnabled() )
+            {
+                getLogger().debug( author + " " + dateTimeStr );
+            }
+        }
+    }
+
+    public List getLines()
+    {
+        return lines;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitBlameConsumer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitExeBlameCommandTckTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitExeBlameCommandTckTest.java?rev=922015&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitExeBlameCommandTckTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitExeBlameCommandTckTest.java Thu Mar 11 20:44:59 2010
@@ -0,0 +1,55 @@
+package org.apache.maven.scm.provider.git.gitexe.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.command.blame.BlameScmResult;
+import org.apache.maven.scm.provider.git.GitScmTestUtils;
+import org.apache.maven.scm.provider.git.command.blame.GitBlameCommandTckTest;
+
+import java.util.List;
+
+/**
+ * @author Evgeny Mandrikov
+ */
+public class GitExeBlameCommandTckTest
+    extends GitBlameCommandTckTest
+{
+    public String getScmUrl()
+        throws Exception
+    {
+        return GitScmTestUtils.getScmUrl( getRepositoryRoot(), "git" );
+    }
+
+    public void testBlameCommand()
+        throws Exception
+    {
+        super.testBlameCommand();
+    }
+
+    protected void verifyResult( BlameScmResult result )
+    {
+        List lines = result.getLines();
+        assertEquals( "Expected 1 line in blame", 1, lines.size() );
+        BlameLine line = (BlameLine) lines.get( 0 );
+        assertEquals( "Mark Struberg", line.getAuthor() );
+        assertEquals( "92f139df", line.getRevision() );
+    }
+}

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

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

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/blame/GitExeBlameCommandTckTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain