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 }