To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / public / javascripts / revision_graph.js @ 1298:4f746d8966dd
History | View | Annotate | Download (3.73 KB)
| 1 | 1115:433d4f72a19b | Chris | var revisionGraph = null; |
|---|---|---|---|
| 2 | |||
| 3 | function drawRevisionGraph(holder, commits_hash, graph_space) { |
||
| 4 | var XSTEP = 20, |
||
| 5 | CIRCLE_INROW_OFFSET = 10;
|
||
| 6 | var commits_by_scmid = commits_hash,
|
||
| 7 | commits = $.map(commits_by_scmid, function(val,i){return val;}); |
||
| 8 | var max_rdmid = commits.length - 1; |
||
| 9 | var commit_table_rows = $('table.changesets tr.changeset'); |
||
| 10 | |||
| 11 | // create graph
|
||
| 12 | if(revisionGraph != null) |
||
| 13 | revisionGraph.clear(); |
||
| 14 | else
|
||
| 15 | revisionGraph = Raphael(holder); |
||
| 16 | |||
| 17 | var top = revisionGraph.set();
|
||
| 18 | // init dimensions
|
||
| 19 | var graph_x_offset = commit_table_rows.first().find('td').first().position().left - $(holder).position().left, |
||
| 20 | graph_y_offset = $(holder).position().top,
|
||
| 21 | graph_right_side = graph_x_offset + (graph_space + 1) * XSTEP,
|
||
| 22 | graph_bottom = commit_table_rows.last().position().top + commit_table_rows.last().height() - graph_y_offset; |
||
| 23 | |||
| 24 | revisionGraph.setSize(graph_right_side, graph_bottom); |
||
| 25 | |||
| 26 | // init colors
|
||
| 27 | var colors = [];
|
||
| 28 | Raphael.getColor.reset(); |
||
| 29 | for (var k = 0; k <= graph_space; k++) { |
||
| 30 | colors.push(Raphael.getColor()); |
||
| 31 | 909:cbb26bc654de | Chris | } |
| 32 | |||
| 33 | 1115:433d4f72a19b | Chris | var parent_commit;
|
| 34 | var x, y, parent_x, parent_y;
|
||
| 35 | var path, title;
|
||
| 36 | var revision_dot_overlay;
|
||
| 37 | $.each(commits, function(index, commit) { |
||
| 38 | if (!commit.hasOwnProperty("space")) |
||
| 39 | commit.space = 0;
|
||
| 40 | 909:cbb26bc654de | Chris | |
| 41 | 1115:433d4f72a19b | Chris | y = commit_table_rows.eq(max_rdmid - commit.rdmid).position().top - graph_y_offset + CIRCLE_INROW_OFFSET; |
| 42 | x = graph_x_offset + XSTEP / 2 + XSTEP * commit.space;
|
||
| 43 | revisionGraph.circle(x, y, 3)
|
||
| 44 | .attr({
|
||
| 45 | fill: colors[commit.space],
|
||
| 46 | 1295:622f24f53b42 | Chris | stroke: 'none' |
| 47 | 1115:433d4f72a19b | Chris | }).toFront(); |
| 48 | // paths to parents
|
||
| 49 | $.each(commit.parent_scmids, function(index, parent_scmid) { |
||
| 50 | parent_commit = commits_by_scmid[parent_scmid]; |
||
| 51 | if (parent_commit) {
|
||
| 52 | if (!parent_commit.hasOwnProperty("space")) |
||
| 53 | parent_commit.space = 0;
|
||
| 54 | 909:cbb26bc654de | Chris | |
| 55 | 1115:433d4f72a19b | Chris | parent_y = commit_table_rows.eq(max_rdmid - parent_commit.rdmid).position().top - graph_y_offset + CIRCLE_INROW_OFFSET; |
| 56 | parent_x = graph_x_offset + XSTEP / 2 + XSTEP * parent_commit.space;
|
||
| 57 | if (parent_commit.space == commit.space) {
|
||
| 58 | // vertical path
|
||
| 59 | path = revisionGraph.path([ |
||
| 60 | 'M', x, y,
|
||
| 61 | 'V', parent_y]);
|
||
| 62 | 909:cbb26bc654de | Chris | } else {
|
| 63 | 1115:433d4f72a19b | Chris | // path to a commit in a different branch (Bezier curve)
|
| 64 | path = revisionGraph.path([ |
||
| 65 | 'M', x, y,
|
||
| 66 | 'C', x, y, x, y + (parent_y - y) / 2, x + (parent_x - x) / 2, y + (parent_y - y) / 2, |
||
| 67 | 'C', x + (parent_x - x) / 2, y + (parent_y - y) / 2, parent_x, parent_y-(parent_y-y)/2, parent_x, parent_y]); |
||
| 68 | 909:cbb26bc654de | Chris | } |
| 69 | } else {
|
||
| 70 | 1115:433d4f72a19b | Chris | // vertical path ending at the bottom of the revisionGraph
|
| 71 | path = revisionGraph.path([ |
||
| 72 | 'M', x, y,
|
||
| 73 | 'V', graph_bottom]);
|
||
| 74 | } |
||
| 75 | path.attr({stroke: colors[commit.space], "stroke-width": 1.5}).toBack();
|
||
| 76 | }); |
||
| 77 | revision_dot_overlay = revisionGraph.circle(x, y, 10);
|
||
| 78 | revision_dot_overlay |
||
| 79 | .attr({
|
||
| 80 | fill: '#000', |
||
| 81 | opacity: 0, |
||
| 82 | cursor: 'pointer', |
||
| 83 | href: commit.href
|
||
| 84 | }); |
||
| 85 | |||
| 86 | if(commit.refs != null && commit.refs.length > 0) { |
||
| 87 | title = document.createElementNS(revisionGraph.canvas.namespaceURI, 'title');
|
||
| 88 | title.appendChild(document.createTextNode(commit.refs)); |
||
| 89 | revision_dot_overlay.node.appendChild(title); |
||
| 90 | } |
||
| 91 | top.push(revision_dot_overlay); |
||
| 92 | }); |
||
| 93 | 909:cbb26bc654de | Chris | top.toFront(); |
| 94 | }; |