IDEA-81922 Subversion: Compare with latest: confusing inverted diff for Local and HEAD

This commit is contained in:
irengrig
2012-02-28 11:25:32 +04:00
parent 349e7fd0e4
commit 841d033af7
3 changed files with 22 additions and 13 deletions
@@ -87,6 +87,7 @@ message.text.binary.versions.are.identical=Binary versions are identical
message.title.diff=Diff
message.text.binary.versions.are.different=Binary versions are different
diff.title.local=Local
diff.title.local.with.number=Local ({0})
message.title.annotate=Annotate
action.name.checkin.directory={0} Directory
action.name.checkin.file={0} File
@@ -26,10 +26,7 @@ import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vcs.AbstractVcsHelper;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.changes.BackgroundFromStartOption;
import com.intellij.openapi.vcs.changes.BinaryContentRevision;
import com.intellij.openapi.vcs.changes.ContentRevision;
@@ -118,13 +115,20 @@ public abstract class DiffActionExecutor {
if (document == null) return;
final DocumentContent content2 = new DocumentContent(myProject, document);
final VcsRevisionNumber currentRevision = myDiffProvider.getCurrentRevision(mySelectedFile);
final FileStatus status = FileStatusManager.getInstance(myProject).getStatus(mySelectedFile);
if (status == null || FileStatus.NOT_CHANGED.equals(status) || FileStatus.UNKNOWN.equals(status) ||
FileStatus.IGNORED.equals(status)) {
if (revisionNumber.compareTo(currentRevision) > 0) {
request.setContents(content2, remote);
request.setContentTitles(VcsBundle.message("diff.title.local"), revisionNumber.asString());
}
else {
final VcsRevisionNumber currentRevision = myDiffProvider.getCurrentRevision(mySelectedFile);
if (revisionNumber.compareTo(currentRevision) > 0) {
request.setContents(content2, remote);
request.setContentTitles(VcsBundle.message("diff.title.local.with.number", currentRevision.asString()), revisionNumber.asString());
}
else {
request.setContents(remote, content2);
request.setContentTitles(revisionNumber.asString(), VcsBundle.message("diff.title.local.with.number", currentRevision.asString()));
}
} else {
request.setContents(remote, content2);
request.setContentTitles(revisionNumber.asString(), VcsBundle.message("diff.title.local"));
}
@@ -160,11 +160,15 @@ public class SvnDiffProvider implements DiffProvider, DiffMixin {
private ItemLatestState getLastRevision(final File file) {
final SVNStatusClient client = myVcs.createStatusClient();
try {
final SVNStatus svnStatus = client.doStatus(file, true, false);
final SVNStatus svnStatus = client.doStatus(file, true);
if (svnStatus == null) {
// IDEADEV-21785 (no idea why this can happen)
LOG.info("No SVN status returned for " + file.getPath());
return defaultResult();
final SVNInfo info = myVcs.createWCClient().doInfo(file, SVNRevision.HEAD);
if (info == null || info.getURL() == null) {
LOG.info("No SVN status returned for " + file.getPath());
return defaultResult();
}
return createResult(info.getRevision(), true, false);
}
final boolean exists = ! SVNStatusType.STATUS_DELETED.equals(svnStatus.getRemoteContentsStatus()) &&
! SVNStatusType.STATUS_DELETED.equals(svnStatus.getRemoteNodeStatus());