package org.tmatesoft.svn.core.internal.wc2.old;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.wc16.SVNDiffClient16;
import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration;
import org.tmatesoft.svn.core.internal.wc2.ng.ISvnDiffGenerator;
import org.tmatesoft.svn.core.internal.wc2.ng.SvnDiffGenerator;
import org.tmatesoft.svn.core.internal.wc2.ng.SvnNewDiffGenerator;
import org.tmatesoft.svn.core.wc.DefaultSVNDiffGenerator;
import org.tmatesoft.svn.core.wc.ISVNDiffGenerator;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnDiff;
import org.tmatesoft.svn.core.wc2.SvnTarget;
public class SvnOldDiff extends SvnOldRunner<Void, SvnDiff> {
@Override
public boolean isApplicable(SvnDiff operation, SvnWcGeneration wcGeneration) throws SVNException {
if (wcGeneration != SvnWcGeneration.V16) {
return false;
}
if (operation.getSource() != null) {
if (operation.getSource().isFile()) {
return true;
}
} else {
if (operation.getFirstSource().isFile()) {
return true;
}
if (operation.getSecondSource().isFile()) {
return true;
}
}
return false;
}
@Override
protected Void run() throws SVNException {
final SVNDiffClient16 diffClient = new SVNDiffClient16(getOperation().getRepositoryPool(), getOperation().getOptions());
diffClient.setDiffGenerator(getDiffGenerator());
diffClient.setMergeOptions(getOperation().getDiffOptions());
final boolean peggedDiff = getOperation().getSource() != null;
if (peggedDiff) {
final SVNRevision startRevision = getOperation().getStartRevision() == null ? SVNRevision.UNDEFINED : getOperation().getStartRevision();
final SVNRevision endRevision = getOperation().getEndRevision() == null ? SVNRevision.UNDEFINED : getOperation().getEndRevision();
diffClient.doDiff(getOperation().getSource().getFile(), getOperation().getSource().getResolvedPegRevision(),
startRevision, endRevision,
getOperation().getDepth(), !getOperation().isIgnoreAncestry(), getOperation().getOutput(), getOperation().getApplicableChangelists());
} else {
final SVNRevision startRevision = getOperation().getFirstSource().getPegRevision() == null ? SVNRevision.UNDEFINED : getOperation().getFirstSource().getPegRevision();
final SVNRevision endRevision = getOperation().getSecondSource().getPegRevision() == null ? SVNRevision.UNDEFINED : getOperation().getSecondSource().getPegRevision();
if (getOperation().getFirstSource().isURL() && getOperation().getSecondSource().isFile()) {
diffClient.doDiff(getOperation().getFirstSource().getURL(), startRevision, getOperation().getSecondSource().getFile(), endRevision,
getOperation().getDepth(), !getOperation().isIgnoreAncestry(), getOperation().getOutput(), getOperation().getApplicableChangelists());
} else if (getOperation().getFirstSource().isFile() && getOperation().getSecondSource().isURL()) {
diffClient.doDiff(getOperation().getFirstSource().getFile(), startRevision, getOperation().getSecondSource().getURL(), endRevision, getOperation().getDepth(), !getOperation().isIgnoreAncestry(), getOperation().getOutput(), getOperation().getApplicableChangelists());
} else if (getOperation().getFirstSource().isFile() && getOperation().getSecondSource().isFile()) {
diffClient.doDiff(getOperation().getFirstSource().getFile(), startRevision, getOperation().getSecondSource().getFile(), endRevision, getOperation().getDepth(), !getOperation().isIgnoreAncestry(), getOperation().getOutput(), getOperation().getApplicableChangelists());
} else {
throw new UnsupportedOperationException("URL-URL diff is not supported");
}
}
return null;
}
private ISVNDiffGenerator getDiffGenerator() {
ISvnDiffGenerator diffGenerator = getOperation().getDiffGenerator();
if (diffGenerator != null) {
if (getOperation().getRelativeToDirectory() != null) {
if (diffGenerator instanceof SvnDiffGenerator) {
((SvnDiffGenerator) diffGenerator).setRelativeToTarget(SvnTarget.fromFile(getOperation().getRelativeToDirectory()));
} else {
diffGenerator.setBaseTarget(SvnTarget.fromFile(getOperation().getRelativeToDirectory()));
}
}
return new SvnNewDiffGenerator(diffGenerator);
} else {
DefaultSVNDiffGenerator defaultSVNDiffGenerator = new DefaultSVNDiffGenerator();
if (getOperation().getRelativeToDirectory() != null) {
defaultSVNDiffGenerator.setBasePath(getOperation().getRelativeToDirectory());
}
return defaultSVNDiffGenerator;
}
}
}