diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java index 9acd1f9acff9..4e1d6e3427fe 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java @@ -63,12 +63,13 @@ class VisiblePackBuilder { return Pair.create(applyHashFilter(dataPack, hashFilter.getHashes(), sortType), commitCount); } + Set matchingHeads = getMatchingHeads(dataPack.getRefs(), filters); List detailsFilters = filters.getDetailsFilters(); List matchingCommits = null; boolean canRequestMore = false; if (!detailsFilters.isEmpty()) { if (commitCount == CommitCountStage.INITIAL) { - matchingCommits = filterInMemory(dataPack.getPermanentGraph(), detailsFilters); + matchingCommits = filterInMemory(dataPack.getPermanentGraph(), detailsFilters, matchingHeads); if (matchingCommits.size() < commitCount.getCount()) { commitCount = commitCount.next(); matchingCommits = null; @@ -94,8 +95,7 @@ class VisiblePackBuilder { visibleGraph = EmptyVisibleGraph.getInstance(); } else { - visibleGraph = dataPack.getPermanentGraph().createVisibleGraph(sortType, getMatchingHeads(dataPack.getRefs(), filters), - getFilterFromCommits(matchingCommits)); + visibleGraph = dataPack.getPermanentGraph().createVisibleGraph(sortType, matchingHeads, getFilterFromCommits(matchingCommits)); } return Pair.create(new VisiblePack(dataPack, visibleGraph, canRequestMore), commitCount); } @@ -139,7 +139,9 @@ class VisiblePackBuilder { } @NotNull - private List filterInMemory(@NotNull PermanentGraph permanentGraph, @NotNull List detailsFilters) { + private List filterInMemory(@NotNull PermanentGraph permanentGraph, + @NotNull List detailsFilters, + @Nullable Set matchingHeads) { List result = ContainerUtil.newArrayList(); for (GraphCommit commit : permanentGraph.getAllCommits()) { VcsCommitMetadata data = getDetailsFromCache(commit.getId()); @@ -147,18 +149,34 @@ class VisiblePackBuilder { // no more continuous details in the cache break; } - if (matchesAllFilters(data, detailsFilters)) { + if (matchesAllFilters(data, permanentGraph, detailsFilters, matchingHeads)) { result.add(data.getId()); } } return result; } - private static boolean matchesAllFilters(@NotNull final VcsCommitMetadata commit, @NotNull List detailsFilters) { + private boolean matchesAllFilters(@NotNull final VcsCommitMetadata commit, + @NotNull final PermanentGraph permanentGraph, + @NotNull List detailsFilters, + @Nullable final Set matchingHeads) { + final int commitIndex = myHashMap.getCommitIndex(commit.getId()); return ContainerUtil.and(detailsFilters, new Condition() { @Override public boolean value(VcsLogDetailsFilter filter) { - return filter.matches(commit); + if (!filter.matches(commit)) { + return false; + } + if (matchingHeads == null) { + return true; + } + Set containingBranches = permanentGraph.getContainingBranches(commitIndex); + return ContainerUtil.exists(containingBranches, new Condition() { + @Override + public boolean value(Integer integer) { + return matchingHeads.contains(integer); + } + }); } }); }