/**
* Copyright (c) 2010 Perforce Software. All rights reserved.
*/
package com.perforce.maven.scm.provider.p4.command.blame;
import java.util.List;
import java.util.Map;
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.BlameLine;
import org.apache.maven.scm.command.blame.BlameScmResult;
import org.apache.maven.scm.provider.ScmProviderRepository;
import com.perforce.maven.scm.provider.p4.command.P4ClientExecutor;
import com.perforce.maven.scm.provider.p4.command.P4Command;
import com.perforce.maven.scm.provider.p4.command.P4Executor;
import com.perforce.maven.scm.provider.p4.repository.P4ScmProviderRepository;
import com.perforce.p4java.core.file.FileSpecBuilder;
import com.perforce.p4java.core.file.IFileAnnotation;
import com.perforce.p4java.core.file.IFileRevisionData;
import com.perforce.p4java.core.file.IFileSpec;
import com.perforce.p4java.exception.P4JavaException;
import com.perforce.p4java.option.server.GetFileAnnotationsOptions;
import com.perforce.p4java.option.server.GetRevisionHistoryOptions;
/**
* Use Perforce annotate command to get file lines and their revisions. Use
* Perforce filelog command to get revision history of files.
*/
public class P4BlameCommand extends AbstractBlameCommand implements P4Command {
/** The Constant command. */
public static final String command = "Perforce annotate command";
/**
* @see org.apache.maven.scm.command.blame.AbstractBlameCommand#executeBlameCommand
* (org.apache.maven.scm.provider.ScmProviderRepository,
* org.apache.maven.scm.ScmFileSet, java.lang.String)
*/
public BlameScmResult executeBlameCommand(ScmProviderRepository repo,
ScmFileSet workingDirectory, String filename) throws ScmException {
P4BlameResult p4Result = new P4BlameResult();
P4ScmProviderRepository p4Repo = (P4ScmProviderRepository) repo;
P4ClientExecutor executor = new P4ClientExecutor(p4Repo,
workingDirectory, getLogger());
List<IFileSpec> fileSpecs = FileSpecBuilder
.makeFileSpecList(new String[] { P4Executor
.encodeWildcards(filename) });
try {
// Get file annotations
GetFileAnnotationsOptions getFileAnnotationsOptions = new GetFileAnnotationsOptions();
List<IFileAnnotation> fileAnnotations = executor.getServer()
.getFileAnnotations(fileSpecs, getFileAnnotationsOptions);
// Process the file annotations as blame lines
p4Result.processBlameLines(fileAnnotations);
// Get revision history
GetRevisionHistoryOptions getRevisionHistoryOptions = new GetRevisionHistoryOptions();
Map<IFileSpec, List<IFileRevisionData>> revisionMap = executor
.getServer().getRevisionHistory(fileSpecs,
getRevisionHistoryOptions);
// Process the revision data map
p4Result.processRevisionHistory(revisionMap);
} catch (P4JavaException e) {
if (getLogger().isErrorEnabled()) {
getLogger().error(e);
}
throw new ScmException(e.getLocalizedMessage(), e);
}
// Combine the results
List<BlameLine> lines = p4Result.getBlameLines();
for (int i = 0; i < lines.size(); i++) {
BlameLine line = (BlameLine) lines.get(i);
String revision = line.getRevision();
line.setAuthor(p4Result.getAuthor(revision));
line.setDate(p4Result.getDate(revision));
}
return new BlameScmResult(command, lines);
}
}