From 841d033af74b2dc32fca45da70cda0f8591a12fa Mon Sep 17 00:00:00 2001 From: irengrig Date: Tue, 28 Feb 2012 11:25:32 +0400 Subject: [PATCH] IDEA-81922 Subversion: Compare with latest: confusing inverted diff for Local and HEAD --- .../src/messages/VcsBundle.properties | 1 + .../vcs/actions/DiffActionExecutor.java | 24 +++++++++++-------- .../jetbrains/idea/svn/SvnDiffProvider.java | 10 +++++--- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/platform/platform-resources-en/src/messages/VcsBundle.properties b/platform/platform-resources-en/src/messages/VcsBundle.properties index 335d1dcfe0d3..036488ac7764 100644 --- a/platform/platform-resources-en/src/messages/VcsBundle.properties +++ b/platform/platform-resources-en/src/messages/VcsBundle.properties @@ -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 diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/DiffActionExecutor.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/DiffActionExecutor.java index 6e43f994fb7a..68720739c065 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/DiffActionExecutor.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/DiffActionExecutor.java @@ -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")); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnDiffProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnDiffProvider.java index 0e07aecaf8a9..ad5b4a674f9c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnDiffProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnDiffProvider.java @@ -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());