Author: olamy Date: Tue Jun 8 20:30:55 2010 New Revision: 952808 URL: http://svn.apache.org/viewvc?rev=952808&view=rev Log: [SCM-545] Add blame command to TFS provider Submitted by Evgeny Mandrikov
Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java (with props) maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java (with props) maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java (with props) maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt (with props) Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java Modified: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java?rev=952808&r1=952807&r2=952808&view=diff ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java (original) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/TfsScmProvider.java Tue Jun 8 20:30:55 2010 @@ -25,6 +25,7 @@ import org.apache.maven.scm.CommandParam import org.apache.maven.scm.ScmException; import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.command.add.AddScmResult; +import org.apache.maven.scm.command.blame.BlameScmResult; import org.apache.maven.scm.command.branch.BranchScmResult; import org.apache.maven.scm.command.changelog.ChangeLogScmResult; import org.apache.maven.scm.command.checkin.CheckInScmResult; @@ -50,6 +51,7 @@ import org.apache.maven.scm.provider.tfs import org.apache.maven.scm.provider.tfs.command.TfsTagCommand; import org.apache.maven.scm.provider.tfs.command.TfsUnEditCommand; import org.apache.maven.scm.provider.tfs.command.TfsUpdateCommand; +import org.apache.maven.scm.provider.tfs.command.blame.TfsBlameCommand; import org.apache.maven.scm.repository.ScmRepositoryException; /** @@ -222,6 +224,14 @@ public class TfsScmProvider return (ListScmResult) command.execute( repository, fileSet, parameters ); } + protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) + throws ScmException + { + TfsBlameCommand command = new TfsBlameCommand(); + command.setLogger( getLogger() ); + return (BlameScmResult) command.execute( repository, fileSet, parameters ); + } + protected DiffScmResult diff( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) throws ScmException { Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java?rev=952808&view=auto ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java (added) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java Tue Jun 8 20:30:55 2010 @@ -0,0 +1,75 @@ +package org.apache.maven.scm.provider.tfs.command.blame; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.scm.ScmException; +import org.apache.maven.scm.ScmFileSet; +import org.apache.maven.scm.command.blame.AbstractBlameCommand; +import org.apache.maven.scm.command.blame.BlameScmResult; +import org.apache.maven.scm.provider.ScmProviderRepository; +import org.codehaus.plexus.util.cli.CommandLineException; +import org.codehaus.plexus.util.cli.CommandLineUtils; +import org.codehaus.plexus.util.cli.Commandline; + +import java.io.File; + +/** + * @author Evgeny Mandrikov + * @since 1.4 + */ +public class TfsBlameCommand + extends AbstractBlameCommand +{ + public BlameScmResult executeBlameCommand( ScmProviderRepository repo, ScmFileSet workingDirectory, String filename ) + throws ScmException + { + Commandline cl = createCommandLine( workingDirectory.getBasedir(), filename ); + + TfsBlameConsumer consumer = new TfsBlameConsumer( getLogger() ); + CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer(); + + int exitCode; + try + { + exitCode = CommandLineUtils.executeCommandLine( cl, consumer, stderr ); + } + catch ( CommandLineException ex ) + { + throw new ScmException( "Error while executing command.", ex ); + } + if ( exitCode != 0 ) + { + return new BlameScmResult( cl.toString(), "The tfs command failed.", stderr.getOutput(), false ); + } + + return new BlameScmResult( cl.toString(), consumer.getLines() ); + } + + public static Commandline createCommandLine( File workingDirectory, String filename ) + { + Commandline command = new Commandline(); + command.setWorkingDirectory( workingDirectory ); + command.setExecutable( "tfpt" ); + command.createArg().setValue( "annotate" ); + command.createArg().setValue( "/noprompt" ); + command.createArg().setValue( filename ); + return command; + } +} Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameCommand.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java?rev=952808&view=auto ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java (added) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java Tue Jun 8 20:30:55 2010 @@ -0,0 +1,76 @@ +package org.apache.maven.scm.provider.tfs.command.blame; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.scm.command.blame.BlameLine; +import org.apache.maven.scm.log.ScmLogger; +import org.apache.maven.scm.util.AbstractConsumer; +import org.apache.regexp.RE; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author Evgeny Mandrikov + * @since 1.4 + */ +public class TfsBlameConsumer + extends AbstractConsumer +{ + private static final String TFS_TIMESTAMP_PATTERN = "MM/dd/yyyy"; + + /* 3 username 3/13/2006 line */ + // TODO simplify + + private static final String LINE_PATTERN = "([^ ]+)[ ]+([^ ]+)[ ]+([^ ]+)"; + + /** + * @see #LINE_PATTERN + */ + private RE lineRegexp; + + private List lines = new ArrayList(); + + public TfsBlameConsumer( ScmLogger logger ) + { + super( logger ); + lineRegexp = new RE( LINE_PATTERN ); + } + + public void consumeLine( String line ) + { + if ( lineRegexp.match( line ) ) + { + String revision = lineRegexp.getParen( 1 ).trim(); + String author = lineRegexp.getParen( 2 ).trim(); + String dateStr = lineRegexp.getParen( 3 ).trim(); + + Date date = parseDate( dateStr, null, TFS_TIMESTAMP_PATTERN ); + + lines.add( new BlameLine( date, revision, author ) ); + } + } + + public List getLines() + { + return lines; + } +} Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/main/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumer.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java?rev=952808&view=auto ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java (added) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java Tue Jun 8 20:30:55 2010 @@ -0,0 +1,66 @@ +package org.apache.maven.scm.provider.tfs.command.blame; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import junit.framework.Assert; +import org.apache.maven.scm.ScmTestCase; +import org.apache.maven.scm.command.blame.BlameLine; +import org.apache.maven.scm.log.DefaultLog; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; + +/** + * @author Evgeny Mandrikov + */ +public class TfsBlameConsumerTest + extends ScmTestCase +{ + + public void testConsumer() + throws Exception + { + File testFile = getTestFile( "src/test/resources/tfs/annotatelog.txt" ); + + TfsBlameConsumer consumer = new TfsBlameConsumer( new DefaultLog() ); + + FileInputStream fis = new FileInputStream( testFile ); + BufferedReader in = new BufferedReader( new InputStreamReader( fis ) ); + String s = in.readLine(); + while ( s != null ) + { + consumer.consumeLine( s ); + s = in.readLine(); + } + + Assert.assertEquals( 3, consumer.getLines().size() ); + + BlameLine line1 = (BlameLine) consumer.getLines().get( 0 ); + Assert.assertEquals( "3", line1.getRevision() ); + Assert.assertEquals( "hatusr01", line1.getAuthor() ); + + BlameLine line2 = (BlameLine) consumer.getLines().get( 1 ); + Assert.assertEquals( "4", line2.getRevision() ); + Assert.assertEquals( "buckh", line2.getAuthor() ); + } + +} Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/java/org/apache/maven/scm/provider/tfs/command/blame/TfsBlameConsumerTest.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt?rev=952808&view=auto ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt (added) +++ maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt Tue Jun 8 20:30:55 2010 @@ -0,0 +1,3 @@ +3 hatusr01 3/13/2006 public class Example { +4 buckh 3/14/2006 int field; +3 hatusr01 3/13/2006 } Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-provider-tfs/src/test/resources/tfs/annotatelog.txt ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision