/**
* Copyright (c) 2010 Perforce Software. All rights reserved.
*/
package com.perforce.maven.scm.provider.p4.command.export;
import java.util.List;
import java.util.Random;
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.ScmVersion;
import org.apache.maven.scm.command.changelog.ChangeLogCommand;
import org.apache.maven.scm.command.checkout.CheckOutScmResult;
import org.apache.maven.scm.command.export.AbstractExportCommand;
import org.apache.maven.scm.command.export.ExportScmResult;
import org.apache.maven.scm.command.export.ExportScmResultWithRevision;
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.command.changelog.P4ChangeLogCommand;
import com.perforce.maven.scm.provider.p4.command.checkout.P4CheckOutCommand;
import com.perforce.maven.scm.provider.p4.repository.P4ScmProviderRepository;
import com.perforce.p4java.core.IChangelist;
import com.perforce.p4java.core.IChangelistSummary;
import com.perforce.p4java.core.file.FileSpecBuilder;
import com.perforce.p4java.core.file.IFileSpec;
import com.perforce.p4java.exception.P4JavaException;
import com.perforce.p4java.option.server.GetChangelistsOptions;
/**
* Use Perforce sync command to update files from the repository.
*/
public class P4ExportCommand extends AbstractExportCommand implements P4Command {
/** The Constant command. */
public static final String command = "Perforce sync command";
/**
* @see org.apache.maven.scm.command.export.AbstractExportCommand
* executeExportCommand(org.apache.maven.scm.provider.ScmProviderRepository,
* org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion,
* java.lang.String)
*/
protected ExportScmResult executeExportCommand(ScmProviderRepository repo,
ScmFileSet files, ScmVersion scmVersion, String outputDirectory)
throws ScmException {
// Update is the same as checkout in Perforce
P4CheckOutCommand command = new P4CheckOutCommand();
command.setLogger(getLogger());
CommandParameters params = new CommandParameters();
params.setScmVersion(CommandParameter.SCM_VERSION, scmVersion);
StringBuilder randomClientName = new StringBuilder();
Random generator = new Random(19580427);
randomClientName.append("p4-client").append("-").append(generator.nextInt());
System.setProperty(P4Executor.P4_CLIENT_PROPERTY, randomClientName.toString());
CheckOutScmResult checkOutScmResult = (CheckOutScmResult) command
.execute(repo, files, params);
if (!checkOutScmResult.isSuccess()) {
return new ExportScmResult(checkOutScmResult.getCommandLine(),
checkOutScmResult.getProviderMessage(),
checkOutScmResult.getCommandOutput(), false);
}
P4ExportResult p4Result = new P4ExportResult();
int have = 0;
P4ScmProviderRepository p4Repo = (P4ScmProviderRepository) repo;
P4ClientExecutor executor = new P4ClientExecutor(p4Repo, files,
getLogger());
try {
GetChangelistsOptions getChangelistsOptions = new GetChangelistsOptions();
getChangelistsOptions.setMaxMostRecent(1);
getChangelistsOptions.setType(IChangelist.Type.SUBMITTED);
String clientName = executor.getP4Client();
if (clientName != null) {
getChangelistsOptions.setClientName(clientName);
}
StringBuffer fileSpec = new StringBuffer("//" + clientName
+ "/...#have");
List<IFileSpec> fileSpecs = FileSpecBuilder
.makeFileSpecList(new String[] { fileSpec.toString() });
List<IChangelistSummary> retChangelistSummaries = executor
.getServer().getChangelists(fileSpecs,
getChangelistsOptions);
if (retChangelistSummaries != null) {
for (IChangelistSummary changelistSummary : retChangelistSummaries) {
have = changelistSummary.getId();
break;
}
}
} catch (P4JavaException e) {
if (getLogger().isErrorEnabled()) {
getLogger().error(e);
}
throw new ScmException(e.getLocalizedMessage(), e);
}
return new ExportScmResultWithRevision(
checkOutScmResult.getCommandLine(),
checkOutScmResult.getCheckedOutFiles(), String.valueOf(have));
}
/**
* @see org.apache.maven.scm.command.update.AbstractUpdateCommand#getChangeLogCommand
* ()
*/
protected ChangeLogCommand getChangeLogCommand() {
P4ChangeLogCommand command = new P4ChangeLogCommand();
command.setLogger(getLogger());
return command;
}
}