Author: olamy
Date: Sun Apr 18 15:13:00 2010
New Revision: 935351

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

Added:
    
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/
    
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameCommand.java
   (with props)
    
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumer.java
   (with props)
    
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/blame/
    
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumerTest.java
   (with props)
    
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/resources/clearcase/blame/
Modified:
    maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/pom.xml
    
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java

Modified: 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/pom.xml?rev=935351&r1=935350&r2=935351&view=diff
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/pom.xml 
(original)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/pom.xml 
Sun Apr 18 15:13:00 2010
@@ -33,6 +33,13 @@
   <name>Maven SCM Clearcase Provider</name>
   <description>SCM Provider implementation for Clearcase 
(http://www-306.ibm.com/software/awdtools/clearcase/).</description>
 
+  <dependencies>
+    <dependency>
+      <groupId>regexp</groupId>
+      <artifactId>regexp</artifactId>
+    </dependency>
+  </dependencies>
+
   <build>
     <plugins>
       <plugin>

Modified: 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java?rev=935351&r1=935350&r2=935351&view=diff
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java
 (original)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/ClearCaseScmProvider.java
 Sun Apr 18 15:13:00 2010
@@ -22,6 +22,7 @@ package org.apache.maven.scm.provider.cl
 import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
+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;
@@ -31,6 +32,7 @@ import org.apache.maven.scm.command.tag.
 import org.apache.maven.scm.command.update.UpdateScmResult;
 import org.apache.maven.scm.provider.AbstractScmProvider;
 import org.apache.maven.scm.provider.ScmProviderRepository;
+import 
org.apache.maven.scm.provider.clearcase.command.blame.ClearCaseBlameCommand;
 import 
org.apache.maven.scm.provider.clearcase.command.changelog.ClearCaseChangeLogCommand;
 import 
org.apache.maven.scm.provider.clearcase.command.checkin.ClearCaseCheckInCommand;
 import 
org.apache.maven.scm.provider.clearcase.command.checkout.ClearCaseCheckOutCommand;
@@ -165,4 +167,15 @@ public class ClearCaseScmProvider
 
         return (EditScmResult) command.execute( repository, fileSet, 
parameters );
     }
+
+    /** {...@inheritdoc} */
+    protected BlameScmResult blame( ScmProviderRepository repository, 
ScmFileSet fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        ClearCaseBlameCommand command = new ClearCaseBlameCommand();
+
+        command.setLogger( getLogger() );
+
+        return (BlameScmResult) command.execute( repository, fileSet, 
parameters );
+    }
 }

Added: 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameCommand.java
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameCommand.java?rev=935351&view=auto
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameCommand.java
 (added)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameCommand.java
 Sun Apr 18 15:13:00 2010
@@ -0,0 +1,103 @@
+package org.apache.maven.scm.provider.clearcase.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.clearcase.command.ClearCaseCommand;
+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 Jérémie Lagarde
+ */
+public class ClearCaseBlameCommand
+    extends AbstractBlameCommand
+    implements ClearCaseCommand
+{
+
+    public BlameScmResult executeBlameCommand( ScmProviderRepository repo, 
ScmFileSet workingDirectory,
+                                               String filename )
+        throws ScmException
+    {
+
+        if ( getLogger().isDebugEnabled() )
+        {
+            getLogger().debug( "executing blame command..." );
+        }
+        Commandline cl = createCommandLine( workingDirectory.getBasedir(), 
filename );
+
+        ClearCaseBlameConsumer consumer = new ClearCaseBlameConsumer( 
getLogger() );
+
+        CommandLineUtils.StringStreamConsumer stderr = new 
CommandLineUtils.StringStreamConsumer();
+
+        int exitCode;
+
+        try
+        {
+            if ( getLogger().isDebugEnabled() )
+            {
+                getLogger().debug( "Executing: " + 
cl.getWorkingDirectory().getAbsolutePath() + ">>" + cl.toString() );
+            }
+            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 cleartool 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.setExecutable( "cleartool" );
+        command.createArg().setValue( "annotate" );
+
+        command.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+
+        StringBuffer format = new StringBuffer();
+        format.append( "VERSION:%Ln@@@" );
+        format.append( "USER:%u@@@" );
+        format.append( "DATE:%Nd@@@" );
+
+        command.createArg().setValue( "-out" );
+        command.createArg().setValue( "-" );
+        command.createArg().setValue( "-fmt" );
+        command.createArg().setValue( format.toString() );
+        command.createArg().setValue( "-nheader" );
+        command.createArg().setValue( "-f" );
+        command.createArg().setValue( filename );
+
+        return command;
+    }
+}

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

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

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

Added: 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumer.java
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumer.java?rev=935351&view=auto
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumer.java
 (added)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumer.java
 Sun Apr 18 15:13:00 2010
@@ -0,0 +1,74 @@
+package org.apache.maven.scm.provider.clearcase.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 Jérémie Lagarde
+ */
+public class ClearCaseBlameConsumer
+    extends AbstractConsumer
+{
+
+    private static final String CLEARCASE_TIMESTAMP_PATTERN = 
"yyyyMMdd.HHmmss";
+
+    private static final String LINE_PATTERN = 
"VERSION:(.*)@@@USER:(.*)@@@DATE:(.*)@@@(.*)";
+
+    private RE lineRegexp;
+
+    private List lines = new ArrayList();
+
+    public ClearCaseBlameConsumer( 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, 
CLEARCASE_TIMESTAMP_PATTERN );
+            lines.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-provider-clearcase/src/main/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

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

Added: 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumerTest.java
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumerTest.java?rev=935351&view=auto
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumerTest.java
 (added)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-provider-clearcase/src/test/java/org/apache/maven/scm/provider/clearcase/command/blame/ClearCaseBlameConsumerTest.java
 Sun Apr 18 15:13:00 2010
@@ -0,0 +1,68 @@
+package org.apache.maven.scm.provider.clearcase.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.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * @author Jérémie Lagarde
+ */
+public class ClearCaseBlameConsumerTest
+    extends ScmTestCase
+{
+
+    public void testConsumer()
+        throws IOException
+    {
+        InputStream inputStream = getResourceAsStream( 
"/clearcase/blame/clearcase.log" );
+
+        BufferedReader in = new BufferedReader( new InputStreamReader( 
inputStream ) );
+
+        String s = in.readLine();
+
+        ClearCaseBlameConsumer consumer = new ClearCaseBlameConsumer( new 
DefaultLog() );
+
+        while ( s != null )
+        {
+            consumer.consumeLine( s );
+
+            s = in.readLine();
+        }
+
+        Assert.assertEquals( 12, consumer.getLines().size() );
+
+        BlameLine line1 = (BlameLine) consumer.getLines().get( 0 );
+        Assert.assertEquals( "7", line1.getRevision() );
+        Assert.assertEquals( "Jeremie Lagarde", line1.getAuthor() );
+
+        BlameLine line12 = (BlameLine) consumer.getLines().get( 11 );
+        Assert.assertEquals( "5", line12.getRevision() );
+        Assert.assertEquals( "Evgeny Mandrikov", line12.getAuthor() );
+    }
+
+}
\ No newline at end of file

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

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

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


Reply via email to