diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 229cb36949b82f28d484376fa3c45e9ce2fd623b..6fba251830652c30f7b674083ea0ed80c251931f 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -17,7 +17,7 @@ class RepositoriesController < ProjectResourceController end def stats - @stats = Gitlab::GitStats.new(@repository.raw, @repository.root_ref) + @stats = Gitlab::Git::Stats.new(@repository.raw, @repository.root_ref) @graph = @stats.graph end diff --git a/app/controllers/wikis_controller.rb b/app/controllers/wikis_controller.rb index 940b1e9734051b433c597432170d145a56688091..be9ae4f37a4a6cc6f865115d326ac932168607ec 100644 --- a/app/controllers/wikis_controller.rb +++ b/app/controllers/wikis_controller.rb @@ -49,9 +49,9 @@ class WikisController < ProjectResourceController end def history - unless @wiki = @gollum_wiki.find_page(params[:id]) - redirect_to project_wiki_path(@project, :home), notice: "Page not found" - end + @wiki = @gollum_wiki.find_page(params[:id]) + + redirect_to(project_wiki_path(@project, :home), notice: "Page not found") unless @wiki end def destroy diff --git a/app/models/gollum_wiki.rb b/app/models/gollum_wiki.rb index 16e801c1fdb2856c2b286a9568ab5d47fec374c5..8168347926bd41758c0ca3ff9156ba6e13d0f7ec 100644 --- a/app/models/gollum_wiki.rb +++ b/app/models/gollum_wiki.rb @@ -47,12 +47,6 @@ class GollumWiki wiki.pages.map { |page| WikiPage.new(self, page, true) } end - # Returns the last 30 Commit objects across the entire - # repository. - def recent_history - Gitlab::Git::Commit.fresh_commits(wiki.repo, 30) - end - # Finds a page within the repository based on a tile # or slug. # diff --git a/app/models/network/graph.rb b/app/models/network/graph.rb index 2957adbfc1947dc660f698a51ac23476b4257bf0..2419b719d209486744723622bee24a47eee92bfe 100644 --- a/app/models/network/graph.rb +++ b/app/models/network/graph.rb @@ -25,10 +25,9 @@ module Network def collect_commits refs_cache = build_refs_cache - find_commits(count_to_display_commit_in_center) - .map do |commit| - # Decorate with app/model/network/commit.rb - Network::Commit.new(commit, refs_cache[commit.id]) + find_commits(count_to_display_commit_in_center).map do |commit| + # Decorate with app/model/network/commit.rb + Network::Commit.new(commit, refs_cache[commit.id]) end end @@ -93,15 +92,13 @@ module Network end def find_commits(skip = 0) - Grit::Commit.find_all( - @repo, - nil, - { - date_order: true, - max_count: self.class.max_count, - skip: skip - } - ) + opts = { + date_order: true, + max_count: self.class.max_count, + skip: skip + } + + Grit::Commit.find_all(@repo, opts, nil) end def commits_sort_by_ref diff --git a/lib/gitlab/git/commit.rb b/lib/gitlab/git/commit.rb index f1b9a76b7d6285c3f592e2796ca7d0802e3d1ced..27b866893f93f134d6e0c05fc552ee9facac3c1c 100644 --- a/lib/gitlab/git/commit.rb +++ b/lib/gitlab/git/commit.rb @@ -12,70 +12,6 @@ module Gitlab delegate :parents, :diffs, :tree, :stats, :to_patch, to: :raw_commit - class << self - def serialize_keys - %w(id authored_date committed_date author_name author_email committer_name committer_email message parent_ids) - end - - def find_or_first(repo, commit_id = nil, root_ref) - commit = if commit_id - repo.commit(commit_id) - else - repo.commits(root_ref).first - end - - Commit.new(commit) if commit - end - - def fresh_commits(repo, n = 10) - commits = repo.heads.map do |h| - repo.commits(h.name, n).map { |c| Commit.new(c, h) } - end.flatten.uniq { |c| c.id } - - commits.sort! do |x, y| - y.committed_date <=> x.committed_date - end - - commits[0...n] - end - - def commits_with_refs(repo, n = 20) - commits = repo.branches.map { |ref| Commit.new(ref.commit, ref) } - - commits.sort! do |x, y| - y.committed_date <=> x.committed_date - end - - commits[0..n] - end - - def commits_since(repo, date) - commits = repo.heads.map do |h| - repo.log(h.name, nil, since: date).each { |c| Commit.new(c, h) } - end.flatten.uniq { |c| c.id } - - commits.sort! do |x, y| - y.committed_date <=> x.committed_date - end - - commits - end - - def commits(repo, 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 - - def commits_between(repo, from, to) - repo.commits_between(from, to).map { |c| Commit.new(c) } - end - end - def initialize(raw_commit, head = nil) raise "Nil as raw commit passed" unless raw_commit @@ -88,6 +24,10 @@ module Gitlab @head = head end + def serialize_keys + %w(id authored_date committed_date author_name author_email committer_name committer_email message parent_ids) + end + def sha id end @@ -143,7 +83,7 @@ module Gitlab def to_hash hash = {} - keys = Commit.serialize_keys + keys = serialize_keys keys.each do |key| hash[key] = send(key) @@ -172,7 +112,7 @@ module Gitlab end def init_from_hash(hash) - Commit.serialize_keys.each do |key| + serialize_keys.each do |key| send(:"#{key}=", hash[key]) end end diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 30344a3dec5d3b4a048254d5c9d1ce102a376a9e..330448c81b2a9a64f8f7ef1ad9c6029cd7e617b9 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -48,31 +48,41 @@ module Gitlab end def commit(commit_id = nil) - Gitlab::Git::Commit.find_or_first(repo, commit_id, root_ref) - end + commit = if commit_id + repo.commit(commit_id) + else + repo.commits(root_ref).first + end - def fresh_commits(n = 10) - Gitlab::Git::Commit.fresh_commits(repo, n) + Commit.new(commit) if commit end def commits_with_refs(n = 20) - Gitlab::Git::Commit.commits_with_refs(repo, n) - end + commits = repo.branches.map { |ref| Commit.new(ref.commit, ref) } + + commits.sort! do |x, y| + y.committed_date <=> x.committed_date + end - def commits_since(date) - Gitlab::Git::Commit.commits_since(repo, date) + commits[0..n] end def commits(ref, path = nil, limit = nil, offset = nil) - Gitlab::Git::Commit.commits(repo, ref, path, limit, offset) + 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 - def last_commit_for(ref, path = nil) - commits(ref, path, 1).first + def commits_between(from, to) + repo.commits_between(from, to).map { |c| Commit.new(c) } end - def commits_between(from, to) - Gitlab::Git::Commit.commits_between(repo, from, to) + def last_commit_for(ref, path = nil) + commits(ref, path, 1).first end # Returns an Array of branch names diff --git a/lib/gitlab/git/stats.rb b/lib/gitlab/git/stats.rb new file mode 100644 index 0000000000000000000000000000000000000000..c925c653342e2d5be106e6db65ac6e03d372d5c5 --- /dev/null +++ b/lib/gitlab/git/stats.rb @@ -0,0 +1,75 @@ +module Gitlab + module Git + class Stats + attr_accessor :repo, :ref + + def initialize repo, ref + @repo, @ref = repo, ref + end + + def authors + @authors ||= collect_authors + end + + def commits_count + @commits_count ||= repo.commit_count(ref) + end + + def files_count + args = [ref, '-r', '--name-only' ] + repo.git.run(nil, 'ls-tree', nil, {}, args).split("\n").count + end + + def authors_count + authors.size + end + + def graph + @graph ||= build_graph + end + + protected + + def collect_authors + shortlog = repo.git.shortlog({e: true, s: true }, ref) + + authors = [] + + lines = shortlog.split("\n") + + lines.each do |line| + data = line.split("\t") + commits = data.first + author = Grit::Actor.from_string(data.last) + + authors << OpenStruct.new( + name: author.name, + email: author.email, + commits: commits.to_i + ) + end + + authors.sort_by(&:commits).reverse + end + + def build_graph n = 4 + from, to = (Date.today - n.weeks), Date.today + args = ['--all', "--since=#{from.to_s(:date)}", '--format=%ad' ] + rev_list = repo.git.run(nil, 'rev-list', nil, {}, args).split("\n") + + commits_dates = rev_list.values_at(* rev_list.each_index.select {|i| i.odd?}) + commits_dates = commits_dates.map { |date_str| Time.parse(date_str).to_date.to_s(:date) } + + commits_per_day = from.upto(to).map do |day| + commits_dates.count(day.to_date.to_s(:date)) + end + + OpenStruct.new( + labels: from.upto(to).map { |day| day.stamp('Aug 23') }, + commits: commits_per_day, + weeks: n + ) + end + end + end +end diff --git a/lib/gitlab/git/tree.rb b/lib/gitlab/git/tree.rb index 8bcf71ea217cdf9b68bfdda942000f8179d1ad0e..e6b500ba18cf2b8683c2412faed01106e00da5d3 100644 --- a/lib/gitlab/git/tree.rb +++ b/lib/gitlab/git/tree.rb @@ -38,7 +38,7 @@ module Gitlab end def readme - @readme ||= entries.find { |c| c.is_a?(Grit::Blob) and c.name =~ /^readme/i } + @readme ||= blobs.find { |c| c.name =~ /^readme/i } end protected diff --git a/lib/gitlab/git_stats.rb b/lib/gitlab/git_stats.rb deleted file mode 100644 index 855bffb5ddefaad31d44c0ea9a193e0a5e35bcf1..0000000000000000000000000000000000000000 --- a/lib/gitlab/git_stats.rb +++ /dev/null @@ -1,73 +0,0 @@ -module Gitlab - class GitStats - attr_accessor :repo, :ref - - def initialize repo, ref - @repo, @ref = repo, ref - end - - def authors - @authors ||= collect_authors - end - - def commits_count - @commits_count ||= repo.commit_count(ref) - end - - def files_count - args = [ref, '-r', '--name-only' ] - repo.git.run(nil, 'ls-tree', nil, {}, args).split("\n").count - end - - def authors_count - authors.size - end - - def graph - @graph ||= build_graph - end - - protected - - def collect_authors - shortlog = repo.git.shortlog({e: true, s: true }, ref) - - authors = [] - - lines = shortlog.split("\n") - - lines.each do |line| - data = line.split("\t") - commits = data.first - author = Grit::Actor.from_string(data.last) - - authors << OpenStruct.new( - name: author.name, - email: author.email, - commits: commits.to_i - ) - end - - authors.sort_by(&:commits).reverse - end - - def build_graph n = 4 - from, to = (Date.today - n.weeks), Date.today - args = ['--all', "--since=#{from.to_s(:date)}", '--format=%ad' ] - rev_list = repo.git.run(nil, 'rev-list', nil, {}, args).split("\n") - - commits_dates = rev_list.values_at(* rev_list.each_index.select {|i| i.odd?}) - commits_dates = commits_dates.map { |date_str| Time.parse(date_str).to_date.to_s(:date) } - - commits_per_day = from.upto(to).map do |day| - commits_dates.count(day.to_date.to_s(:date)) - end - - OpenStruct.new( - labels: from.upto(to).map { |day| day.stamp('Aug 23') }, - commits: commits_per_day, - weeks: n - ) - end - end -end