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