From c7b6693d8afc7d00f56f6d9b4a031a4e231c2af8 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Thu, 22 Jan 2015 20:43:56 +0300 Subject: [PATCH] [log] Added branch filter support. --- .../api/permanent/PermanentGraphInfo.java | 3 +- .../BranchMatchedNodesGenerator.java | 75 +++++++++++++++++++ .../log/graph/collapsing/CollapsedGraph.java | 11 +-- .../CollapsedLinearGraphController.java | 9 ++- .../graph/impl/facade/PermanentGraphImpl.java | 8 +- .../permanent/PermanentLinearGraphImpl.java | 7 ++ .../vcs/log/graph/TestGraphBuilder.kt | 5 +- 7 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/BranchMatchedNodesGenerator.java diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/api/permanent/PermanentGraphInfo.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/api/permanent/PermanentGraphInfo.java index 559b3dd77b6c..3a0fe3f943f5 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/api/permanent/PermanentGraphInfo.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/api/permanent/PermanentGraphInfo.java @@ -18,6 +18,7 @@ package com.intellij.vcs.log.graph.api.permanent; import com.intellij.vcs.log.graph.GraphColorManager; import com.intellij.vcs.log.graph.api.GraphLayout; import com.intellij.vcs.log.graph.api.LinearGraph; +import com.intellij.vcs.log.graph.impl.permanent.PermanentLinearGraphImpl; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -28,7 +29,7 @@ public interface PermanentGraphInfo { PermanentCommitsInfo getPermanentCommitsInfo(); @NotNull - LinearGraph getPermanentLinearGraph(); + PermanentLinearGraphImpl getPermanentLinearGraph(); @NotNull GraphLayout getPermanentGraphLayout(); diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/BranchMatchedNodesGenerator.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/BranchMatchedNodesGenerator.java new file mode 100644 index 000000000000..54df74cd8415 --- /dev/null +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/BranchMatchedNodesGenerator.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.vcs.log.graph.collapsing; + +import com.intellij.vcs.log.graph.api.LiteLinearGraph; +import com.intellij.vcs.log.graph.impl.permanent.PermanentLinearGraphImpl; +import com.intellij.vcs.log.graph.utils.DfsUtil; +import com.intellij.vcs.log.graph.utils.LinearGraphUtils; +import com.intellij.vcs.log.graph.utils.UnsignedBitSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +public class BranchMatchedNodesGenerator { + + @NotNull + public static UnsignedBitSet generateVisibleNodes(@NotNull PermanentLinearGraphImpl permanentGraph, @Nullable Set headNodeIndexes) { + if (headNodeIndexes == null) { + UnsignedBitSet nodesVisibility = new UnsignedBitSet(); + nodesVisibility.set(0, permanentGraph.nodesCount() - 1, true); + return nodesVisibility; + } + + assert !headNodeIndexes.isEmpty(); + BranchMatchedNodesGenerator generator = new BranchMatchedNodesGenerator(LinearGraphUtils.asLiteLinearGraph(permanentGraph)); + generator.generate(headNodeIndexes); + return generator.myNodesVisibility; + } + + @NotNull + private final LiteLinearGraph myGraph; + + @NotNull + private final UnsignedBitSet myNodesVisibility; + + @NotNull + private final DfsUtil myDfsUtil = new DfsUtil(); + + BranchMatchedNodesGenerator(@NotNull LiteLinearGraph graph) { + myGraph = graph; + myNodesVisibility = new UnsignedBitSet(); + } + + private void generate(@NotNull Set startedNodes) { + for (int startNode : startedNodes) { + myNodesVisibility.set(startNode, true); + myDfsUtil.nodeDfsIterator(startNode, new DfsUtil.NextNode() { + @Override + public int fun(int currentNode) { + for (int downNode : myGraph.getNodes(currentNode, LiteLinearGraph.NodeFilter.DOWN)) { + if (!myNodesVisibility.get(downNode)) { + myNodesVisibility.set(downNode, true); + return downNode; + } + } + return NODE_NOT_FOUND; + } + }); + } + } +} diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java index df630ef0c066..a429b6cc13a1 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedGraph.java @@ -15,13 +15,11 @@ */ package com.intellij.vcs.log.graph.collapsing; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.vcs.log.graph.api.EdgeFilter; import com.intellij.vcs.log.graph.api.LinearGraph; import com.intellij.vcs.log.graph.api.elements.GraphEdge; import com.intellij.vcs.log.graph.api.elements.GraphNode; -import com.intellij.vcs.log.graph.utils.IntToIntMap; import com.intellij.vcs.log.graph.utils.UnsignedBitSet; import com.intellij.vcs.log.graph.utils.UpdatableIntToIntMap; import com.intellij.vcs.log.graph.utils.impl.ListIntToIntMap; @@ -33,14 +31,7 @@ import java.util.List; public class CollapsedGraph { // initVisibility == null means, what all nodes is Visible - public static CollapsedGraph newInstance(@NotNull LinearGraph delegateGraph, @Nullable UnsignedBitSet initVisibility) { - if (initVisibility == null) { // todo fix performance - initVisibility = new UnsignedBitSet(); - for (int i = 0; i < delegateGraph.nodesCount(); i++) { - initVisibility.set(delegateGraph.getNodeId(i), true); - } - } - + public static CollapsedGraph newInstance(@NotNull LinearGraph delegateGraph, @NotNull UnsignedBitSet initVisibility) { UnsignedBitSet visibleNodesId = initVisibility.clone(); // todo mm? return new CollapsedGraph(delegateGraph, visibleNodesId, new EdgeStorage()); } diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedLinearGraphController.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedLinearGraphController.java index 1da5adbeb6e2..a82d5e011a72 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedLinearGraphController.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/collapsing/CollapsedLinearGraphController.java @@ -18,17 +18,22 @@ package com.intellij.vcs.log.graph.collapsing; import com.intellij.vcs.log.graph.api.LinearGraph; import com.intellij.vcs.log.graph.api.permanent.PermanentGraphInfo; import com.intellij.vcs.log.graph.impl.facade.CascadeLinearGraphController; +import com.intellij.vcs.log.graph.utils.UnsignedBitSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Set; + public class CollapsedLinearGraphController extends CascadeLinearGraphController { @NotNull private CollapsedGraph myCollapsedGraph; public CollapsedLinearGraphController(@NotNull CascadeLinearGraphController delegateLinearGraphController, - @NotNull final PermanentGraphInfo permanentGraphInfo) { + @NotNull final PermanentGraphInfo permanentGraphInfo, + @Nullable Set IdsOfVisibleBranches) { super(delegateLinearGraphController, permanentGraphInfo); - myCollapsedGraph = CollapsedGraph.newInstance(getDelegateLinearGraphController().getCompiledGraph(), null); + UnsignedBitSet initVisibility = BranchMatchedNodesGenerator.generateVisibleNodes(permanentGraphInfo.getPermanentLinearGraph(), IdsOfVisibleBranches); + myCollapsedGraph = CollapsedGraph.newInstance(getDelegateLinearGraphController().getCompiledGraph(), initVisibility); } @NotNull 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 392dbfebbcc8..5a924115c411 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 @@ -124,7 +124,11 @@ public class PermanentGraphImpl implements PermanentGraph, P if (matchedCommits != null) { controller = new FilterLinearGraphController(baseController, this, myPermanentCommitsInfo.convertToNodeIds(matchedCommits)); } else { - controller = new CollapsedLinearGraphController(baseController, this); + Set idOfVisibleBranches = null; + if (headsOfVisibleBranches != null) { + idOfVisibleBranches = myPermanentCommitsInfo.convertToNodeIds(headsOfVisibleBranches); + } + controller = new CollapsedLinearGraphController(baseController, this, idOfVisibleBranches); } return new VisibleGraphImpl(controller, this); @@ -165,7 +169,7 @@ public class PermanentGraphImpl implements PermanentGraph, P } @NotNull - public LinearGraph getPermanentLinearGraph() { + public PermanentLinearGraphImpl getPermanentLinearGraph() { return myPermanentLinearGraph; } diff --git a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/permanent/PermanentLinearGraphImpl.java b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/permanent/PermanentLinearGraphImpl.java index a2b54cd9d9cb..f7919027758e 100644 --- a/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/permanent/PermanentLinearGraphImpl.java +++ b/platform/vcs-log/graph/src/com/intellij/vcs/log/graph/impl/permanent/PermanentLinearGraphImpl.java @@ -24,8 +24,10 @@ import com.intellij.vcs.log.graph.api.elements.GraphEdgeType; import com.intellij.vcs.log.graph.api.elements.GraphNode; import com.intellij.vcs.log.graph.utils.Flags; import com.intellij.vcs.log.graph.utils.IntList; +import com.intellij.vcs.log.graph.utils.impl.BitSetFlags; import com.intellij.vcs.log.graph.utils.impl.CompressedIntList; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; import java.util.List; @@ -44,6 +46,11 @@ public class PermanentLinearGraphImpl implements LinearGraph { myLongEdges = CompressedIntList.newInstance(longEdges); } + @TestOnly + public PermanentLinearGraphImpl() { + this(new BitSetFlags(0), new int[0], new int[0]); + } + @Override public int nodesCount() { return mySimpleNodes.size(); diff --git a/platform/vcs-log/graph/test/com/intellij/vcs/log/graph/TestGraphBuilder.kt b/platform/vcs-log/graph/test/com/intellij/vcs/log/graph/TestGraphBuilder.kt index a9042707bc67..f0046299e2c8 100644 --- a/platform/vcs-log/graph/test/com/intellij/vcs/log/graph/TestGraphBuilder.kt +++ b/platform/vcs-log/graph/test/com/intellij/vcs/log/graph/TestGraphBuilder.kt @@ -36,6 +36,9 @@ import kotlin.test.assertTrue import kotlin.test.assertNull import com.intellij.vcs.log.graph.utils.LinearGraphUtils import com.intellij.vcs.log.graph.api.EdgeFilter +import com.intellij.vcs.log.graph.impl.permanent.PermanentLinearGraphImpl +import com.intellij.vcs.log.graph.utils.impl.BitSetFlags +import com.intellij.vcs.log.graph.utils.impl.FullIntList trait BaseTestGraphBuilder { val Int.U: SimpleNode get() = SimpleNode(this, GraphNodeType.USUAL) @@ -267,7 +270,7 @@ class TestPermanentGraphInfo( } override fun getPermanentCommitsInfo() = commitInfo - override fun getPermanentLinearGraph() = graph + override fun getPermanentLinearGraph() = object : PermanentLinearGraphImpl(), LinearGraph by graph {} override fun getPermanentGraphLayout() = graphLayout override fun getBranchNodeIds() = branchNodes