diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/VcsCacheableAnnotationProvider.java b/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/VcsCacheableAnnotationProvider.java index ed7084253cb1..6da3ea3e0e13 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/VcsCacheableAnnotationProvider.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/VcsCacheableAnnotationProvider.java @@ -16,6 +16,7 @@ package com.intellij.openapi.vcs.annotate; import com.intellij.openapi.vcs.history.VcsAbstractHistorySession; +import com.intellij.openapi.vcs.history.VcsRevisionNumber; import org.jetbrains.annotations.Nullable; /** @@ -29,5 +30,5 @@ public interface VcsCacheableAnnotationProvider { FileAnnotation restore(final VcsAnnotation vcsAnnotation, VcsAbstractHistorySession session, String annotatedContent, - boolean forCurrentRevision); + boolean forCurrentRevision, VcsRevisionNumber revisionNumber); } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/history/VcsAnnotationCachedProxy.java b/platform/vcs-api/src/com/intellij/openapi/vcs/history/VcsAnnotationCachedProxy.java index 71314bfcfa27..15c1b65b094f 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/history/VcsAnnotationCachedProxy.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/history/VcsAnnotationCachedProxy.java @@ -77,7 +77,8 @@ public class VcsAnnotationCachedProxy implements AnnotationProvider { final VcsAbstractHistorySession history = getHistory(revisionNumber, filePath, historyProvider, vcsAnnotation.getFirstRevision()); // question is whether we need "not moved" path here? final ContentRevision fileContent = myVcs.getDiffProvider().createFileContent(revisionNumber, file); - final FileAnnotation restored = cacheableAnnotationProvider.restore(vcsAnnotation, history, fileContent.getContent(), currentRevision); + final FileAnnotation restored = cacheableAnnotationProvider.restore(vcsAnnotation, history, fileContent.getContent(), currentRevision, + revisionNumber); if (restored != null) { return restored; } diff --git a/plugins/git4idea/src/git4idea/annotate/GitAnnotationProvider.java b/plugins/git4idea/src/git4idea/annotate/GitAnnotationProvider.java index d0cea5a38b68..05100d44a449 100644 --- a/plugins/git4idea/src/git4idea/annotate/GitAnnotationProvider.java +++ b/plugins/git4idea/src/git4idea/annotate/GitAnnotationProvider.java @@ -224,7 +224,7 @@ public class GitAnnotationProvider implements AnnotationProvider, VcsCacheableAn public FileAnnotation restore(VcsAnnotation vcsAnnotation, VcsAbstractHistorySession session, String annotatedContent, - boolean forCurrentRevision) { + boolean forCurrentRevision, VcsRevisionNumber revisionNumber) { final GitFileAnnotation gitFileAnnotation = new GitFileAnnotation(myProject, vcsAnnotation.getFilePath().getVirtualFile(), forCurrentRevision); gitFileAnnotation.addLogEntries(session.getRevisionList()); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnAnnotationProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnAnnotationProvider.java index 13c9ba5f829d..81999c790a7f 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnAnnotationProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnAnnotationProvider.java @@ -47,7 +47,12 @@ public class SvnAnnotationProvider implements AnnotationProvider, VcsCacheableAn } public FileAnnotation annotate(final VirtualFile file) throws VcsException { - return annotate(file, new SvnFileRevision(myVcs, SVNRevision.WORKING, SVNRevision.WORKING, null, null, null, null, null), true); + final SvnRevisionNumber currentRevision = (SvnRevisionNumber)myVcs.getDiffProvider().getCurrentRevision(file); + if (currentRevision == null) { + throw new VcsException("Can not get current revision for file " + file.getPath()); + } + final SVNRevision svnRevision = currentRevision.getRevision(); + return annotate(file, new SvnFileRevision(myVcs, svnRevision, svnRevision, null, null, null, null, null), true); } public FileAnnotation annotate(final VirtualFile file, final VcsFileRevision revision) throws VcsException { @@ -77,7 +82,7 @@ public class SvnAnnotationProvider implements AnnotationProvider, VcsCacheableAn contents = LoadTextUtil.getTextByBinaryPresentation(bytes, file, false).toString(); } - final SvnFileAnnotation result = new SvnFileAnnotation(myVcs, file, contents); + final SvnFileAnnotation result = new SvnFileAnnotation(myVcs, file, contents, revision.getRevisionNumber()); SVNWCClient wcClient = myVcs.createWCClient(); SVNInfo info = wcClient.doInfo(ioFile, SVNRevision.WORKING); @@ -219,9 +224,9 @@ public class SvnAnnotationProvider implements AnnotationProvider, VcsCacheableAn public FileAnnotation restore(VcsAnnotation vcsAnnotation, VcsAbstractHistorySession session, String annotatedContent, - boolean forCurrentRevision) { + boolean forCurrentRevision, VcsRevisionNumber revisionNumber) { final SvnFileAnnotation annotation = - new SvnFileAnnotation(myVcs, vcsAnnotation.getFilePath().getVirtualFile(), annotatedContent); + new SvnFileAnnotation(myVcs, vcsAnnotation.getFilePath().getVirtualFile(), annotatedContent, revisionNumber); final VcsLineAnnotationData basicAnnotation = vcsAnnotation.getBasicAnnotation(); final VcsLineAnnotationData data = vcsAnnotation.getAdditionalAnnotations().get(MERGED_KEY); final Map historyAsMap = session.getHistoryAsMap(); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java index 5ac147ac5687..4ca27cc8c0ef 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnFileAnnotation.java @@ -31,6 +31,7 @@ import java.util.*; public class SvnFileAnnotation implements FileAnnotation { private final String myContents; + private final VcsRevisionNumber myBaseRevision; private final MyPartiallyCreatedInfos myInfos; private final SvnVcs myVcs; @@ -103,6 +104,10 @@ public class SvnFileAnnotation implements FileAnnotation { }; private final SvnEntriesListener myListener = new SvnEntriesListener() { public void onEntriesChanged(VirtualFile directory) { + if (directory != myFile.getParent()) return; + final VcsRevisionNumber currentRevision = myVcs.getDiffProvider().getCurrentRevision(myFile); + if (currentRevision != null && currentRevision.equals(myBaseRevision)) return; + final AnnotationListener[] listeners = myListeners.toArray(new AnnotationListener[myListeners.size()]); for (int i = 0; i < listeners.length; i++) { listeners[i].onAnnotationChanged(); @@ -158,10 +163,11 @@ public class SvnFileAnnotation implements FileAnnotation { } } - public SvnFileAnnotation(final SvnVcs vcs, final VirtualFile file, final String contents) { + public SvnFileAnnotation(final SvnVcs vcs, final VirtualFile file, final String contents, final VcsRevisionNumber baseRevision) { myVcs = vcs; myFile = file; myContents = contents; + myBaseRevision = baseRevision; myVcs.getSvnEntriesFileListener().addListener(myListener); myConfiguration = SvnConfiguration.getInstance(vcs.getProject()); myShowMergeSources = myConfiguration.SHOW_MERGE_SOURCES_IN_ANNOTATE;