vcs annotate: fix possible issue with "commit number"
authorAleksey Pivovarov <AMPivovarov@gmail.com>
Sat, 20 Jun 2015 11:22:23 +0000 (14:22 +0300)
committerAleksey Pivovarov <AMPivovarov@gmail.com>
Thu, 3 Sep 2015 16:28:01 +0000 (19:28 +0300)
We know that fileAnnotation.getRevisions() are sorted properly, while old comparator could return invalid result (ex: for commits with the same timestamp in git)

platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/HistoryIdColumn.java

index 1e09e53750ffef34f307417e4879575db7c4a2f3..657a2df5fbf7cfbd45486923ccd944408b88c79e 100644 (file)
@@ -47,7 +47,6 @@ import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl;
 import com.intellij.openapi.vcs.impl.UpToDateLineNumberProviderImpl;
 import com.intellij.openapi.vcs.impl.VcsBackgroundableActions;
 import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.util.containers.SortedList;
 import com.intellij.util.ui.UIUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -267,7 +266,7 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware, Ann
 
     final Couple<Map<VcsRevisionNumber, Color>> bgColorMap =
       Registry.is("vcs.show.colored.annotations") ? computeBgColors(fileAnnotation) : null;
-    final Map<String, Integer> historyIds = Registry.is("vcs.show.history.numbers") ? computeLineNumbers(fileAnnotation) : null;
+    final Map<VcsRevisionNumber, Integer> historyIds = Registry.is("vcs.show.history.numbers") ? computeLineNumbers(fileAnnotation) : null;
 
     if (switcher != null) {
       switcher.switchTo(switcher.getDefaultSource());
@@ -334,31 +333,16 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware, Ann
   }
 
   @Nullable
-  private static Map<String, Integer> computeLineNumbers(@NotNull FileAnnotation fileAnnotation) {
-    final SortedList<VcsFileRevision> revisions = new SortedList<VcsFileRevision>(new Comparator<VcsFileRevision>() {
-      @Override
-      public int compare(VcsFileRevision o1, VcsFileRevision o2) {
-        try {
-          final int result = o1.getRevisionDate().compareTo(o2.getRevisionDate());
-          return result != 0 ? result : o1.getRevisionNumber().compareTo(o2.getRevisionNumber());
-        }
-        catch (Exception e) {
-          return 0;
-        }
-      }
-    });
-    final Map<String, Integer> numbers = new HashMap<String, Integer>();
+  private static Map<VcsRevisionNumber, Integer> computeLineNumbers(@NotNull FileAnnotation fileAnnotation) {
+    final Map<VcsRevisionNumber, Integer> numbers = new HashMap<VcsRevisionNumber, Integer>();
     final List<VcsFileRevision> fileRevisionList = fileAnnotation.getRevisions();
     if (fileRevisionList != null) {
-      revisions.addAll(fileRevisionList);
-      for (VcsFileRevision revision : fileRevisionList) {
-        final String revNumber = revision.getRevisionNumber().asString();
-        if (!numbers.containsKey(revNumber)) {
-          final int num = revisions.indexOf(revision);
-          if (num != -1) {
-            numbers.put(revNumber, num + 1);
-          }
-        }
+      int size = fileRevisionList.size();
+      for (int i = 0; i < size; i++) {
+        VcsFileRevision revision = fileRevisionList.get(i);
+        final VcsRevisionNumber number = revision.getRevisionNumber();
+
+        numbers.put(number, size - i);
       }
     }
     return numbers.size() < 2 ? null : numbers;
index e4cf739c39e9042aea14d61dfc71debef62c0213..5b4d50a58037f1dc5fa38633ebddc806e6366c53 100644 (file)
@@ -29,13 +29,13 @@ import java.util.Map;
  * @author Konstantin Bulenkov
  */
 class HistoryIdColumn extends AnnotationFieldGutter {
-  private final Map<String, Integer> myHistoryIds;
+  private final Map<VcsRevisionNumber, Integer> myHistoryIds;
 
   HistoryIdColumn(FileAnnotation annotation,
                   final Editor editor,
                   final TextAnnotationPresentation presentation,
                   Couple<Map<VcsRevisionNumber, Color>> colorScheme,
-                  Map<String, Integer> ids) {
+                  Map<VcsRevisionNumber, Integer> ids) {
     super(annotation, editor, null, presentation, colorScheme);
     myHistoryIds = ids;
   }
@@ -45,7 +45,7 @@ class HistoryIdColumn extends AnnotationFieldGutter {
     if (!isAvailable()) return "";
     final VcsRevisionNumber revisionNumber = myAnnotation.getLineRevisionNumber(line);
     if (revisionNumber != null) {
-      final Integer num = myHistoryIds.get(revisionNumber.asString());
+      final Integer num = myHistoryIds.get(revisionNumber);
       if (num != null) {
         final String size = String.valueOf(myHistoryIds.size());
         String value = num.toString();