diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/PermanentGraphImpl.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/PermanentGraphImpl.java index 6183456ca73e..2560a41cecc2 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/PermanentGraphImpl.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/facade/PermanentGraphImpl.java @@ -33,7 +33,7 @@ import com.intellij.vcs.log.graph.impl.facade.bek.BekSorter; import com.intellij.vcs.log.graph.impl.permanent.*; import com.intellij.vcs.log.graph.linearBek.LinearBekController; import com.intellij.vcs.log.graph.utils.LinearGraphUtils; -import com.intellij.vcs.log.graph.utils.impl.BitSetFlags; +import gnu.trove.TIntHashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -170,14 +170,26 @@ public class PermanentGraphImpl implements PermanentGraph, P return myPermanentCommitsInfo.getNodeId(head); } }); - BitSetFlags flags = new BitSetFlags(myPermanentLinearGraph.nodesCount()); - myReachableNodes.walk(headIds, new Consumer() { - @Override - public void consume(Integer node) { - flags.set(node, true); - } - }); - return new IntContainedInBranchCondition(flags); + if (!heads.isEmpty() && ContainerUtil.getFirstItem(heads) instanceof Integer) { + final TIntHashSet branchNodes = new TIntHashSet(); + myReachableNodes.walk(headIds, new Consumer() { + @Override + public void consume(Integer node) { + branchNodes.add((Integer)myPermanentCommitsInfo.getCommitId(node)); + } + }); + return new IntContainedInBranchCondition(branchNodes); + } + else { + final Set branchNodes = ContainerUtil.newHashSet(); + myReachableNodes.walk(headIds, new Consumer() { + @Override + public void consume(Integer node) { + branchNodes.add(myPermanentCommitsInfo.getCommitId(node)); + } + }); + return new ContainedInBranchCondition(branchNodes); + } } @NotNull @@ -217,16 +229,29 @@ public class PermanentGraphImpl implements PermanentGraph, P } } - private class IntContainedInBranchCondition implements Condition { - private final BitSetFlags myBranchNodes; + private static class IntContainedInBranchCondition implements Condition { + private final TIntHashSet myBranchNodes; - public IntContainedInBranchCondition(BitSetFlags branchNodes) { + public IntContainedInBranchCondition(TIntHashSet branchNodes) { myBranchNodes = branchNodes; } @Override public boolean value(CommitId commitId) { - return myBranchNodes.get(myPermanentCommitsInfo.getNodeId(commitId)); + return myBranchNodes.contains((Integer)commitId); + } + } + + private static class ContainedInBranchCondition implements Condition { + private final Set myBranchNodes; + + public ContainedInBranchCondition(Set branchNodes) { + myBranchNodes = branchNodes; + } + + @Override + public boolean value(CommitId commitId) { + return myBranchNodes.contains(commitId); } } }