Merge pull request #3741 from hiroponz/improve-performance-of-network-graph

Improve performance of network graph
This commit is contained in:
Dmitriy Zaporozhets
2013-04-26 00:05:39 -07:00
8 changed files with 99 additions and 55 deletions
+59 -42
View File
@@ -9,6 +9,7 @@ class BranchGraph
@offsetY = 20
@unitTime = 30
@unitSpace = 10
@prev_start = -1
@load()
load: ->
@@ -24,10 +25,18 @@ class BranchGraph
prepareData: (@days, @commits) ->
@collectParents()
@graphHeight = $(@element).height()
@graphWidth = $(@element).width()
ch = Math.max(@graphHeight, @offsetY + @unitTime * @mtime + 150)
cw = Math.max(@graphWidth, @offsetX + @unitSpace * @mspace + 300)
@r = Raphael(@element.get(0), cw, ch)
@top = @r.set()
@barHeight = Math.max(@graphHeight, @unitTime * @days.length + 320)
for c in @commits
c.isParent = true if c.id of @parents
@preparedCommits[c.id] = c
@markCommit(c)
@collectColors()
@@ -49,18 +58,12 @@ class BranchGraph
k++
buildGraph: ->
graphHeight = $(@element).height()
graphWidth = $(@element).width()
ch = Math.max(graphHeight, @offsetY + @unitTime * @mtime + 150)
cw = Math.max(graphWidth, @offsetX + @unitSpace * @mspace + 300)
@r = r = Raphael(@element.get(0), cw, ch)
top = r.set()
r = @r
cuday = 0
cumonth = ""
barHeight = Math.max(graphHeight, @unitTime * @days.length + 320)
r.rect(0, 0, 26, barHeight).attr fill: "#222"
r.rect(26, 0, 20, barHeight).attr fill: "#444"
r.rect(0, 0, 26, @barHeight).attr fill: "#222"
r.rect(26, 0, 20, @barHeight).attr fill: "#444"
for day, mm in @days
if cuday isnt day[0]
@@ -81,42 +84,50 @@ class BranchGraph
)
cumonth = day[1]
for commit in @commits
x = @offsetX + @unitSpace * (@mspace - commit.space)
y = @offsetY + @unitTime * commit.time
@renderPartialGraph()
@drawDot(x, y, commit)
@drawLines(x, y, commit)
@appendLabel(x, y, commit.refs) if commit.refs
@appendAnchor(top, commit, x, y)
@markCommit(x, y, commit, graphHeight)
top.toFront()
@bindEvents()
renderPartialGraph: ->
start = Math.floor((@element.scrollTop() - @offsetY) / @unitTime) - 10
start = 0 if start < 0
end = start + 40
end = @commits.length if @commits.length < end
if @prev_start == -1 or Math.abs(@prev_start - start) > 10
i = start
@prev_start = start
while i < end
commit = @commits[i]
i += 1
if commit.hasDrawn isnt true
x = @offsetX + @unitSpace * (@mspace - commit.space)
y = @offsetY + @unitTime * commit.time
@drawDot(x, y, commit)
@drawLines(x, y, commit)
@appendLabel(x, y, commit)
@appendAnchor(x, y, commit)
commit.hasDrawn = true
@top.toFront()
bindEvents: ->
drag = {}
element = @element
dragger = (event) ->
element.scrollLeft drag.sl - (event.clientX - drag.x)
element.scrollTop drag.st - (event.clientY - drag.y)
element.on mousedown: (event) ->
drag =
x: event.clientX
y: event.clientY
st: element.scrollTop()
sl: element.scrollLeft()
$(window).on "mousemove", dragger
$(element).scroll (event) =>
@renderPartialGraph()
$(window).on
mouseup: ->
$(window).off "mousemove", dragger
keydown: (event) ->
keydown: (event) =>
# left
element.scrollLeft element.scrollLeft() - 50 if event.keyCode is 37
# top
@@ -125,17 +136,20 @@ class BranchGraph
element.scrollLeft element.scrollLeft() + 50 if event.keyCode is 39
# bottom
element.scrollTop element.scrollTop() + 50 if event.keyCode is 40
@renderPartialGraph()
appendLabel: (x, y, commit) ->
return unless commit.refs
appendLabel: (x, y, refs) ->
r = @r
shortrefs = refs
shortrefs = commit.refs
# Truncate if longer than 15 chars
shortrefs = shortrefs.substr(0, 15) + "" if shortrefs.length > 17
text = r.text(x + 4, y, shortrefs).attr(
"text-anchor": "start"
font: "10px Monaco, monospace"
fill: "#FFF"
title: refs
title: commit.refs
)
textbox = text.getBBox()
# Create rectangle based on the size of the textbox
@@ -156,8 +170,9 @@ class BranchGraph
# Set text to front
text.toFront()
appendAnchor: (top, commit, x, y) ->
appendAnchor: (x, y, commit) ->
r = @r
top = @top
options = @options
anchor = r.circle(x, y, 10).attr(
fill: "#000"
@@ -240,16 +255,18 @@ class BranchGraph
stroke: color
"stroke-width": 2)
markCommit: (x, y, commit, graphHeight) ->
markCommit: (commit) ->
if commit.id is @options.commit_id
r = @r
x = @offsetX + @unitSpace * (@mspace - commit.space)
y = @offsetY + @unitTime * commit.time
r.path(["M", x + 5, y, "L", x + 15, y + 4, "L", x + 15, y - 4, "Z"]).attr(
fill: "#000"
"fill-opacity": .5
stroke: "none"
)
# Displayed in the center
@element.scrollTop(y - graphHeight / 2)
@element.scrollTop(y - @graphHeight / 2)
Raphael::commitTooltip = (x, y, commit) ->
boxWidth = 300
+2 -1
View File
@@ -13,7 +13,8 @@
background: #f1f1f1;
cursor: move;
height: 500px;
overflow: hidden;
overflow-y: scroll;
overflow-x: hidden;
}
}
+1 -2
View File
@@ -4,8 +4,7 @@ module GraphHelper
refs += commit.refs.collect{|r|r.name}.join(" ") if commit.refs
# append note count
notes = @project.notes.for_commit_id(commit.id)
refs += "[#{notes.count}]" if notes.any?
refs += "[#{@graph.notes[commit.id]}]" if @graph.notes[commit.id] > 0
refs
end
+11 -2
View File
@@ -2,7 +2,7 @@ require "grit"
module Network
class Graph
attr_reader :days, :commits, :map
attr_reader :days, :commits, :map, :notes
def self.max_count
@max_count ||= 650
@@ -16,10 +16,19 @@ module Network
@commits = collect_commits
@days = index_commits
@notes = collect_notes
end
protected
def collect_notes
h = Hash.new(0)
@project.notes.where('noteable_type = ?' ,"Commit").group('notes.commit_id').select('notes.commit_id, count(notes.id) as note_count').each do |item|
h[item["commit_id"]] = item["note_count"]
end
h
end
# Get commits from repository
#
def collect_commits
@@ -181,7 +190,7 @@ module Network
l.spaces << space
# Also add space to parent
l.parents(@map).each do |parent|
if parent.space > 0
if 0 < parent.space && parent.space < space
parent.spaces << space
end
end
+6 -4
View File
@@ -11,14 +11,16 @@ Feature: Project Network Graph
And page should have "master" on graph
@javascript
Scenario: I should switch ref to "stable"
Scenario: I should switch "branch" and "tag"
When I switch ref to "stable"
Then page should have network graph
And page should select "stable" in select box
Then page should select "stable" in select box
And page should have "stable" on graph
When I switch ref to "v2.1.0"
Then page should select "v2.1.0" in select box
And page should have "v2.1.0" on graph
@javascript
Scenario: I should looking for a commit by SHA of "v2.1.0"
Scenario: I should looking for a commit by SHA
When I looking for a commit by SHA of "v2.1.0"
Then page should have network graph
And page should select "master" in select box
@@ -30,10 +30,19 @@ class ProjectNetworkGraph < Spinach::FeatureSteps
sleep 2
end
When 'I switch ref to "v2.1.0"' do
page.select 'v2.1.0', :from => 'ref'
sleep 2
end
And 'page should select "stable" in select box' do
page.should have_selector '#ref_chzn span', :text => "stable"
end
And 'page should select "v2.1.0" in select box' do
page.should have_selector '#ref_chzn span', :text => "v2.1.0"
end
And 'page should have "stable" on graph' do
within '.graph' do
page.should have_content 'stable'
+1 -3
View File
@@ -98,9 +98,7 @@ module ExtractsPath
@ref, @path = extract_ref(@id)
# It is used "@project.repository.commits(@ref, @path, 1, 0)",
# because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name.
@commit = @project.repository.commits(@ref, @path, 1, 0).first
@commit = @project.repository.commit(@ref)
@tree = Tree.new(@project.repository, @commit.id, @ref, @path)
+10 -1
View File
@@ -49,7 +49,16 @@ module Gitlab
def commit(commit_id = nil)
commit = if commit_id
repo.commit(commit_id)
# Find repo.refs first,
# because if commit_id is "tag name",
# repo.commit(commit_id) returns wrong commit sha
# that is git tag object sha.
ref = repo.refs.find {|r| r.name == commit_id}
if ref
ref.commit
else
repo.commit(commit_id)
end
else
repo.commits(root_ref).first
end