Merge pull request #2847 from hiroponz/improve-overlap-lines

Improve overlap of lines in network graph
This commit is contained in:
Dmitriy Zaporozhets 2013-01-30 22:22:37 -08:00
commit d46cb3fd1c
3 changed files with 91 additions and 26 deletions

View file

@ -17,7 +17,6 @@ module Gitlab
@commits = collect_commits
@days = index_commits
@space = 0
end
def to_json(*args)
@ -54,7 +53,7 @@ module Gitlab
#
# @return [Array<TimeDate>] list of commit dates corelated with time on commits
def index_commits
days, heads = [], []
days, heads, times = [], [], []
map = {}
commits.reverse.each_with_index do |c,i|
@ -62,6 +61,7 @@ module Gitlab
days[i] = c.committed_date
map[c.id] = c
heads += c.refs unless c.refs.nil?
times[i] = c
end
heads.select!{|h| h.is_a? Grit::Head or h.is_a? Grit::Remote}
@ -87,9 +87,62 @@ module Gitlab
end
end
# find parent spaces for not overlap lines
times.each do |c|
c.parent_spaces.concat(find_free_parent_spaces(c, map, times))
end
days
end
def find_free_parent_spaces(commit, map, times)
spaces = []
commit.parents.each do |p|
if map.include?(p.id) then
parent = map[p.id]
range = if commit.time < parent.time then
commit.time..parent.time
else
parent.time..commit.time
end
space = if commit.space >= parent.space then
find_free_parent_space(range, map, parent.space, 1, commit.space, times)
else
find_free_parent_space(range, map, parent.space, -1, parent.space, times)
end
mark_reserved(range, space)
spaces << space
end
end
spaces
end
def find_free_parent_space(range, map, space_base, space_step, space_default, times)
if is_overlap?(range, times, space_default) then
find_free_space(range, map, space_base, space_step)
else
space_default
end
end
def is_overlap?(range, times, overlap_space)
range.each do |i|
if i != range.first &&
i != range.last &&
times[i].space == overlap_space then
return true;
end
end
false
end
# Add space mark on commit and its parents
#
# @param [Graph::Commit] the commit object.
@ -99,8 +152,9 @@ module Gitlab
if leaves.empty?
return
end
@space = find_free_space(leaves, map)
leaves.each{|l| l.space = @space}
time_range = leaves.last.time..leaves.first.time
space = find_free_space(time_range, map, 1, 2)
leaves.each{|l| l.space = space}
# and mark it as reserved
min_time = leaves.last.time
parents = leaves.last.parents.collect
@ -117,7 +171,7 @@ module Gitlab
else
max_time = parent_time - 1
end
mark_reserved(min_time..max_time, @space)
mark_reserved(min_time..max_time, space)
# Visit branching chains
leaves.each do |l|
@ -134,30 +188,24 @@ module Gitlab
end
end
def find_free_space(leaves, map)
time_range = leaves.last.time..leaves.first.time
def find_free_space(time_range, map, space_base, space_step)
reserved = []
for day in time_range
reserved += @_reserved[day]
end
space = base_space(leaves, map)
while (reserved.include? space) || (space == @space) do
space += 1
space = space_base
while reserved.include?(space) do
space += space_step
if space <= 0 then
space_step *= -1
space = space_base + space_step
end
end
space
end
def base_space(leaves, map)
parents = []
leaves.each do |l|
parents.concat l.parents.collect.select{|p| map.include? p.id and map[p.id].space.nonzero?}
end
space = parents.map{|p| map[p.id].space}.max || 0
space += 1
end
# Takes most left subtree branch of commits
# which don't have space mark yet.
#