From 38fce3deb03904fdfcf2fe512b094d49e22fe61c Mon Sep 17 00:00:00 2001
From: Sato Hiroyuki <sathiroyuki@gmail.com>
Date: Wed, 27 Feb 2013 22:37:38 +0900
Subject: [PATCH] It improves detecting an overlap of a line

---
 app/models/graph/commit.rb       | 14 +++++++++++---
 app/models/graph/json_builder.rb | 32 ++++++++++++++++++++------------
 2 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/app/models/graph/commit.rb b/app/models/graph/commit.rb
index 2b09d53902a..742a73b38b7 100644
--- a/app/models/graph/commit.rb
+++ b/app/models/graph/commit.rb
@@ -4,12 +4,12 @@ module Graph
   class Commit
     include ActionView::Helpers::TagHelper
 
-    attr_accessor :time, :space, :refs, :parent_spaces
+    attr_accessor :time, :spaces, :refs, :parent_spaces
 
     def initialize(commit)
       @_commit = commit
       @time = -1
-      @space = 0
+      @spaces = []
       @parent_spaces = []
     end
 
@@ -27,7 +27,7 @@ module Graph
         email: author.email
       }
       h[:time]    = time
-      h[:space]   = space
+      h[:space]   = spaces.first
       h[:parent_spaces]   = parent_spaces
       h[:refs]    = refs.collect{|r|r.name}.join(" ") unless refs.nil?
       h[:id]      = sha
@@ -46,5 +46,13 @@ module Graph
       @refs = ref_cache[@_commit.id] if ref_cache.include?(@_commit.id)
       @refs ||= []
     end
+
+    def space
+      if @spaces.size > 0
+        @spaces.first
+      else
+        0
+      end
+    end
   end
 end
diff --git a/app/models/graph/json_builder.rb b/app/models/graph/json_builder.rb
index 2ba05405e2a..5237ccfe081 100644
--- a/app/models/graph/json_builder.rb
+++ b/app/models/graph/json_builder.rb
@@ -151,7 +151,7 @@ module Graph
 
     def find_free_parent_space(range, space_base, space_step, space_default, times)
       if is_overlap?(range, times, space_default) then
-        find_free_space(range, space_base, space_step, space_default)
+        find_free_space(range, space_step, space_base, space_default)
       else
         space_default
       end
@@ -161,7 +161,7 @@ module Graph
       range.each do |i|
         if i != range.first &&
           i != range.last &&
-          times[i].space == overlap_space then
+          times[i].spaces.include?(overlap_space) then
 
           return true;
         end
@@ -179,9 +179,24 @@ module Graph
       if leaves.empty?
         return
       end
+
+      time_range = leaves.last.time..leaves.first.time
+      space = find_free_space(time_range, 2)
+      leaves.each do |l|
+        l.spaces << space
+        # Also add space to parent
+        l.parents.each do |p|
+          if map.include?(p.id)
+            parent = map[p.id]
+            if parent.space > 0
+              parent.spaces << space
+            end
+          end
+        end
+      end
+
       # and mark it as reserved
       min_time = leaves.last.time
-      max_space = 1
       parents = leaves.last.parents.collect
       parents.each do |p|
         if map.include? p.id
@@ -189,21 +204,14 @@ module Graph
           if parent.time < min_time
             min_time = parent.time
           end
-          if max_space < parent.space then
-            max_space = parent.space
-          end
         end
       end
+
       if parent_time.nil?
         max_time = leaves.first.time
       else
         max_time = parent_time - 1
       end
-
-      time_range = leaves.last.time..leaves.first.time
-      space = find_free_space(time_range, max_space, 2)
-      leaves.each{|l| l.space = space}
-
       mark_reserved(min_time..max_time, space)
 
       # Visit branching chains
@@ -221,7 +229,7 @@ module Graph
       end
     end
 
-    def find_free_space(time_range, space_base, space_step, space_default = 1)
+    def find_free_space(time_range, space_step, space_base = 1, space_default = 1)
       reserved = []
       for day in time_range
         reserved += @_reserved[day]
-- 
GitLab