summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSato Hiroyuki <sathiroyuki@gmail.com>2013-02-26 13:28:11 +0900
committerSato Hiroyuki <sathiroyuki@gmail.com>2013-02-26 20:31:39 +0900
commitd8a40d8c933da8e89013e989940f8b60d0f2e247 (patch)
tree8ccafedef6f21a99c318615164209e7d5cbce9ea
parentc9b1df1201dccded5fdfb4835209af9c0f258c55 (diff)
downloadgitlab-ce-d8a40d8c933da8e89013e989940f8b60d0f2e247.tar.gz
Move graph module from lib or vendor directory to app directory.
Because not autoloading lib directory at development mode.
-rw-r--r--app/assets/javascripts/branch-graph.js (renamed from vendor/assets/javascripts/branch-graph.js)0
-rw-r--r--app/controllers/graph_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb2
-rw-r--r--app/models/graph/commit.rb50
-rw-r--r--app/models/graph/json_builder.rb266
-rw-r--r--lib/gitlab/graph/commit.rb52
-rw-r--r--lib/gitlab/graph/json_builder.rb268
7 files changed, 317 insertions, 323 deletions
diff --git a/vendor/assets/javascripts/branch-graph.js b/app/assets/javascripts/branch-graph.js
index fb22953acd2..fb22953acd2 100644
--- a/vendor/assets/javascripts/branch-graph.js
+++ b/app/assets/javascripts/branch-graph.js
diff --git a/app/controllers/graph_controller.rb b/app/controllers/graph_controller.rb
index c370433e500..8aadcfef8c2 100644
--- a/app/controllers/graph_controller.rb
+++ b/app/controllers/graph_controller.rb
@@ -20,7 +20,7 @@ class GraphController < ProjectResourceController
respond_to do |format|
format.html
format.json do
- graph = Gitlab::Graph::JsonBuilder.new(project, @ref, @commit)
+ graph = Graph::JsonBuilder.new(project, @ref, @commit)
render :json => graph.to_json
end
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 5da3fbf591c..f703cf6bc1d 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -1,5 +1,3 @@
-require Rails.root.join('lib', 'gitlab', 'graph', 'json_builder')
-
class ProjectsController < ProjectResourceController
skip_before_filter :project, only: [:new, :create]
skip_before_filter :repository, only: [:new, :create]
diff --git a/app/models/graph/commit.rb b/app/models/graph/commit.rb
new file mode 100644
index 00000000000..2b09d53902a
--- /dev/null
+++ b/app/models/graph/commit.rb
@@ -0,0 +1,50 @@
+require "grit"
+
+module Graph
+ class Commit
+ include ActionView::Helpers::TagHelper
+
+ attr_accessor :time, :space, :refs, :parent_spaces
+
+ def initialize(commit)
+ @_commit = commit
+ @time = -1
+ @space = 0
+ @parent_spaces = []
+ end
+
+ def method_missing(m, *args, &block)
+ @_commit.send(m, *args, &block)
+ end
+
+ def to_graph_hash
+ h = {}
+ h[:parents] = self.parents.collect do |p|
+ [p.id,0,0]
+ end
+ h[:author] = {
+ name: author.name,
+ email: author.email
+ }
+ h[:time] = time
+ h[:space] = space
+ h[:parent_spaces] = parent_spaces
+ h[:refs] = refs.collect{|r|r.name}.join(" ") unless refs.nil?
+ h[:id] = sha
+ h[:date] = date
+ h[:message] = message
+ h
+ end
+
+ def add_refs(ref_cache, repo)
+ if ref_cache.empty?
+ repo.refs.each do |ref|
+ ref_cache[ref.commit.id] ||= []
+ ref_cache[ref.commit.id] << ref
+ end
+ end
+ @refs = ref_cache[@_commit.id] if ref_cache.include?(@_commit.id)
+ @refs ||= []
+ end
+ end
+end
diff --git a/app/models/graph/json_builder.rb b/app/models/graph/json_builder.rb
new file mode 100644
index 00000000000..8440b5d5cdf
--- /dev/null
+++ b/app/models/graph/json_builder.rb
@@ -0,0 +1,266 @@
+require "grit"
+
+module Graph
+ class JsonBuilder
+ attr_accessor :days, :commits, :ref_cache, :repo
+
+ def self.max_count
+ @max_count ||= 650
+ end
+
+ def initialize project, ref, commit
+ @project = project
+ @ref = ref
+ @commit = commit
+ @repo = project.repo
+ @ref_cache = {}
+
+ @commits = collect_commits
+ @days = index_commits
+ end
+
+ def to_json(*args)
+ {
+ days: @days.compact.map { |d| [d.day, d.strftime("%b")] },
+ commits: @commits.map(&:to_graph_hash)
+ }.to_json(*args)
+ end
+
+ protected
+
+ # Get commits from repository
+ #
+ def collect_commits
+
+ @commits = Grit::Commit.find_all(repo, nil, {topo_order: true, max_count: self.class.max_count, skip: to_commit}).dup
+
+ # Decorate with app/models/commit.rb
+ @commits.map! { |commit| Commit.new(commit) }
+
+ # Decorate with lib/gitlab/graph/commit.rb
+ @commits.map! { |commit| Graph::Commit.new(commit) }
+
+ # add refs to each commit
+ @commits.each { |commit| commit.add_refs(ref_cache, repo) }
+
+ @commits
+ end
+
+ # Method is adding time and space on the
+ # list of commits. As well as returns date list
+ # corelated with time set on commits.
+ #
+ # @param [Array<Graph::Commit>] commits to index
+ #
+ # @return [Array<TimeDate>] list of commit dates corelated with time on commits
+ def index_commits
+ days, times = [], []
+ map = {}
+
+ commits.reverse.each_with_index do |c,i|
+ c.time = i
+ days[i] = c.committed_date
+ map[c.id] = c
+ times[i] = c
+ end
+
+ @_reserved = {}
+ days.each_index do |i|
+ @_reserved[i] = []
+ end
+
+ commits_sort_by_ref.each do |commit|
+ if map.include? commit.id then
+ place_chain(map[commit.id], map)
+ 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
+
+ # Skip count that the target commit is displayed in center.
+ def to_commit
+ commits = Grit::Commit.find_all(repo, nil, {topo_order: true})
+ commit_index = commits.index do |c|
+ c.id == @commit.id
+ end
+
+ if commit_index && (self.class.max_count / 2 < commit_index) then
+ # get max index that commit is displayed in the center.
+ commit_index - self.class.max_count / 2
+ else
+ 0
+ end
+ end
+
+ def commits_sort_by_ref
+ commits.sort do |a,b|
+ if include_ref?(a)
+ -1
+ elsif include_ref?(b)
+ 1
+ else
+ b.committed_date <=> a.committed_date
+ end
+ end
+ end
+
+ def include_ref?(commit)
+ heads = commit.refs.select do |ref|
+ ref.is_a?(Grit::Head) or ref.is_a?(Grit::Remote) or ref.is_a?(Grit::Tag)
+ end
+
+ heads.map! do |head|
+ head.name
+ end
+
+ heads.include?(@ref)
+ 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, parent.space, 1, commit.space, times)
+ else
+ find_free_parent_space(range, parent.space, -1, parent.space, times)
+ end
+
+ mark_reserved(range, space)
+ spaces << space
+ end
+ end
+
+ spaces
+ end
+
+ 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)
+ 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.
+ # @param [Hash<String,Graph::Commit>] map of commits
+ def place_chain(commit, map, parent_time = nil)
+ leaves = take_left_leaves(commit, map)
+ if leaves.empty?
+ return
+ 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
+ parent = map[p.id]
+ 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
+ leaves.each do |l|
+ parents = l.parents.collect.select{|p| map.include? p.id and map[p.id].space.zero?}
+ for p in parents
+ place_chain(map[p.id], map, l.time)
+ end
+ end
+ end
+
+ def mark_reserved(time_range, space)
+ for day in time_range
+ @_reserved[day].push(space)
+ end
+ end
+
+ def find_free_space(time_range, space_base, space_step)
+ reserved = []
+ for day in time_range
+ reserved += @_reserved[day]
+ end
+ reserved.uniq!
+
+ 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
+
+ # Takes most left subtree branch of commits
+ # which don't have space mark yet.
+ #
+ # @param [Graph::Commit] the commit object.
+ # @param [Hash<String,Graph::Commit>] map of commits
+ #
+ # @return [Array<Graph::Commit>] list of branch commits
+ def take_left_leaves(commit, map)
+ leaves = []
+ leaves.push(commit) if commit.space.zero?
+
+ while true
+ return leaves if commit.parents.count.zero?
+ return leaves unless map.include? commit.parents.first.id
+
+ commit = map[commit.parents.first.id]
+
+ return leaves unless commit.space.zero?
+
+ leaves.push(commit)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graph/commit.rb b/lib/gitlab/graph/commit.rb
deleted file mode 100644
index 13c8ebc9952..00000000000
--- a/lib/gitlab/graph/commit.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-require "grit"
-
-module Gitlab
- module Graph
- class Commit
- include ActionView::Helpers::TagHelper
-
- attr_accessor :time, :space, :refs, :parent_spaces
-
- def initialize(commit)
- @_commit = commit
- @time = -1
- @space = 0
- @parent_spaces = []
- end
-
- def method_missing(m, *args, &block)
- @_commit.send(m, *args, &block)
- end
-
- def to_graph_hash
- h = {}
- h[:parents] = self.parents.collect do |p|
- [p.id,0,0]
- end
- h[:author] = {
- name: author.name,
- email: author.email
- }
- h[:time] = time
- h[:space] = space
- h[:parent_spaces] = parent_spaces
- h[:refs] = refs.collect{|r|r.name}.join(" ") unless refs.nil?
- h[:id] = sha
- h[:date] = date
- h[:message] = message
- h
- end
-
- def add_refs(ref_cache, repo)
- if ref_cache.empty?
- repo.refs.each do |ref|
- ref_cache[ref.commit.id] ||= []
- ref_cache[ref.commit.id] << ref
- end
- end
- @refs = ref_cache[@_commit.id] if ref_cache.include?(@_commit.id)
- @refs ||= []
- end
- end
- end
-end
diff --git a/lib/gitlab/graph/json_builder.rb b/lib/gitlab/graph/json_builder.rb
deleted file mode 100644
index cc971a245a7..00000000000
--- a/lib/gitlab/graph/json_builder.rb
+++ /dev/null
@@ -1,268 +0,0 @@
-require "grit"
-
-module Gitlab
- module Graph
- class JsonBuilder
- attr_accessor :days, :commits, :ref_cache, :repo
-
- def self.max_count
- @max_count ||= 650
- end
-
- def initialize project, ref, commit
- @project = project
- @ref = ref
- @commit = commit
- @repo = project.repo
- @ref_cache = {}
-
- @commits = collect_commits
- @days = index_commits
- end
-
- def to_json(*args)
- {
- days: @days.compact.map { |d| [d.day, d.strftime("%b")] },
- commits: @commits.map(&:to_graph_hash)
- }.to_json(*args)
- end
-
- protected
-
- # Get commits from repository
- #
- def collect_commits
-
- @commits = Grit::Commit.find_all(repo, nil, {topo_order: true, max_count: self.class.max_count, skip: to_commit}).dup
-
- # Decorate with app/models/commit.rb
- @commits.map! { |commit| ::Commit.new(commit) }
-
- # Decorate with lib/gitlab/graph/commit.rb
- @commits.map! { |commit| Gitlab::Graph::Commit.new(commit) }
-
- # add refs to each commit
- @commits.each { |commit| commit.add_refs(ref_cache, repo) }
-
- @commits
- end
-
- # Method is adding time and space on the
- # list of commits. As well as returns date list
- # corelated with time set on commits.
- #
- # @param [Array<Graph::Commit>] commits to index
- #
- # @return [Array<TimeDate>] list of commit dates corelated with time on commits
- def index_commits
- days, times = [], []
- map = {}
-
- commits.reverse.each_with_index do |c,i|
- c.time = i
- days[i] = c.committed_date
- map[c.id] = c
- times[i] = c
- end
-
- @_reserved = {}
- days.each_index do |i|
- @_reserved[i] = []
- end
-
- commits_sort_by_ref.each do |commit|
- if map.include? commit.id then
- place_chain(map[commit.id], map)
- 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
-
- # Skip count that the target commit is displayed in center.
- def to_commit
- commits = Grit::Commit.find_all(repo, nil, {topo_order: true})
- commit_index = commits.index do |c|
- c.id == @commit.id
- end
-
- if commit_index && (self.class.max_count / 2 < commit_index) then
- # get max index that commit is displayed in the center.
- commit_index - self.class.max_count / 2
- else
- 0
- end
- end
-
- def commits_sort_by_ref
- commits.sort do |a,b|
- if include_ref?(a)
- -1
- elsif include_ref?(b)
- 1
- else
- b.committed_date <=> a.committed_date
- end
- end
- end
-
- def include_ref?(commit)
- heads = commit.refs.select do |ref|
- ref.is_a?(Grit::Head) or ref.is_a?(Grit::Remote) or ref.is_a?(Grit::Tag)
- end
-
- heads.map! do |head|
- head.name
- end
-
- heads.include?(@ref)
- 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, parent.space, 1, commit.space, times)
- else
- find_free_parent_space(range, parent.space, -1, parent.space, times)
- end
-
- mark_reserved(range, space)
- spaces << space
- end
- end
-
- spaces
- end
-
- 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)
- 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.
- # @param [Hash<String,Graph::Commit>] map of commits
- def place_chain(commit, map, parent_time = nil)
- leaves = take_left_leaves(commit, map)
- if leaves.empty?
- return
- 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
- parent = map[p.id]
- 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
- leaves.each do |l|
- parents = l.parents.collect.select{|p| map.include? p.id and map[p.id].space.zero?}
- for p in parents
- place_chain(map[p.id], map, l.time)
- end
- end
- end
-
- def mark_reserved(time_range, space)
- for day in time_range
- @_reserved[day].push(space)
- end
- end
-
- def find_free_space(time_range, space_base, space_step)
- reserved = []
- for day in time_range
- reserved += @_reserved[day]
- end
- reserved.uniq!
-
- 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
-
- # Takes most left subtree branch of commits
- # which don't have space mark yet.
- #
- # @param [Graph::Commit] the commit object.
- # @param [Hash<String,Graph::Commit>] map of commits
- #
- # @return [Array<Graph::Commit>] list of branch commits
- def take_left_leaves(commit, map)
- leaves = []
- leaves.push(commit) if commit.space.zero?
-
- while true
- return leaves if commit.parents.count.zero?
- return leaves unless map.include? commit.parents.first.id
-
- commit = map[commit.parents.first.id]
-
- return leaves unless commit.space.zero?
-
- leaves.push(commit)
- end
- end
- end
- end
-end