| 220 | } |
| 221 | |
| 222 | function determinePath(vertices, branches, availableColours, commits, commitLookup, onlyFollowFirstParent) { |
| 223 | function run(startAt) { |
| 224 | let i = startAt; |
| 225 | let vertex = vertices[i]; |
| 226 | let parentVertex = vertex.getNextParent(); |
| 227 | let lastPoint = vertex.isNotOnBranch() ? vertex.getNextPoint() : vertex.getPoint(); |
| 228 | |
| 229 | if (parentVertex !== null && parentVertex.id !== NULL_VERTEX_ID && vertex.isMerge() && !vertex.isNotOnBranch() && !parentVertex.isNotOnBranch()) { |
| 230 | var parentBranch = parentVertex.getBranch(); |
| 231 | var foundPointToParent = false; |
| 232 | for (i = startAt + 1; i < vertices.length; i++) { |
| 233 | var curVertex = vertices[i]; |
| 234 | var curPoint = curVertex.getPointConnectingTo(parentVertex, parentBranch); |
| 235 | if (curPoint === null) curPoint = curVertex.getNextPoint(); |
| 236 | parentBranch.addLine(lastPoint, curPoint, vertex.getIsCommitted(), !foundPointToParent && curVertex !== parentVertex ? lastPoint.x < curPoint.x : true); |
| 237 | curVertex.registerUnavailablePoint(curPoint.x, parentVertex, parentBranch); |
| 238 | lastPoint = curPoint; |
| 239 | if (curVertex.getPointConnectingTo(parentVertex, parentBranch) !== null) foundPointToParent = true; |
| 240 | if (foundPointToParent) { |
| 241 | vertex.registerParentProcessed(); |
| 242 | return; |
| 243 | } |
| 244 | } |
| 245 | } else { |
| 246 | var branch = new Branch(getAvailableColour(availableColours, startAt)); |
| 247 | vertex.addToBranch(branch, lastPoint.x); |
| 248 | vertex.registerUnavailablePoint(lastPoint.x, vertex, branch); |
| 249 | for (i = startAt + 1; i < vertices.length; i++) { |
| 250 | var curVertex = vertices[i]; |
| 251 | var curPoint = (parentVertex === curVertex && parentVertex && !parentVertex.isNotOnBranch()) ? curVertex.getPoint() : curVertex.getNextPoint(); |
| 252 | branch.addLine(lastPoint, curPoint, vertex.getIsCommitted(), lastPoint.x < curPoint.x); |
| 253 | curVertex.registerUnavailablePoint(curPoint.x, parentVertex, branch); |
| 254 | lastPoint = curPoint; |
| 255 | if (parentVertex === curVertex) { |
| 256 | vertex.registerParentProcessed(); |
| 257 | var parentVertexOnBranch = parentVertex && !parentVertex.isNotOnBranch(); |
| 258 | parentVertex.addToBranch(branch, curPoint.x); |
| 259 | vertex = parentVertex; |
| 260 | parentVertex = vertex.getNextParent(); |
| 261 | if (parentVertex === null || parentVertexOnBranch) return; |
| 262 | } |
| 263 | } |
| 264 | if (i === vertices.length && parentVertex !== null && parentVertex.id === NULL_VERTEX_ID) { |
| 265 | vertex.registerParentProcessed(); |
| 266 | } |
| 267 | branches.push(branch); |
| 268 | availableColours[branch.getColour()] = i; |
| 269 | } |
| 270 | } |
| 271 | |
| 272 | var idx = 0; |
| 273 | while (idx < vertices.length) { |
| 274 | var v = vertices[idx]; |
| 275 | if (v.getNextParent() !== null || v.isNotOnBranch()) { |
| 276 | run(idx); |
| 277 | } else { |
| 278 | idx++; |
| 279 | } |