From 741e9b9219bda13ac30bf248ec130fa140ce5a91 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 11 Mar 2014 15:39:14 +0400 Subject: [PATCH] [log] IDEA-121875 Enable manual commits sorting in VCS that support it If the VCS can return unordered commits faster (like Git does), request more unordered commits & sort them by hands. --- .../src/com/intellij/vcs/log/VcsLogProvider.java | 6 ++++++ .../com/intellij/vcs/log/data/VcsLogDataHolder.java | 13 +++++++++++-- .../git4idea/src/git4idea/log/GitLogProvider.java | 5 +++++ .../src/org/zmlx/hg4idea/log/HgLogProvider.java | 5 +++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java index 467368e80b19..3565dfd3fa4d 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java @@ -95,4 +95,10 @@ public interface VcsLogProvider { @NotNull Collection getContainingBranches(@NotNull VirtualFile root, @NotNull Hash commitHash) throws VcsException; + /** + * Return true if the VCS supports some mode in which commits can be received faster, but unordered.
+ * In this case the VCS Log will order commits manually + */ + boolean supportsFastUnorderedCommits(); + } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java index c2822dcd3f48..c0cfdefa61ed 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java @@ -440,7 +440,12 @@ public class VcsLogDataHolder implements Disposable, VcsLogDataProvider { RecentCommitsInfo info = entry.getValue(); // in this case new commits won't be attached to the log, but will substitute existing ones. - List firstBlockCommits = new VcsLogSorter().sortByDateTopoOrder(info.firstBlockCommits); + List firstBlockCommits = info.firstBlockCommits; + if (getLogProvider(root).supportsFastUnorderedCommits()) { + // => we requested unordered => have to order them ourselves + firstBlockCommits = new VcsLogSorter().sortByDateTopoOrder(firstBlockCommits); + firstBlockCommits = new ArrayList(firstBlockCommits.subList(0, Math.min(firstBlockCommits.size(), commitCount))); + } logsToBuild.put(root, firstBlockCommits); refsByRoot.put(root, info.newRefs); } @@ -479,7 +484,11 @@ public class VcsLogDataHolder implements Disposable, VcsLogDataProvider { VcsLogProvider logProvider = entry.getValue(); StopWatch sw = StopWatch.start("readFirstBlock for " + root.getName()); - List firstBlockDetails = logProvider.readFirstBlock(root, ordered, commitsCount); + + boolean orderedForRepo = ordered && !logProvider.supportsFastUnorderedCommits(); // will order manually + int commitCountForRepo = orderedForRepo ? commitsCount : commitsCount * 2; // but need to request more commits + + List firstBlockDetails = logProvider.readFirstBlock(root, orderedForRepo, commitCountForRepo); sw.report(); sw = StopWatch.start("readAllRefs for" + root.getName()); Collection newRefs = logProvider.readAllRefs(root); diff --git a/plugins/git4idea/src/git4idea/log/GitLogProvider.java b/plugins/git4idea/src/git4idea/log/GitLogProvider.java index 12807094a9c7..5a679d11ac69 100644 --- a/plugins/git4idea/src/git4idea/log/GitLogProvider.java +++ b/plugins/git4idea/src/git4idea/log/GitLogProvider.java @@ -259,6 +259,11 @@ public class GitLogProvider implements VcsLogProvider { return GitBranchUtil.getBranches(myProject, root, true, true, commitHash.asString()); } + @Override + public boolean supportsFastUnorderedCommits() { + return true; + } + private static String prepareParameter(String paramName, String value) { return "--" + paramName + "=" + value; // no value quoting needed, because the parameter itself will be quoted by GeneralCommandLine } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java index 52ed34f39f17..a63ae3c29000 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/log/HgLogProvider.java @@ -246,6 +246,11 @@ public class HgLogProvider implements VcsLogProvider { return HgHistoryUtil.getDescendingHeadsOfBranches(myProject, root, commitHash); } + @Override + public boolean supportsFastUnorderedCommits() { + return false; + } + private static String prepareParameter(String paramName, String value) { return "--" + paramName + "=" + value; // no value escaping needed, because the parameter itself will be quoted by GeneralCommandLine }