package org.tmatesoft.svn.core.internal.wc2.ng;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.wc.ISVNDiffStatusHandler;
import org.tmatesoft.svn.core.wc.SVNDiffStatus;
import org.tmatesoft.svn.core.wc.SVNStatusType;
import org.tmatesoft.svn.core.wc2.ISvnObjectReceiver;
import org.tmatesoft.svn.core.wc2.SvnDiffStatus;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
public class SvnDiffSummarizeCallback implements ISvnDiffCallback {
private final ISVNDiffStatusHandler handler;
private final Set<File> propChanges;
private final boolean reversed;
private final SVNURL baseUrl;
private final File baseDirectory;
private final File target;
public SvnDiffSummarizeCallback(File targetAbsPath, boolean reversed, SVNURL baseUrl, File baseDirectory, ISVNDiffStatusHandler handler) {
this.handler = handler;
this.reversed = reversed;
this.target = targetAbsPath;
this.baseUrl = baseUrl;
this.baseDirectory = baseDirectory;
this.propChanges = new HashSet<File>();
}
public void fileOpened(SvnDiffCallbackResult result, File path, long revision) throws SVNException {
}
public void fileChanged(SvnDiffCallbackResult result, File path, File leftFile, File rightFile, long rev1, long rev2, String mimeType1, String mimeType2, SVNProperties propChanges, SVNProperties originalProperties) throws SVNException {
boolean textChange = rightFile != null;
SVNProperties regularPropChanges = new SVNProperties();
SvnNgPropertiesManager.categorizeProperties(propChanges, regularPropChanges, null, null);
boolean propChange = regularPropChanges.size() > 0;
if (textChange || propChange) {
sendSummary(path, textChange ? SVNStatusType.STATUS_MODIFIED : SVNStatusType.STATUS_NORMAL, propChange, SVNNodeKind.FILE);
}
}
public void fileAdded(SvnDiffCallbackResult result, File path, File leftFile, File rightFile, long rev1, long rev2, String mimeType1, String mimeType2, File copyFromPath, long copyFromRevision, SVNProperties propChanges, SVNProperties originalProperties) throws SVNException {
SVNProperties regularPropChanges = new SVNProperties();
SvnNgPropertiesManager.categorizeProperties(propChanges, regularPropChanges, null, null);
sendSummary(path, SVNStatusType.STATUS_ADDED, regularPropChanges.size() > 0, SVNNodeKind.FILE);
}
public void fileDeleted(SvnDiffCallbackResult result, File path, File leftFile, File rightFile, String mimeType1, String mimeType2, SVNProperties originalProperties) throws SVNException {
sendSummary(path, SVNStatusType.STATUS_DELETED, false, SVNNodeKind.FILE);
}
public void dirDeleted(SvnDiffCallbackResult result, File path) throws SVNException {
sendSummary(path, SVNStatusType.STATUS_DELETED, false, SVNNodeKind.DIR);
}
public void dirOpened(SvnDiffCallbackResult result, File path, long revision) throws SVNException {
}
public void dirAdded(SvnDiffCallbackResult result, File path, long revision, String copyFromPath, long copyFromRevision) throws SVNException {
}
public void dirPropsChanged(SvnDiffCallbackResult result, File path, boolean isAdded, SVNProperties propChanges, SVNProperties originalProperties) throws SVNException {
SVNProperties regularPropChanges = new SVNProperties();
SvnNgPropertiesManager.categorizeProperties(propChanges, regularPropChanges, null, null);
if (regularPropChanges.size() > 0) {
this.propChanges.add(path);
}
}
public void dirClosed(SvnDiffCallbackResult result, File path, boolean isAdded) throws SVNException {
if (SVNFileUtil.skipAncestor(this.target, path) == null) {
return;
}
boolean propChange = this.propChanges.contains(path);
if (isAdded || propChange) {
sendSummary(path, isAdded ? SVNStatusType.STATUS_ADDED : SVNStatusType.STATUS_NORMAL, propChange, SVNNodeKind.DIR);
}
}
private void sendSummary(File path, SVNStatusType summarizeKind, boolean propChanged, SVNNodeKind nodeKind) throws SVNException {
assert summarizeKind != SVNStatusType.STATUS_NORMAL || propChanged;
if (this.reversed) {
if (summarizeKind == SVNStatusType.STATUS_ADDED) {
summarizeKind = SVNStatusType.STATUS_DELETED;
} else if (summarizeKind == SVNStatusType.STATUS_DELETED) {
summarizeKind = SVNStatusType.STATUS_ADDED;
}
}
File relPath = SVNFileUtil.isAbsolute(path) ? SVNFileUtil.skipAncestor(baseDirectory, path): path;
File relTarget = this.target == null ? null : (SVNFileUtil.isAbsolute(this.target) ? SVNFileUtil.skipAncestor(new File("").getAbsoluteFile(), this.target) : this.target);
File realRelPath = relTarget == null ? relPath : SVNFileUtil.skipAncestor(relTarget, relPath);
SVNDiffStatus diffStatus = new SVNDiffStatus(path, baseUrl == null ? null : baseUrl.appendPath(SVNFileUtil.getFilePath(relPath), false), SVNFileUtil.getFilePath(realRelPath), summarizeKind,
(summarizeKind == SVNStatusType.STATUS_MODIFIED || summarizeKind == SVNStatusType.STATUS_NORMAL) ? propChanged : false, nodeKind);
handler.handleDiffStatus(diffStatus);
}
private static enum SvnSummarizeKind {
NORMAL, ADDED, MODIFIED, DELETED
}
}