summaryrefslogtreecommitdiff
path: root/lib/graph_commit.rb
diff options
context:
space:
mode:
authorValery Sizov <vsv2711@gmail.com>2011-11-13 00:30:51 +0200
committerValery Sizov <vsv2711@gmail.com>2011-11-13 00:30:51 +0200
commit6b66a766d1e534dbfb5735828d9f6d770732a19b (patch)
treee0b2afd9fda0b013a5cef309088e1f7ecd4fa051 /lib/graph_commit.rb
parentef088725341b2f202b7d33561d12efdf91b7f354 (diff)
downloadgitlab-ce-6b66a766d1e534dbfb5735828d9f6d770732a19b.tar.gz
Graph: build json
Diffstat (limited to 'lib/graph_commit.rb')
-rw-r--r--lib/graph_commit.rb82
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/graph_commit.rb b/lib/graph_commit.rb
new file mode 100644
index 00000000000..ee765cb4ef2
--- /dev/null
+++ b/lib/graph_commit.rb
@@ -0,0 +1,82 @@
+require "grit"
+
+class GraphCommit
+ attr_accessor :time, :space
+ def initialize(commit)
+ @_commit = commit
+ @time = -1
+ @space = 0
+ end
+
+ def method_missing(m, *args, &block)
+ @_commit.send(m, *args, &block)
+ 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<GraphCommit>] comits to index
+ #
+ # @return [Array<TimeDate>] list of commit dates corelated with time on commits
+ def self.index_commits(commits)
+ days, heads = [], []
+ map = {}
+
+ commits.reverse.each_with_index do |c,i|
+ c.time = i
+ days[i]=c.committed_date
+ map[c.id] = c
+ heads += c.refs unless c.refs.nil?
+ end
+
+ heads.select!{|h| h.is_a? Grit::Head or h.is_a? Grit::Remote}
+ # sort heads so the master is top and current branches are closer
+ heads.sort! do |a,b|
+ if a.name == "master"
+ -1
+ elsif b.name == "master"
+ 1
+ else
+ b.commit.committed_date <=> a.commit.committed_date
+ end
+ end
+
+ j = 0
+ heads.each do |h|
+ if map.include? h.commit.id then
+ j = mark_chain(j+=1, map[h.commit.id], map)
+ end
+ end
+ days
+ end
+
+ # Add space mark on commit and its parents
+ #
+ # @param [Fixnum] space (row on the graph) to be set
+ # @param [GraphCommit] the commit object.
+ # @param [Hash<String,GraphCommit>] map of commits
+ #
+ # @return [Fixnum] max space used.
+ def self.mark_chain(mark, commit, map)
+ commit.space = mark if commit.space == 0
+ m1 = mark - 1
+ marks = commit.parents.collect do |p|
+ if map.include? p.id and map[p.id].space == 0 then
+ mark_chain(m1+=1, map[p.id],map)
+ else
+ m1 + 1
+ end
+ end
+ marks << mark
+ marks.compact.max
+ end
+
+ def self.add_refs(commit, ref_cache)
+ if ref_cache.empty?
+ @repo.refs.each {|ref| ref_cache[ref.commit.id] ||= [];ref_cache[ref.commit.id] << ref}
+ end
+ commit.refs = ref_cache[commit.id] if ref_cache.include? commit.id
+ commit.refs ||= []
+ end
+end