mirror of
https://github.com/meineerde/redmine.git
synced 2025-12-24 01:11:12 +00:00
Move some RepositoriesController logic to Repository#stats_by_author (#13487).
git-svn-id: http://svn.redmine.org/redmine/trunk@13351 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
e3e14ce3a1
commit
41bf39df36
@ -397,16 +397,16 @@ class RepositoriesController < ApplicationController
|
||||
end
|
||||
|
||||
def graph_commits_per_author(repository)
|
||||
commits_by_author = Changeset.where("repository_id = ?", repository.id).group(:committer).count
|
||||
commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}
|
||||
|
||||
changes_by_author = Change.joins(:changeset).where("#{Changeset.table_name}.repository_id = ?", repository.id).group(:committer).count
|
||||
h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o}
|
||||
|
||||
fields = commits_by_author.collect {|r| r.first}
|
||||
commits_data = commits_by_author.collect {|r| r.last}
|
||||
changes_data = commits_by_author.collect {|r| h[r.first] || 0}
|
||||
#data
|
||||
stats = repository.stats_by_author
|
||||
fields, commits_data, changes_data = [], [], []
|
||||
stats.each do |name, hsh|
|
||||
fields << name
|
||||
commits_data << hsh[:commits_count]
|
||||
changes_data << hsh[:changes_count]
|
||||
end
|
||||
|
||||
#expand to 10 values if needed
|
||||
fields = fields + [""]*(10 - fields.length) if fields.length<10
|
||||
commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
|
||||
changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10
|
||||
@ -414,6 +414,7 @@ class RepositoriesController < ApplicationController
|
||||
# Remove email address in usernames
|
||||
fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
|
||||
|
||||
#prepare graph
|
||||
graph = SVG::Graph::BarHorizontal.new(
|
||||
:height => 30 * commits_data.length,
|
||||
:width => 800,
|
||||
|
||||
@ -405,6 +405,29 @@ class Repository < ActiveRecord::Base
|
||||
new_record? && project && Repository.where(:project_id => project.id).empty?
|
||||
end
|
||||
|
||||
# Returns a hash with statistics by author in the following form:
|
||||
# {
|
||||
# "John Smith" => { :commits => 45, :changes => 324 },
|
||||
# "Bob" => { ... }
|
||||
# }
|
||||
#
|
||||
# Notes:
|
||||
# - this hash honnors the users mapping defined for the repository
|
||||
def stats_by_author
|
||||
commits_by_author = Changeset.where("repository_id = ?", id).group(:committer).count
|
||||
commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}
|
||||
|
||||
changes_by_author = Change.joins(:changeset).where("#{Changeset.table_name}.repository_id = ?", id).group(:committer).count
|
||||
h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o}
|
||||
|
||||
commits_by_author.inject({}) do |hash, (name, commits_count)|
|
||||
hash[name] = {}
|
||||
hash[name][:commits_count] = commits_count
|
||||
hash[name][:changes_count] = h[name] || 0
|
||||
hash
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def check_default
|
||||
|
||||
@ -395,4 +395,23 @@ class RepositoryTest < ActiveSupport::TestCase
|
||||
[r1, r2].sort
|
||||
end
|
||||
end
|
||||
|
||||
def test_stats_by_author_reflect_changesets_and_changes
|
||||
repository = Repository.find(10)
|
||||
|
||||
expected = {"dlopper"=>{:commits_count=>10, :changes_count=>3}}
|
||||
assert_equal expected, repository.stats_by_author
|
||||
|
||||
set = Changeset.create!(
|
||||
:repository => repository,
|
||||
:committer => 'dlopper',
|
||||
:committed_on => Time.now,
|
||||
:revision => 101,
|
||||
:comments => 'Another commit by foo.'
|
||||
)
|
||||
Change.create!(:changeset => set, :action => 'create', :path => '/path/to/file1')
|
||||
Change.create!(:changeset => set, :action => 'create', :path => '/path/to/file2')
|
||||
expected = {"dlopper"=>{:commits_count=>11, :changes_count=>5}}
|
||||
assert_equal expected, repository.stats_by_author
|
||||
end
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user