Skip to content
Snippets Groups Projects
Commit a0318138 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Commit, network graph refactoring

parent 1b2fba08
No related branches found
No related tags found
No related merge requests found
Loading
@@ -11,7 +11,7 @@
Loading
@@ -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 */
Loading
@@ -30,7 +30,7 @@
Loading
@@ -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 */
Loading
@@ -48,9 +48,9 @@
Loading
@@ -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 */
Loading
Loading
Loading
@@ -13,12 +13,7 @@ class CommitsController < ApplicationController
Loading
@@ -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
Loading
@@ -28,7 +23,7 @@ class CommitsController < ApplicationController
Loading
@@ -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)
   
Loading
Loading
Loading
@@ -86,31 +86,7 @@ class ProjectsController < ApplicationController
Loading
@@ -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
Loading
@@ -123,17 +99,6 @@ class ProjectsController < ApplicationController
Loading
@@ -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
Loading
Loading
Loading
@@ -2,7 +2,7 @@ module DashboardHelper
Loading
@@ -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
Loading
Loading
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
Loading
@@ -64,16 +64,17 @@ class Repository
Loading
@@ -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|
Loading
@@ -85,7 +86,7 @@ class Repository
Loading
@@ -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|
Loading
@@ -94,4 +95,14 @@ class Repository
Loading
@@ -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
Loading
@@ -10,6 +10,6 @@
Loading
@@ -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
Loading
Loading
Loading
@@ -7,9 +7,5 @@ Grit::Blob.class_eval do
Loading
@@ -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
Loading
@@ -2,14 +2,22 @@ require "grit"
Loading
@@ -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
Loading
@@ -72,4 +80,41 @@ class GraphCommit
Loading
@@ -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
Loading
@@ -2,7 +2,7 @@ require 'spec_helper'
Loading
@@ -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)
Loading
@@ -48,11 +48,11 @@ describe "Commits" do
Loading
@@ -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
Loading
@@ -55,12 +55,12 @@ describe "Projects" do
Loading
@@ -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
Loading
Loading
Loading
@@ -79,6 +79,7 @@ describe "Projects" do
Loading
@@ -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)
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment