IDEA-115442 Empty lines appear in the log when filtering by branch

#IDEA-115442 Fixed

Drop edge node, append mechanism for graph.
Added arrows for long edges, when long edges showed.
This commit is contained in:
Erokhin Stanislav
2014-02-12 15:55:07 +04:00
committed by Kirill Likhodedov
parent 4a2d89c486
commit 445cf7f0b4
16 changed files with 73 additions and 534 deletions
@@ -22,14 +22,12 @@ public interface Node extends GraphElement {
/**
* @return if type == COMMIT_NODE - this commit.
* if type == EDGE_NODE - common Parent
* if type == END_COMMIT_NODE - parent of This Commit
*/
int getCommitIndex();
enum NodeType {
COMMIT_NODE,
EDGE_NODE,
END_COMMIT_NODE
}
@@ -1,126 +0,0 @@
package com.intellij.vcs.log.graph.mutable;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.vcs.log.GraphCommit;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.graph.mutable.elements.MutableNode;
import com.intellij.vcs.log.graph.mutable.elements.MutableNodeRow;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import static com.intellij.vcs.log.graph.elements.Node.NodeType.*;
/**
* @author erokhins
*/
//local package
public class GraphAppendBuilder {
private final MutableGraph graph;
private final Collection<VcsRef> myRefs;
public GraphAppendBuilder(MutableGraph graph, Collection<VcsRef> allRefs) {
this.graph = graph;
myRefs = allRefs;
}
private MutableNodeRow getLastRowInGraph() {
List<MutableNodeRow> allRows = graph.getAllRows();
assert !allRows.isEmpty() : "graph is empty!";
return allRows.get(allRows.size() - 1);
}
private boolean isSimpleEndOfGraph() {
List<MutableNodeRow> allRows = graph.getAllRows();
assert !allRows.isEmpty() : "graph is empty!";
MutableNodeRow lastRow = getLastRowInGraph();
boolean hasCommitNode = false;
for (MutableNode node : lastRow.getInnerNodeList()) {
if (node.getType() == COMMIT_NODE) {
hasCommitNode = true;
}
}
if (hasCommitNode) {
if (lastRow.getInnerNodeList().size() == 1) {
return true;
}
else {
throw new IllegalStateException("graph with commit node and more that 1 node in last row");
}
}
else {
return false;
}
}
private Map<Integer, MutableNode> fixUnderdoneNodes(int firstHash) {
Map<Integer, MutableNode> underdoneNodes = ContainerUtil.newHashMap();
List<MutableNode> nodesInLaseRow = getLastRowInGraph().getInnerNodeList();
MutableNode node;
for (Iterator<MutableNode> iterator = nodesInLaseRow.iterator(); iterator.hasNext(); ) {
node = iterator.next();
if (node.getType() != END_COMMIT_NODE) {
throw new IllegalStateException("bad last row in graph, unexpected node type: " + node.getType());
}
// i.e. it is EDGE_NODE
if (node.getInnerUpEdges().size() > 1) {
if (node.getCommitIndex() == firstHash) {
iterator.remove();
underdoneNodes.put(firstHash, node);
}
else {
node.setType(EDGE_NODE);
MutableNode newParentNode = new MutableNode(node.getBranch(), node.getCommitIndex());
GraphBuilder.createUsualEdge(node, newParentNode, node.getBranch());
underdoneNodes.put(node.getCommitIndex(), newParentNode);
}
}
else {
iterator.remove();
underdoneNodes.put(node.getCommitIndex(), node);
}
}
return underdoneNodes;
}
private void simpleAppend(@NotNull List<GraphCommit> commitParentses,
@NotNull MutableNodeRow nextRow,
@NotNull Map<Integer, MutableNode> underdoneNodes) {
int startIndex = nextRow.getRowIndex();
Map<Integer, Integer> commitLogIndexes = new HashMap<Integer, Integer>(commitParentses.size());
for (int i = 0; i < commitParentses.size(); i++) {
commitLogIndexes.put(commitParentses.get(i).getIndex(), i + startIndex);
}
GraphBuilder builder = createGraphBuilder(commitParentses, nextRow, underdoneNodes, startIndex, commitLogIndexes);
builder.runBuild(commitParentses);
}
@NotNull
protected GraphBuilder createGraphBuilder(List<GraphCommit> commitParentses, MutableNodeRow nextRow, Map<Integer, MutableNode> underdoneNodes,
int startIndex, Map<Integer, Integer> commitLogIndexes) {
return new GraphBuilder(commitParentses.size() + startIndex - 1, commitLogIndexes, graph, underdoneNodes, nextRow, myRefs);
}
public void appendToGraph(@NotNull List<GraphCommit> commitParentses) {
if (commitParentses.size() == 0) {
throw new IllegalArgumentException("Empty list commitParentses");
}
if (isSimpleEndOfGraph()) {
int startIndex = getLastRowInGraph().getRowIndex() + 1;
simpleAppend(commitParentses, new MutableNodeRow(graph, startIndex), new HashMap<Integer, MutableNode>());
}
else {
Map<Integer, MutableNode> underdoneNodes = fixUnderdoneNodes(commitParentses.get(0).getIndex());
MutableNodeRow lastRow = getLastRowInGraph();
graph.getAllRows().remove(graph.getAllRows().size() - 1);
simpleAppend(commitParentses, lastRow, underdoneNodes);
}
}
}
@@ -25,19 +25,10 @@ public class GraphBuilder {
@NotNull
public static MutableGraph build(@NotNull List<? extends GraphCommit> commitParentses, Collection<VcsRef> allRefs) {
GraphBuilder builder = new GraphBuilder(commitParentses.size() - 1, calcCommitLogIndices(commitParentses), allRefs);
GraphBuilder builder = new GraphBuilder(allRefs);
return builder.runBuild(commitParentses);
}
@NotNull
public static Map<Integer, Integer> calcCommitLogIndices(@NotNull List<? extends GraphCommit> commitParentses) {
Map<Integer, Integer> commitLogIndexes = new HashMap<Integer, Integer>(commitParentses.size());
for (int i = 0; i < commitParentses.size(); i++) {
commitLogIndexes.put(commitParentses.get(i).getIndex(), i);
}
return commitLogIndexes;
}
// local package
static void createUsualEdge(@NotNull MutableNode up, @NotNull MutableNode down, @NotNull Branch branch) {
UsualEdge edge = new UsualEdge(up, down, branch);
@@ -45,21 +36,13 @@ public class GraphBuilder {
down.getInnerUpEdges().add(edge);
}
private final int lastLogIndex;
private final MutableGraph graph;
private final Map<Integer, MutableNode> underdoneNodes;
private Map<Integer, Integer> commitHashLogIndexes;
private MultiMap<Integer, VcsRef> myRefsOfHashes;
private MutableNodeRow nextRow;
public GraphBuilder(int lastLogIndex,
Map<Integer, Integer> commitHashLogIndexes,
MutableGraph graph,
Map<Integer, MutableNode> underdoneNodes,
MutableNodeRow nextRow, Collection<VcsRef> refs) {
this.lastLogIndex = lastLogIndex;
this.commitHashLogIndexes = commitHashLogIndexes;
public GraphBuilder(MutableGraph graph, Map<Integer, MutableNode> underdoneNodes, MutableNodeRow nextRow, Collection<VcsRef> refs) {
this.graph = graph;
this.underdoneNodes = underdoneNodes;
this.nextRow = nextRow;
@@ -76,25 +59,15 @@ public class GraphBuilder {
return map;
}
public GraphBuilder(int lastLogIndex, Map<Integer, Integer> commitHashLogIndexes, MutableGraph graph, Collection<VcsRef> refs) {
this(lastLogIndex, commitHashLogIndexes, graph, new HashMap<Integer, MutableNode>(), new MutableNodeRow(graph, 0), refs);
public GraphBuilder(MutableGraph graph, Collection<VcsRef> refs) {
this(graph, new HashMap<Integer, MutableNode>(), new MutableNodeRow(graph, 0), refs);
}
public GraphBuilder(int lastLogIndex, Map<Integer, Integer> commitHashLogIndexes, Collection<VcsRef> refs) {
this(lastLogIndex, commitHashLogIndexes, new MutableGraph(), refs);
public GraphBuilder(Collection<VcsRef> refs) {
this(new MutableGraph(), refs);
}
private int getLogIndexOfCommit(@NotNull Integer commitHash) {
Integer index = commitHashLogIndexes.get(commitHash);
if (index == null) {
return lastLogIndex + 1;
}
else {
return index;
}
}
@NotNull
private Collection<VcsRef> findRefForHash(int hash) {
return myRefsOfHashes.get(hash);
@@ -133,31 +106,12 @@ public class GraphBuilder {
MutableNode parentNode = underdoneNodes.remove(parentHash);
if (parentNode == null) {
parentNode = createNode(parentHash, branch);
createUsualEdge(node, parentNode, branch);
underdoneNodes.put(parentHash, parentNode);
}
else {
createUsualEdge(node, parentNode, branch);
int parentRowIndex = getLogIndexOfCommit(parentHash);
// i.e. we need of create EDGE_NODE node
if (nextRow.getRowIndex() != parentRowIndex) {
parentNode.setNodeRow(nextRow);
parentNode.setType(EDGE_NODE);
nextRow.getInnerNodeList().add(parentNode);
MutableNode newParentNode = createNode(parentHash, parentNode.getBranch());
createUsualEdge(parentNode, newParentNode, parentNode.getBranch());
underdoneNodes.put(parentHash, newParentNode);
}
else {
// i.e. node must be added in nextRow, when addCurrentCommitAndFinishRow() will called in next time
underdoneNodes.put(parentHash, parentNode);
}
}
createUsualEdge(node, parentNode, branch);
underdoneNodes.put(parentHash, parentNode);
}
private MutableNode createNode(int hash, Branch branch) {
private static MutableNode createNode(int hash, Branch branch) {
return new MutableNode(branch, hash);
}
@@ -18,8 +18,6 @@ public interface GraphModel {
@NotNull
public Graph getGraph();
public void appendCommitsToGraph(@NotNull List<GraphCommit> commitParentses);
public void setVisibleBranchesNodes(@NotNull Function<Node, Boolean> isStartedNode);
@NotNull
@@ -53,10 +53,6 @@ public class ShortFragmentGenerator {
@Nullable
public GraphFragment getDownShortFragment(@NotNull Node startNode) {
if (startNode.getType() == Node.NodeType.EDGE_NODE) {
throw new IllegalArgumentException("small fragment may start only with COMMIT_NODE, but this node is: " + startNode);
}
Set<Node> upNodes = new HashSet<Node>();
upNodes.add(startNode);
Set<Node> notAddedNodes = new HashSet<Node>();
@@ -122,10 +118,6 @@ public class ShortFragmentGenerator {
@Nullable
public GraphFragment getUpShortFragment(@NotNull Node startNode) {
if (startNode.getType() == Node.NodeType.EDGE_NODE) {
throw new IllegalArgumentException("small fragment may start only with COMMIT_NODE, but this node is: " + startNode);
}
Set<Node> downNodes = new HashSet<Node>();
downNodes.add(startNode);
Set<Node> notAddedNodes = new HashSet<Node>();
@@ -1,74 +0,0 @@
package com.intellij.vcs.log.graphmodel.impl;
import com.intellij.vcs.log.graph.elements.Edge;
import com.intellij.vcs.log.graph.elements.Node;
import com.intellij.vcs.log.graph.mutable.GraphDecorator;
import com.intellij.vcs.log.graph.mutable.elements.MutableNode;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.ListIterator;
/**
* @author erokhins
*/
public class BadVisibleEdgeNodeFixer implements GraphDecorator {
private final GraphDecorator decorator;
public BadVisibleEdgeNodeFixer(GraphDecorator decorator) {
this.decorator = decorator;
}
private boolean isVisibleBadEdgeNode(@NotNull Node node) {
if (node.getType() != Node.NodeType.EDGE_NODE || decorator.isVisibleNode(node)) {
return false;
}
boolean isBad = false;
for (Edge edge : ((MutableNode)node).getInnerUpEdges()) {
Node upNode = edge.getUpNode();
if (!decorator.isVisibleNode(upNode) || isVisibleBadEdgeNode(upNode)) {
isBad = true;
}
}
return isBad;
}
@Override
public boolean isVisibleNode(@NotNull Node node) {
if (isVisibleBadEdgeNode(node)) {
return false;
}
return decorator.isVisibleNode(node);
}
@NotNull
private Node getDownNode(@NotNull Node edgeNode) {
return decorator.getDownEdges(edgeNode, ((MutableNode)edgeNode).getInnerDownEdges()).get(0).getDownNode();
}
@NotNull
@Override
public List<Edge> getDownEdges(@NotNull Node node, @NotNull List<Edge> innerDownEdges) {
List<Edge> prevDownEdges = decorator.getDownEdges(node, innerDownEdges);
for (ListIterator<Edge> edgeIterator = prevDownEdges.listIterator(); edgeIterator.hasNext(); ) {
Edge edge = edgeIterator.next();
if (isVisibleBadEdgeNode(edge.getDownNode())) {
Node downNode = edge.getDownNode();
while (isVisibleBadEdgeNode(downNode)) {
downNode = getDownNode(downNode);
}
Edge newEdge = null;
edgeIterator.set(newEdge);
}
}
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@NotNull
@Override
public List<Edge> getUpEdges(@NotNull Node node, @NotNull List<Edge> innerUpEdges) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
}
@@ -3,12 +3,9 @@ package com.intellij.vcs.log.graphmodel.impl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.util.Consumer;
import com.intellij.util.Function;
import com.intellij.vcs.log.GraphCommit;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.compressedlist.UpdateRequest;
import com.intellij.vcs.log.graph.Graph;
import com.intellij.vcs.log.graph.elements.Node;
import com.intellij.vcs.log.graph.mutable.GraphAppendBuilder;
import com.intellij.vcs.log.graph.mutable.MutableGraph;
import com.intellij.vcs.log.graphmodel.FragmentManager;
import com.intellij.vcs.log.graphmodel.GraphModel;
@@ -16,7 +13,6 @@ import com.intellij.vcs.log.graphmodel.fragment.FragmentManagerImpl;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -25,7 +21,6 @@ import java.util.Set;
*/
public class GraphModelImpl implements GraphModel {
private final MutableGraph graph;
private final Collection<VcsRef> myRefs;
private final FragmentManagerImpl fragmentManager;
private final BranchVisibleNodes visibleNodes;
private final List<Consumer<UpdateRequest>> listeners = new ArrayList<Consumer<UpdateRequest>>();
@@ -41,9 +36,8 @@ public class GraphModelImpl implements GraphModel {
}
};
public GraphModelImpl(MutableGraph graph, Collection<VcsRef> allRefs) {
public GraphModelImpl(MutableGraph graph) {
this.graph = graph;
myRefs = allRefs;
this.fragmentManager = new FragmentManagerImpl(graph, new FragmentManagerImpl.CallBackFunction() {
@Override
public UpdateRequest runIntermediateUpdate(@NotNull Node upNode, @NotNull Node downNode) {
@@ -103,17 +97,6 @@ public class GraphModelImpl implements GraphModel {
return graph;
}
@Override
public void appendCommitsToGraph(@NotNull List<GraphCommit> commitParentses) {
int oldSize = graph.getNodeRows().size();
new GraphAppendBuilder(graph, myRefs).appendToGraph(commitParentses);
visibleNodes.setVisibleNodes(visibleNodes.generateVisibleBranchesNodes(isStartedBranchVisibilityNode));
graph.updateVisibleRows();
UpdateRequest updateRequest = UpdateRequest.buildFromToInterval(0, oldSize - 1, 0, graph.getNodeRows().size() - 1);
callUpdateListener(updateRequest);
}
@Override
public void setVisibleBranchesNodes(@NotNull Function<Node, Boolean> isStartedNode) {
this.isStartedBranchVisibilityNode = isStartedNode;
@@ -18,7 +18,7 @@ import static com.intellij.vcs.log.printmodel.impl.GraphElementsVisibilityContro
class GraphElementsVisibilityController {
private static final int LONG_EDGE = 20;
private static final int EDGE_PART_SHOW = 1;
private static final boolean SHOW_ARROW_WHEN_SHOW_LONG_EDGES = true;
private final LayoutModel layoutModel;
private boolean hideLongEdge;
@@ -34,7 +34,7 @@ class GraphElementsVisibilityController {
@NotNull
public VisibilityType visibilityTypeEdge(Edge edge, int rowIndex) {
if (!hideLongEdge) {
if (!hideLongEdge && !SHOW_ARROW_WHEN_SHOW_LONG_EDGES) {
return USUAL;
}
int upRowIndex = edge.getUpNode().getRowIndex();
@@ -55,7 +55,11 @@ class GraphElementsVisibilityController {
return FIRST_VISIBLE;
}
return HIDE;
if (hideLongEdge) {
return HIDE;
} else {
return USUAL;
}
}
@NotNull
@@ -84,13 +84,11 @@ class PrePrintCellModel {
break;
case LAST_VISIBLE:
specialPrintElements
.add(new SpecialPrintElement(edge, i, SpecialPrintElement.Type.DOWN_ARROW, selectController.isSelected(edge), isMarked(edge),
0));
.add(new SpecialPrintElement(edge, i, SpecialPrintElement.Type.DOWN_ARROW, selectController.isSelected(edge), isMarked(edge), 0));
break;
case FIRST_VISIBLE:
specialPrintElements
.add(new SpecialPrintElement(edge, i, SpecialPrintElement.Type.UP_ARROW, selectController.isSelected(edge), isMarked(edge),
0));
.add(new SpecialPrintElement(edge, i, SpecialPrintElement.Type.UP_ARROW, selectController.isSelected(edge), isMarked(edge), 0));
break;
default:
throw new IllegalStateException();
@@ -130,31 +128,21 @@ class PrePrintCellModel {
}
private static class GetterGraphElementPosition {
private final Map<Node, Integer> mapNodes = new HashMap<Node, Integer>();
private final Map<GraphElement, Integer> mapNodes = new HashMap<GraphElement, Integer>();
public GetterGraphElementPosition(List<GraphElement> graphElements) {
mapNodes.clear();
for (int p = 0; p < graphElements.size(); p++) {
mapNodes.put(getDownNode(graphElements.get(p)), p);
}
}
private Node getDownNode(@NotNull GraphElement element) {
Node node = element.getNode();
if (node != null) {
return node;
}
else {
Edge edge = element.getEdge();
if (edge == null) {
throw new IllegalStateException();
}
return edge.getDownNode();
mapNodes.put(graphElements.get(p), p);
}
}
public int getPosition(Edge edge) {
Integer p = mapNodes.get(edge.getDownNode());
Integer p = mapNodes.get(edge);
if (p == null) {
p = mapNodes.get(edge.getDownNode());
}
if (p == null) {
// i.e. hide branch
return -1;
@@ -47,7 +47,7 @@ public class GraphTestUtils {
@NotNull
public static MutableGraph buildGraph(@NotNull List<GraphCommit> commitParentses, @NotNull List<VcsRef> refs) {
GraphBuilder builder = new GraphBuilder(commitParentses.size() - 1, GraphBuilder.calcCommitLogIndices(commitParentses), refs) {
GraphBuilder builder = new GraphBuilder(refs) {
@NotNull
@Override
protected Branch createBranch(int commitHash, @NotNull Collection<VcsRef> refs) {
@@ -1,159 +0,0 @@
package com.intellij.vcs.log.graph.mutable;
import com.intellij.vcs.log.GraphCommit;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.graph.GraphTestUtils;
import com.intellij.vcs.log.graph.elements.Branch;
import com.intellij.vcs.log.graph.mutable.elements.MutableNode;
import com.intellij.vcs.log.graph.mutable.elements.MutableNodeRow;
import com.intellij.vcs.log.parser.SimpleCommitListParser;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.intellij.vcs.log.graph.GraphStrUtils.toStr;
import static junit.framework.Assert.assertEquals;
/**
* @author erokhins
*/
public class GraphAppendBuildTest {
public void runTest(String firstPart, String firstPartStr, String secondPart, String secondPartStr) {
List<GraphCommit> vcsCommitParentses = SimpleCommitListParser.parseCommitList(firstPart);
final MutableGraph graph = GraphTestUtils.buildGraph(vcsCommitParentses, Collections.<VcsRef>emptyList());
assertEquals(firstPartStr, toStr(graph));
vcsCommitParentses = SimpleCommitListParser.parseCommitList(secondPart);
new GraphAppendBuilder(graph, makeRefs(firstPart)) {
@NotNull
@Override
protected GraphBuilder createGraphBuilder(List<GraphCommit> commitParentses, MutableNodeRow nextRow,
Map<Integer, MutableNode> underdoneNodes, int startIndex,
Map<Integer, Integer> commitLogIndexes) {
return new GraphBuilder(commitParentses.size() + startIndex - 1, commitLogIndexes, graph, underdoneNodes, nextRow,
Collections.<VcsRef>emptyList()) {
@NotNull
@Override
protected Branch createBranch(int commitHash, @NotNull Collection<VcsRef> refs) {
return GraphTestUtils.createBranchWithFakeRoot(commitHash, refs);
}
};
}
}.appendToGraph(vcsCommitParentses);
assertEquals(secondPartStr, toStr(graph));
}
private static Collection<VcsRef> makeRefs(String log) {
return null;
}
@Test
public void simpleEnd() {
runTest("a0|-",
"a0|-|-|-COMMIT_NODE|-a0|-0",
"a1|-",
"a0|-|-|-COMMIT_NODE|-a0|-0\n" + "a1|-|-|-COMMIT_NODE|-a1|-1");
}
@Test
public void oneEndNode() {
runTest("a0|-a2",
"a0|-|-a0:a2:USUAL:a0|-COMMIT_NODE|-a0|-0\n" + "a2|-a0:a2:USUAL:a0|-|-END_COMMIT_NODE|-a0|-1",
"a1|-a2\n" + "a2|-",
"a0|-|-a0:a2:USUAL:a0|-COMMIT_NODE|-a0|-0\n" +
"a1|-|-a1:a2:USUAL:a1|-COMMIT_NODE|-a1|-1\n" +
"a2|-a0:a2:USUAL:a0 a1:a2:USUAL:a1|-|-COMMIT_NODE|-a0|-2");
}
@Test
public void oneEndAfterNotAddNode() {
runTest("a0|-a2",
"a0|-|-a0:a2:USUAL:a0|-COMMIT_NODE|-a0|-0\n" + "a2|-a0:a2:USUAL:a0|-|-END_COMMIT_NODE|-a0|-1",
"a1|-a2", "a0|-|-a0:a2:USUAL:a0|-COMMIT_NODE|-a0|-0\n" +
"a1|-|-a1:a2:USUAL:a1|-COMMIT_NODE|-a1|-1\n" +
"a2|-a0:a2:USUAL:a0 a1:a2:USUAL:a1|-|-END_COMMIT_NODE|-a0|-2");
}
@Test
public void oneEndImmediatelyAddNode() {
runTest("a0|-a1",
"a0|-|-a0:a1:USUAL:a0|-COMMIT_NODE|-a0|-0\n" + "a1|-a0:a1:USUAL:a0|-|-END_COMMIT_NODE|-a0|-1",
"a1|-",
"a0|-|-a0:a1:USUAL:a0|-COMMIT_NODE|-a0|-0\n" + "a1|-a0:a1:USUAL:a0|-|-COMMIT_NODE|-a0|-1"
);
}
@Test
public void oneEndImmediatelyAddNode2() {
runTest("a0|-a1",
"a0|-|-a0:a1:USUAL:a0|-COMMIT_NODE|-a0|-0\n" + "a1|-a0:a1:USUAL:a0|-|-END_COMMIT_NODE|-a0|-1",
"a1|-a2\n" + "a2|-",
"a0|-|-a0:a1:USUAL:a0|-COMMIT_NODE|-a0|-0\n" +
"a1|-a0:a1:USUAL:a0|-a1:a2:USUAL:a0|-COMMIT_NODE|-a0|-1\n" +
"a2|-a1:a2:USUAL:a0|-|-COMMIT_NODE|-a0|-2"
);
}
@Test
public void edgeNodeInEndImmediately() {
runTest("a0|-a2\n" + "a1|-a2",
"a0|-|-a0:a2:USUAL:a0|-COMMIT_NODE|-a0|-0\n" +
"a1|-|-a1:a2:USUAL:a1|-COMMIT_NODE|-a1|-1\n" +
"a2|-a0:a2:USUAL:a0 a1:a2:USUAL:a1|-|-END_COMMIT_NODE|-a0|-2",
"a2|-",
"a0|-|-a0:a2:USUAL:a0|-COMMIT_NODE|-a0|-0\n" +
"a1|-|-a1:a2:USUAL:a1|-COMMIT_NODE|-a1|-1\n" +
"a2|-a0:a2:USUAL:a0 a1:a2:USUAL:a1|-|-COMMIT_NODE|-a0|-2");
}
@Test
public void edgeNodeInEnd() {
runTest("a0|-a3\n" + "a1|-a3",
"a0|-|-a0:a3:USUAL:a0|-COMMIT_NODE|-a0|-0\n" +
"a1|-|-a1:a3:USUAL:a1|-COMMIT_NODE|-a1|-1\n" +
"a3|-a0:a3:USUAL:a0 a1:a3:USUAL:a1|-|-END_COMMIT_NODE|-a0|-2",
"a2|-a3",
"a0|-|-a0:a3:USUAL:a0|-COMMIT_NODE|-a0|-0\n" +
"a1|-|-a1:a3:USUAL:a1|-COMMIT_NODE|-a1|-1\n" +
"a2|-|-a2:a3:USUAL:a2|-COMMIT_NODE|-a2|-2\n" +
" a3|-a0:a3:USUAL:a0 a1:a3:USUAL:a1|-a3:a3:USUAL:a0|-EDGE_NODE|-a0|-2\n" +
"a3|-a2:a3:USUAL:a2 a3:a3:USUAL:a0|-|-END_COMMIT_NODE|-a0|-3");
}
}
@@ -71,8 +71,7 @@ public class GraphBuilderTest {
"a0|-|-a0:a1:USUAL:a0#a1 a0:a3:USUAL:a0#a3|-COMMIT_NODE|-a0|-0\n" +
"a1|-a0:a1:USUAL:a0#a1|-a1:a2:USUAL:a1#a2 a1:a3:USUAL:a1#a3|-COMMIT_NODE|-a0#a1|-1\n" +
"a2|-a1:a2:USUAL:a1#a2|-|-COMMIT_NODE|-a1#a2|-2\n" +
" a3|-a0:a3:USUAL:a0#a3 a1:a3:USUAL:a1#a3|-a3:a3:USUAL:a0#a3|-EDGE_NODE|-a0#a3|-2\n" +
"a3|-a3:a3:USUAL:a0#a3|-|-COMMIT_NODE|-a0#a3|-3");
"a3|-a0:a3:USUAL:a0#a3 a1:a3:USUAL:a1#a3|-|-COMMIT_NODE|-a0#a3|-3");
}
@Test
@@ -85,8 +84,7 @@ public class GraphBuilderTest {
"a0|-|-a0:a1:USUAL:a0#a1 a0:a3:USUAL:a0#a3|-COMMIT_NODE|-a0|-0\n" +
"a1|-a0:a1:USUAL:a0#a1|-a1:a3:USUAL:a0#a1|-COMMIT_NODE|-a0#a1|-1\n" +
"a2|-|-|-COMMIT_NODE|-a2|-2\n" +
" a3|-a0:a3:USUAL:a0#a3 a1:a3:USUAL:a0#a1|-a3:a3:USUAL:a0#a3|-EDGE_NODE|-a0#a3|-2\n" +
"a3|-a3:a3:USUAL:a0#a3|-|-COMMIT_NODE|-a0#a3|-3");
"a3|-a0:a3:USUAL:a0#a3 a1:a3:USUAL:a0#a1|-|-COMMIT_NODE|-a0#a3|-3");
}
@Test
@@ -1,7 +1,6 @@
package com.intellij.vcs.log.graphmodel.fragment;
import com.intellij.util.Function;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.graph.GraphTestUtils;
import com.intellij.vcs.log.graph.elements.Node;
import com.intellij.vcs.log.graph.mutable.MutableGraph;
@@ -14,7 +13,6 @@ import org.jetbrains.annotations.Nullable;
import org.junit.Before;
import org.junit.Test;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@@ -35,7 +33,7 @@ public class GraphModelTest {
@NotNull
public GraphModel buildGraphModel(@NotNull String inputGraph) {
MutableGraph graph = GraphTestUtils.getNewMutableGraph(inputGraph);
return new GraphModelImpl(graph, Collections.<VcsRef>emptyList());
return new GraphModelImpl(graph);
}
@@ -116,10 +114,10 @@ public class GraphModelTest {
* | |
* | a8
* | /
* * a9
* | /
* * a10
* | |
* | | a9
* | | /
* | || a10
* |// /
* a11 |
* | |
* a12 |
@@ -169,11 +167,9 @@ public class GraphModelTest {
"a6|-a2:a6:USUAL:a2#a6 a5:a6:USUAL:a3|-a6:a7:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-6\n" +
"a7|-a6:a7:USUAL:a2#a6|-a7:a8:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-7\n" +
"a8|-a7:a8:USUAL:a2#a6|-a8:a11:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-8\n" +
"a11|-a2:a11:USUAL:a2#a11 a8:a11:USUAL:a2#a6|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-9\n" +
" a9|-|-a9:a11:USUAL:a9|-COMMIT_NODE|-a9|-9\n" +
"a9|-|-a9:a11:USUAL:a9|-COMMIT_NODE|-a9|-9\n" +
"a10|-|-a10:a13:USUAL:a10|-COMMIT_NODE|-a10|-10\n" +
" a11|-a11:a11:USUAL:a2#a11 a9:a11:USUAL:a9|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-10\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-11\n" +
"a11|-a2:a11:USUAL:a2#a11 a8:a11:USUAL:a2#a6 a9:a11:USUAL:a9|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-11\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-12\n" +
"a13|-a10:a13:USUAL:a10|-a13:a14:USUAL:a10|-COMMIT_NODE|-a10|-13\n" +
"a14|-a13:a14:USUAL:a10|-a14:a15:USUAL:a10|-COMMIT_NODE|-a10|-14\n" +
@@ -286,13 +282,11 @@ public class GraphModelTest {
"a6|-a2:a6:USUAL:a2#a6|-a6:a7:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-3\n" +
"a7|-a6:a7:USUAL:a2#a6|-a7:a8:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-4\n" +
"a8|-a7:a8:USUAL:a2#a6|-a8:a11:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-5\n" +
"a11|-a2:a11:USUAL:a2#a11 a8:a11:USUAL:a2#a6|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-6\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-7\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-8\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-9\n" +
"a15|-a12:a15:USUAL:a2#a11|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-10\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-11\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-12"
"a11|-a2:a11:USUAL:a2#a11 a8:a11:USUAL:a2#a6|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-6\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-7\n" +
"a15|-a12:a15:USUAL:a2#a11|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-8\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-9\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-10"
);
}
@@ -314,16 +308,14 @@ public class GraphModelTest {
"a6|-a5:a6:USUAL:a3|-a6:a7:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-3\n" +
"a7|-a6:a7:USUAL:a2#a6|-a7:a8:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-4\n" +
"a8|-a7:a8:USUAL:a2#a6|-a8:a11:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-5\n" +
"a11|-a8:a11:USUAL:a2#a6|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-6\n" +
"a10|-|-a10:a13:USUAL:a10|-COMMIT_NODE|-a10|-7\n" +
" a11|-a11:a11:USUAL:a2#a11|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-7\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-8\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-9\n" +
"a13|-a10:a13:USUAL:a10|-a13:a14:USUAL:a10|-COMMIT_NODE|-a10|-10\n" +
"a14|-a13:a14:USUAL:a10|-a14:a15:USUAL:a10|-COMMIT_NODE|-a10|-11\n" +
"a15|-a12:a15:USUAL:a2#a11 a14:a15:USUAL:a10|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-12\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-13\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-14"
"a10|-|-a10:a13:USUAL:a10|-COMMIT_NODE|-a10|-6\n" +
"a11|-a8:a11:USUAL:a2#a6|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-7\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-8\n" +
"a13|-a10:a13:USUAL:a10|-a13:a14:USUAL:a10|-COMMIT_NODE|-a10|-9\n" +
"a14|-a13:a14:USUAL:a10|-a14:a15:USUAL:a10|-COMMIT_NODE|-a10|-10\n" +
"a15|-a12:a15:USUAL:a2#a11 a14:a15:USUAL:a10|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-11\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-12\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-13"
);
}
@@ -339,12 +331,11 @@ public class GraphModelTest {
startNodes,
"a9|-|-a9:a11:USUAL:a9|-COMMIT_NODE|-a9|-0\n" +
"a11|-a9:a11:USUAL:a9|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-1\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-2\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-3\n" +
"a15|-a12:a15:USUAL:a2#a11|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-4\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-5\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-6"
"a11|-a9:a11:USUAL:a9|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-1\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-2\n" +
"a15|-a12:a15:USUAL:a2#a11|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-3\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-4\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-5"
);
}
@@ -470,11 +461,9 @@ public class GraphModelTest {
"a3|-|-a3:a8:HIDE_FRAGMENT:a3|-COMMIT_NODE|-a3|-0\n" +
"a8|-a3:a8:HIDE_FRAGMENT:a3|-a8:a11:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-1\n" +
"a11|-a8:a11:USUAL:a2#a6|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-2\n" +
" a9|-|-a9:a11:USUAL:a9|-COMMIT_NODE|-a9|-2\n" +
"a9|-|-a9:a11:USUAL:a9|-COMMIT_NODE|-a9|-2\n" +
"a10|-|-a10:a13:USUAL:a10|-COMMIT_NODE|-a10|-3\n" +
" a11|-a11:a11:USUAL:a2#a11 a9:a11:USUAL:a9|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-3\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-4\n" +
"a11|-a8:a11:USUAL:a2#a6 a9:a11:USUAL:a9|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-4\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-5\n" +
"a13|-a10:a13:USUAL:a10|-a13:a14:USUAL:a10|-COMMIT_NODE|-a10|-6\n" +
"a14|-a13:a14:USUAL:a10|-a14:a15:USUAL:a10|-COMMIT_NODE|-a10|-7\n" +
@@ -527,13 +516,11 @@ public class GraphModelTest {
"a6|-a2:a6:USUAL:a2#a6|-a6:a7:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-3\n" +
"a7|-a6:a7:USUAL:a2#a6|-a7:a8:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-4\n" +
"a8|-a7:a8:USUAL:a2#a6|-a8:a11:USUAL:a2#a6|-COMMIT_NODE|-a2#a6|-5\n" +
"a11|-a2:a11:USUAL:a2#a11 a8:a11:USUAL:a2#a6|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-6\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a11:USUAL:a2#a11|-EDGE_NODE|-a2#a11|-7\n" +
"a11|-a11:a11:USUAL:a2#a11|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-8\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-9\n" +
"a15|-a12:a15:USUAL:a2#a11|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-10\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-11\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-12",
"a11|-a2:a11:USUAL:a2#a11 a8:a11:USUAL:a2#a6|-a11:a12:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-6\n" +
"a12|-a11:a12:USUAL:a2#a11|-a12:a15:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-7\n" +
"a15|-a12:a15:USUAL:a2#a11|-a15:a16:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-8\n" +
"a16|-a15:a16:USUAL:a2#a11|-a16:a17:USUAL:a2#a11|-COMMIT_NODE|-a2#a11|-9\n" +
"a17|-a16:a17:USUAL:a2#a11|-|-COMMIT_NODE|-a2#a11|-10",
toStr(hardGraph.getGraph())
);
@@ -203,11 +203,11 @@ public class ShortFragmentTest {
public void edgeNodesDown() {
runTest(
"a0|-a3 a1\n" +
"a1|-a2 a3\n" +
"a2|-a3\n" +
"a3|-",
"a1|-a2 a3\n" +
"a2|-a3\n" +
"a3|-",
0,
"a0:0|-a1:1 a2:2 a3:2|-a3:3",
"a0:0|-a1:1 a2:2|-a3:3",
true
);
}
@@ -220,7 +220,7 @@ public class ShortFragmentTest {
"a2|-a3\n" +
"a3|-",
3,
"a0:0|-a1:1 a2:2 a3:2|-a3:3",
"a0:0|-a1:1 a2:2|-a3:3",
false
);
}
@@ -258,11 +258,11 @@ public class ShortFragmentTest {
public void unhiddenEndTestDown() {
runTest(
"a0|-a3 a1\n" +
"a1|-a2 a3\n" +
"a2|-a3\n" +
"a3|-",
"a1|-a2 a3\n" +
"a2|-a3\n" +
"a3|-",
0,
"a0:0|-a1:1 a2:2 a3:2|-a3:3",
"a0:0|-a1:1 a2:2|-a3:3",
"0 3",
true
);
@@ -277,7 +277,7 @@ public class ShortFragmentTest {
"a2|-a3\n" +
"a3|-",
3,
"a0:0|-a1:1 a2:2 a3:2|-a3:3",
"a0:0|-a1:1 a2:2|-a3:3",
"0 3",
false
);
@@ -44,7 +44,7 @@ public class LayoutModelBuilderTest {
"a3 a1:a4 a2:a8 a2:a5\n" +
"a3:a6 a4 a2:a8 a2:a5\n" +
"a3:a6 a4:a7 a2:a8 a5\n" +
"a6 a7 a2:a8\n" +
"a6 a4:a7 a2:a8 a5:a7\n" +
"a7 a2:a8\n" +
"a8");
@@ -42,7 +42,7 @@ public class DataPack {
MutableGraph graph = GraphBuilder.build(commits, allRefs);
GraphModel graphModel = new GraphModelImpl(graph, allRefs);
GraphModel graphModel = new GraphModelImpl(graph);
final GraphPrintCellModel printCellModel = new GraphPrintCellModelImpl(graphModel.getGraph());
graphModel.addUpdateListener(new Consumer<UpdateRequest>() {
@@ -77,10 +77,6 @@ public class DataPack {
myIndexGetter = indexGetter;
}
public void appendCommits(@NotNull List<GraphCommit> commitParentsList) {
myGraphModel.appendCommitsToGraph(commitParentsList);
}
@NotNull
public RefsModel getRefsModel() {
return myRefsModel;