summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Baptiste Barth <jeanbaptiste.barth@gmail.com>2014-08-26 13:58:58 +0000
committerJean-Baptiste Barth <jeanbaptiste.barth@gmail.com>2014-08-26 13:58:58 +0000
commit41bf39df36550db5b6ba9ccc167ac02021f69edc (patch)
tree11c4c2b2ab1c7ba555401302a698fa21266ef376
parente3e14ce3a119f61f22a75c1fdea314e88e0a4d9b (diff)
downloadredmine-41bf39df36550db5b6ba9ccc167ac02021f69edc.tar.gz
redmine-41bf39df36550db5b6ba9ccc167ac02021f69edc.zip
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
-rw-r--r--app/controllers/repositories_controller.rb19
-rw-r--r--app/models/repository.rb23
-rw-r--r--test/unit/repository_test.rb19
3 files changed, 52 insertions, 9 deletions
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index bdd56f0aa..59afc5529 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -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,
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 1b469c0cc..3e5174d2a 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -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
diff --git a/test/unit/repository_test.rb b/test/unit/repository_test.rb
index 8d2e7866a..173483c2d 100644
--- a/test/unit/repository_test.rb
+++ b/test/unit/repository_test.rb
@@ -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