Commit a0318138 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Commit, network graph refactoring

parent 1b2fba08
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
.cm { color: #888888 } /* Comment.Multiline */ .cm { color: #888888 } /* Comment.Multiline */
.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.c1 { color: #888888 } /* Comment.Single */ .c1 { color: #888888 } /* Comment.Single */
.cs { color: #cc0000; font-weight: bold; background-color: auto } /* Comment.Special */ .cs { color: #cc0000; font-weight: bold; background-color: transparent } /* Comment.Special */
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */ .ge { font-style: italic } /* Generic.Emph */
.gr { color: #aa0000 } /* Generic.Error */ .gr { color: #aa0000 } /* Generic.Error */
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
.highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */ .highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */
.m { color: #0000DD; font-weight: bold } /* Literal.Number */ .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.p { color: #eee; } .p { color: #eee; }
.s { color: #dd2200; background-color: auto } /* Literal.String */ .s { color: #dd2200; background-color: transparent } /* Literal.String */
.highlight .na{color:#008080;} /* Name.Attribute */ .highlight .na{color:#008080;} /* Name.Attribute */
.highlight .nb{color:#0086B3;} /* Name.Builtin */ .highlight .nb{color:#0086B3;} /* Name.Builtin */
.highlight .nc{color:#4d3;font-weight:bold;} /* Name.Class */ .highlight .nc{color:#4d3;font-weight:bold;} /* Name.Class */
...@@ -48,9 +48,9 @@ ...@@ -48,9 +48,9 @@
.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi {color:#099;} /* Literal.Number.Integer */ .highlight .mi {color:#099;} /* Literal.Number.Integer */
.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.sb { color: #dd2200; background-color: auto } /* Literal.String.Backtick */ .sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */
.highlight .sc{color:#d14;} /* Literal.String.Char */ .highlight .sc{color:#d14;} /* Literal.String.Char */
.sd { color: #dd2200; background-color: auto } /* Literal.String.Doc */ .sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */
.highlight .s2{color:orange;} /* Literal.String.Double */ .highlight .s2{color:orange;} /* Literal.String.Double */
.highlight .se{color:orange;} /* Literal.String.Escape */ .highlight .se{color:orange;} /* Literal.String.Escape */
.highlight .sh{color:orange;} /* Literal.String.Heredoc */ .highlight .sh{color:orange;} /* Literal.String.Heredoc */
......
...@@ -13,12 +13,7 @@ class CommitsController < ApplicationController ...@@ -13,12 +13,7 @@ class CommitsController < ApplicationController
def index def index
@repo = project.repo @repo = project.repo
@limit, @offset = (params[:limit] || 20), (params[:offset] || 0) @limit, @offset = (params[:limit] || 20), (params[:offset] || 0)
@commits = @project.commits(@ref, params[:path], @limit, @offset)
@commits = if params[:path]
@repo.log(@ref, params[:path], :max_count => @limit, :skip => @offset)
else
@repo.commits(@ref, @limit, @offset)
end
respond_to do |format| respond_to do |format|
format.html # index.html.erb format.html # index.html.erb
...@@ -28,7 +23,7 @@ class CommitsController < ApplicationController ...@@ -28,7 +23,7 @@ class CommitsController < ApplicationController
end end
def show def show
@commit = project.repo.commits(params[:id]).first @commit = project.commit(params[:id])
@notes = project.commit_notes(@commit).fresh.limit(20) @notes = project.commit_notes(@commit).fresh.limit(20)
@note = @project.build_commit_note(@commit) @note = @project.build_commit_note(@commit)
......
...@@ -86,31 +86,7 @@ class ProjectsController < ApplicationController ...@@ -86,31 +86,7 @@ class ProjectsController < ApplicationController
end end
def graph def graph
@repo = project.repo @days_json, @commits_json = GraphCommit.to_graph(project)
commits = Grit::Commit.find_all(@repo, nil, {:max_count => 650})
ref_cache = {}
commits.collect! do |commit|
add_refs(commit, ref_cache)
GraphCommit.new(commit)
end
days = GraphCommit.index_commits(commits)
@days_json = days.compact.collect{|d| [d.day, d.strftime("%b")] }.to_json
@commits_json = commits.collect do |c|
h = {}
h[:parents] = c.parents.collect do |p|
[p.id,0,0]
end
h[:author] = c.author.name.force_encoding("UTF-8")
h[:time] = c.time
h[:space] = c.space
h[:refs] = c.refs.collect{|r|r.name}.join(" ") unless c.refs.nil?
h[:id] = c.sha
h[:date] = c.date
h[:message] = c.message.force_encoding("UTF-8")
h[:login] = c.author.email
h
end.to_json
end end
def destroy def destroy
...@@ -123,17 +99,6 @@ class ProjectsController < ApplicationController ...@@ -123,17 +99,6 @@ class ProjectsController < ApplicationController
protected protected
def add_refs(commit, ref_cache)
if ref_cache.empty?
@repo.refs.each do |ref|
ref_cache[ref.commit.id] ||= []
ref_cache[ref.commit.id] << ref
end
end
commit.refs = ref_cache[commit.id] if ref_cache.include? commit.id
commit.refs ||= []
end
def project def project
@project ||= Project.find_by_code(params[:id]) @project ||= Project.find_by_code(params[:id])
end end
......
...@@ -2,7 +2,7 @@ module DashboardHelper ...@@ -2,7 +2,7 @@ module DashboardHelper
def dashboard_feed_path(project, object) def dashboard_feed_path(project, object)
case object.class.name.to_s case object.class.name.to_s
when "Issue" then project_issue_path(project, project.issues.find(object.id)) when "Issue" then project_issue_path(project, project.issues.find(object.id))
when "Grit::Commit" then project_commit_path(project, project.repo.commits(object.id).first) when "Commit" then project_commit_path(project, project.repo.commits(object.id).first)
when "Note" when "Note"
then then
note = object note = object
......
class Commit class Commit
attr_accessor :commit
attr_accessor :head
delegate :message,
:committed_date,
:parents,
:sha,
:date,
:author,
:message,
:diffs,
:tree,
:id,
:to => :commit
def initialize(raw_commit, head = nil)
@commit = raw_commit
@head = head
end
def safe_message
message.force_encoding(Encoding::UTF_8)
end
def created_at
committed_date
end
def author_email
author.email.force_encoding(Encoding::UTF_8)
end
def author_name
author.name.force_encoding(Encoding::UTF_8)
end
end end
...@@ -64,16 +64,17 @@ class Repository ...@@ -64,16 +64,17 @@ class Repository
end end
def commit(commit_id = nil) def commit(commit_id = nil)
if commit_id commit = if commit_id
repo.commits(commit_id).first repo.commits(commit_id).first
else else
repo.commits.first repo.commits.first
end end
Commit.new(commit) if commit
end end
def fresh_commits(n = 10) def fresh_commits(n = 10)
commits = heads.map do |h| commits = heads.map do |h|
repo.commits(h.name, n).each { |c| c.head = h } repo.commits(h.name, n).map { |c| Commit.new(c, h) }
end.flatten.uniq { |c| c.id } end.flatten.uniq { |c| c.id }
commits.sort! do |x, y| commits.sort! do |x, y|
...@@ -85,7 +86,7 @@ class Repository ...@@ -85,7 +86,7 @@ class Repository
def commits_since(date) def commits_since(date)
commits = heads.map do |h| commits = heads.map do |h|
repo.log(h.name, nil, :since => date).each { |c| c.head = h } repo.log(h.name, nil, :since => date).each { |c| Commit.new(c, h) }
end.flatten.uniq { |c| c.id } end.flatten.uniq { |c| c.id }
commits.sort! do |x, y| commits.sort! do |x, y|
...@@ -94,4 +95,14 @@ class Repository ...@@ -94,4 +95,14 @@ class Repository
commits commits
end end
def commits(ref, path = nil, limit = nil, offset = nil)
if path
repo.log(ref, path, :max_count => limit, :skip => offset)
elsif limit && offset
repo.commits(ref, limit, offset)
else
repo.commits(ref)
end.map{ |c| Commit.new(c) }
end
end end
...@@ -10,6 +10,6 @@ ...@@ -10,6 +10,6 @@
.right .right
- klass = update.class.to_s.split("::").last.downcase - klass = update.class.to_s.split("::").last.downcase
%span.tag{ :class => klass }= klass %span.tag{ :class => klass }= klass
- if update.kind_of?(Grit::Commit) - if update.kind_of?(Commit)
%span.tag.commit= update.head.name %span.tag.commit= update.head.name
- file = params[:path] ? File.join(params[:path], content.name) : content.name - file = params[:path] ? File.join(params[:path], content.name) : content.name
- content_commit = @project.repo.log(@commit.id, file, :max_count => 1).last - content_commit = @project.commits(@commit.id, file, 1).last
- return unless content_commit - return unless content_commit
%tr{ :class => "tree-item", :url => tree_file_project_ref_path(@project, @ref, file) } %tr{ :class => "tree-item", :url => tree_file_project_ref_path(@project, @ref, file) }
%td.tree-item-file-name %td.tree-item-file-name
......
...@@ -7,9 +7,5 @@ Grit::Blob.class_eval do ...@@ -7,9 +7,5 @@ Grit::Blob.class_eval do
include Utils::Colorize include Utils::Colorize
end end
Grit::Commit.class_eval do
include CommitExt
end
Grit::Git.git_timeout = GIT_OPTS["git_timeout"] Grit::Git.git_timeout = GIT_OPTS["git_timeout"]
Grit::Git.git_max_size = GIT_OPTS["git_max_size"] Grit::Git.git_max_size = GIT_OPTS["git_max_size"]
module CommitExt
attr_accessor :head
attr_accessor :refs
def safe_message
message.force_encoding(Encoding::UTF_8)
end
def created_at
committed_date
end
def author_email
author.email.force_encoding(Encoding::UTF_8)
end
def author_name
author.name.force_encoding(Encoding::UTF_8)
end
end
...@@ -2,14 +2,22 @@ require "grit" ...@@ -2,14 +2,22 @@ require "grit"
class GraphCommit class GraphCommit
attr_accessor :time, :space attr_accessor :time, :space
def initialize(commit) attr_accessor :refs
@_commit = commit
@time = -1
@space = 0
end
def method_missing(m, *args, &block) def self.to_graph(project)
@_commit.send(m, *args, &block) @repo = project.repo
commits = Grit::Commit.find_all(@repo, nil, {:max_count => 650})
ref_cache = {}
commits.map! {|c| GraphCommit.new(Commit.new(c))}
commits.each { |commit| commit.add_refs(ref_cache, @repo) }
days = GraphCommit.index_commits(commits)
@days_json = days.compact.collect{|d| [d.day, d.strftime("%b")] }.to_json
@commits_json = commits.map(&:to_graph_hash).to_json
return @days_json, @commits_json
end end
# Method is adding time and space on the # Method is adding time and space on the
...@@ -72,4 +80,41 @@ class GraphCommit ...@@ -72,4 +80,41 @@ class GraphCommit
marks.compact.max marks.compact.max
end end
def initialize(commit)
@_commit = commit
@time = -1
@space = 0
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] = author.name.force_encoding("UTF-8")
h[:time] = time
h[:space] = space
h[:refs] = refs.collect{|r|r.name}.join(" ") unless refs.nil?
h[:id] = sha
h[:date] = date
h[:message] = message.force_encoding("UTF-8")
h[:login] = author.email
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
...@@ -2,7 +2,7 @@ require 'spec_helper' ...@@ -2,7 +2,7 @@ require 'spec_helper'
describe "Commits" do describe "Commits" do
let(:project) { Factory :project } let(:project) { Factory :project }
let!(:commit) { project.repo.commits.first } let!(:commit) { project.commit }
before do before do
login_as :user login_as :user
project.add_access(@user, :read) project.add_access(@user, :read)
...@@ -48,11 +48,11 @@ describe "Commits" do ...@@ -48,11 +48,11 @@ describe "Commits" do
describe "GET /commits/:id" do describe "GET /commits/:id" do
before do before do
visit project_commit_path(project, commit) visit project_commit_path(project, commit.id)
end end
it "should have valid path" do it "should have valid path" do
current_path.should == project_commit_path(project, commit) current_path.should == project_commit_path(project, commit.id)
end end
end end
end end
...@@ -55,12 +55,12 @@ describe "Projects" do ...@@ -55,12 +55,12 @@ describe "Projects" do
end end
describe "GET /project_code/commit" do describe "GET /project_code/commit" do
it { project_commit_path(@project, @project.commit).should be_allowed_for @u1 } it { project_commit_path(@project, @project.commit.id).should be_allowed_for @u1 }
it { project_commit_path(@project, @project.commit).should be_allowed_for @u3 } it { project_commit_path(@project, @project.commit.id).should be_allowed_for @u3 }
it { project_commit_path(@project, @project.commit).should be_denied_for :admin } it { project_commit_path(@project, @project.commit.id).should be_denied_for :admin }
it { project_commit_path(@project, @project.commit).should be_denied_for @u2 } it { project_commit_path(@project, @project.commit.id).should be_denied_for @u2 }
it { project_commit_path(@project, @project.commit).should be_denied_for :user } it { project_commit_path(@project, @project.commit.id).should be_denied_for :user }
it { project_commit_path(@project, @project.commit).should be_denied_for :visitor } it { project_commit_path(@project, @project.commit.id).should be_denied_for :visitor }
end end
describe "GET /project_code/team" do describe "GET /project_code/team" do
......
...@@ -79,6 +79,7 @@ describe "Projects" do ...@@ -79,6 +79,7 @@ describe "Projects" do
end end
it "should beahave like activities page" do it "should beahave like activities page" do
save_and_open_page
within ".project-update" do within ".project-update" do
page.should have_content("master") page.should have_content("master")
page.should have_content(@project.commit.author.name) page.should have_content(@project.commit.author.name)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment