package org.tmatesoft.svn.core.internal.wc2.remote;
import java.util.Collection;
import org.tmatesoft.svn.core.SVNCommitInfo;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.wc16.SVNCopyClient16;
import org.tmatesoft.svn.core.internal.wc2.SvnRemoteOperationRunner;
import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration;
import org.tmatesoft.svn.core.internal.wc2.compat.SvnCodec;
import org.tmatesoft.svn.core.internal.wc2.ng.SvnNgRepositoryAccess;
import org.tmatesoft.svn.core.internal.wc2.old.SvnOldRepositoryAccess;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.ISVNExternalsHandler;
import org.tmatesoft.svn.core.wc.SVNCopySource;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnCopySource;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.core.wc2.SvnRemoteCopy;
import org.tmatesoft.svn.core.wc2.SvnTarget;
public class SvnNgReposToReposCopy extends SvnRemoteOperationRunner<SVNCommitInfo, SvnRemoteCopy> {
@Override
public boolean isApplicable(SvnRemoteCopy operation, SvnWcGeneration wcGeneration) throws SVNException {
return areAllSourcesRemote(operation) && !operation.getFirstTarget().isLocal();
}
private boolean areAllSourcesRemote(SvnRemoteCopy operation) {
for(SvnCopySource source : operation.getSources()) {
if (source.getSource().isURL() ||
(source.getRevision() != SVNRevision.WORKING && source.getRevision() != SVNRevision.UNDEFINED)) {
continue;
}
return false;
}
return true;
}
@Override
protected SVNCommitInfo run() throws SVNException {
SVNCopyClient16 client = new SVNCopyClient16(getOperation().getRepositoryPool(), getOperation().getOptions());
client.setEventHandler(getOperation().getEventHandler());
client.setExternalsHandler(ISVNExternalsHandler.DEFAULT);
client.setOptions(getOperation().getOptions());
client.setCommitHandler(SvnCodec.commitHandler(getOperation().getCommitHandler()));
SvnTarget target = getOperation().getFirstTarget();
SVNCopySource[] sources = new SVNCopySource[getOperation().getSources().size()];
int i = 0;
for (SvnCopySource newSource : getOperation().getSources()) {
if (newSource.getSource().isFile()) {
SvnWcGeneration wcGeneration = SvnOperationFactory.detectWcGeneration(newSource.getSource().getFile(), false);
if (wcGeneration == SvnWcGeneration.V16) {
newSource = new SvnOldRepositoryAccess(getOperation()).createRemoteCopySource(getWcContext(), newSource);
} else {
newSource = new SvnNgRepositoryAccess(getOperation(), getWcContext()).createRemoteCopySource(getWcContext(), newSource);
}
}
sources[i] = SvnCodec.copySource(newSource);
i++;
}
SVNCommitInfo info = client.doCopy(sources, target.getURL(), getOperation().isMove(), getOperation().isMakeParents(), getOperation().isFailWhenDstExists(),
getOperation().getCommitMessage(), getOperation().getRevisionProperties());
if (info != null) {
Collection<SvnTarget> targets = getOperation().getTargets();
if (targets != null && targets.size() != 0) {
SvnTarget firstTarget = targets.iterator().next();
SVNRepository repository = getRepositoryAccess().createRepository(firstTarget.getURL(), null, true);
SVNURL repositoryRoot = repository.getRepositoryRoot(true);
getOperation().receive(SvnTarget.fromURL(repositoryRoot), info);
}
}
return info;
}
}