Commit f1e0d37b15914ce7f17a612c8afb4452a501ecd7

Authored by Dmitriy Zaporozhets
1 parent 64457799

Its better to load graph with ajax since it requires ~10 seconds for bigger projects to finish up

Gemfile
... ... @@ -23,7 +23,7 @@ gem 'omniauth-github'
23 23  
24 24 # Extracting information from a git repository
25 25 # Provide access to Gitlab::Git library
26   -gem 'gitlab_git', '~> 1.2.1'
  26 +gem 'gitlab_git', '~> 1.3.0'
27 27  
28 28 # Ruby/Rack Git Smart-HTTP Server Handler
29 29 gem 'gitlab-grack', '~> 1.0.0', require: 'grack'
... ... @@ -183,7 +183,7 @@ group :development, :test do
183 183 gem 'poltergeist', '~> 1.3.0'
184 184  
185 185 gem 'spork', '~> 1.0rc'
186   - gem 'jasmine'
  186 + gem 'jasmine'
187 187 end
188 188  
189 189 group :test do
... ...
Gemfile.lock
... ... @@ -164,7 +164,7 @@ GEM
164 164 gitlab-pygments.rb (0.3.2)
165 165 posix-spawn (~> 0.3.6)
166 166 yajl-ruby (~> 1.1.0)
167   - gitlab_git (1.2.1)
  167 + gitlab_git (1.3.0)
168 168 activesupport (~> 3.2.13)
169 169 github-linguist (~> 2.3.4)
170 170 gitlab-grit (~> 2.5.1)
... ... @@ -543,7 +543,7 @@ DEPENDENCIES
543 543 gitlab-gollum-lib (~> 1.0.0)
544 544 gitlab-grack (~> 1.0.0)
545 545 gitlab-pygments.rb (~> 0.3.2)
546   - gitlab_git (~> 1.2.1)
  546 + gitlab_git (~> 1.3.0)
547 547 gitlab_meta (= 5.0)
548 548 gitlab_omniauth-ldap (= 1.0.2)
549 549 gon
... ...
app/controllers/stat_graph_controller.rb
1 1 class StatGraphController < ProjectResourceController
2   -
3 2 # Authorize
4 3 before_filter :authorize_read_project!
5 4 before_filter :authorize_code_access!
6 5 before_filter :require_non_empty_project
7   -
  6 +
8 7 def show
9   - @repo = @project.repository
10   - @stats = Gitlab::GitStats.new(@repo.raw, @repo.root_ref)
11   - @log = @stats.parsed_log.to_json
  8 + respond_to do |format|
  9 + format.html
  10 + format.js do
  11 + @repo = @project.repository
  12 + @stats = Gitlab::Git::GitStats.new(@repo.raw, @repo.root_ref)
  13 + @log = @stats.parsed_log.to_json
  14 + end
  15 + end
12 16 end
13   -
14   -end
15 17 \ No newline at end of file
  18 +end
... ...
app/views/stat_graph/show.html.haml
1   -.header.clearfix
2   - .right
3   - %select
4   - %option{:value => "commits"} Commits
5   - %option{:value => "additions"} Additions
6   - %option{:value => "deletions"} Deletions
7   - %h3#date_header
8   - %input#brush_change{:type => "hidden"}
  1 +.loading-graph
  2 + %center
  3 + .loading
  4 + %h3.page_title Building repository graph. Please wait a moment.
9 5  
10   -.graphs
11   - #contributors-master
12   - #contributors.clearfix
13   - %ol.contributors-list.clearfix
  6 +.stat-graph
  7 + .header.clearfix
  8 + .right
  9 + %select
  10 + %option{:value => "commits"} Commits
  11 + %option{:value => "additions"} Additions
  12 + %option{:value => "deletions"} Deletions
  13 + %h3#date_header
  14 + %input#brush_change{:type => "hidden"}
  15 + .graphs
  16 + #contributors-master
  17 + #contributors.clearfix
  18 + %ol.contributors-list.clearfix
14 19  
15 20 :javascript
16   - controller = new ContributorsStatGraph
17   - controller.init(#{@log})
  21 + $(".stat-graph").hide();
18 22  
19   - $("select").change( function () {
20   - var field = $(this).val()
21   - controller.set_current_field(field)
22   - controller.redraw_master()
23   - controller.redraw_authors()
24   - })
25   -
26   - $("#brush_change").change( function () {
27   - controller.change_date_header()
28   - controller.redraw_authors()
29   - })
30 23 \ No newline at end of file
  24 + $.ajax({
  25 + type: "GET",
  26 + url: location.href,
  27 + complete: function() {
  28 + $(".loading-graph").hide();
  29 + $(".stat-graph").show();
  30 + },
  31 + dataType: "script"
  32 + });
... ...
app/views/stat_graph/show.js.haml 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +:plain
  2 + controller = new ContributorsStatGraph
  3 + controller.init(#{@log})
  4 +
  5 + $("select").change( function () {
  6 + var field = $(this).val()
  7 + controller.set_current_field(field)
  8 + controller.redraw_master()
  9 + controller.redraw_authors()
  10 + })
  11 +
  12 + $("#brush_change").change( function () {
  13 + controller.change_date_header()
  14 + controller.redraw_authors()
  15 + })
  16 +
... ...
features/project/graph.feature 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +Feature: Project Graph
  2 + Background:
  3 + Given I sign in as a user
  4 + And I own project "Shop"
  5 + And I visit project "Shop" graph page
  6 +
  7 + @javascript
  8 + Scenario: I should see project graphs
  9 + Then page should have graphs
... ...
features/steps/project/project_graph.rb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +class ProjectGraph < Spinach::FeatureSteps
  2 + include SharedAuthentication
  3 + include SharedProject
  4 +
  5 + Then 'page should have graphs' do
  6 + page.should have_selector ".stat-graph"
  7 + end
  8 +
  9 + When 'I visit project "Shop" graph page' do
  10 + project = Project.find_by_name("Shop")
  11 + visit project_stat_graph_path(project, "master")
  12 + end
  13 +end
... ...
lib/gitlab/git_stats.rb
... ... @@ -1,20 +0,0 @@
1   -require 'gitlab/git_stats_log_parser'
2   -
3   -module Gitlab
4   - class GitStats
5   - attr_accessor :repo, :ref
6   -
7   - def initialize repo, ref
8   - @repo, @ref = repo, ref
9   - end
10   -
11   - def log
12   - args = ['--format=%aN%x0a%ad', '--date=short', '--shortstat', '--no-merges']
13   - repo.git.run(nil, 'log', nil, {}, args)
14   - end
15   -
16   - def parsed_log
17   - LogParser.parse_log(log)
18   - end
19   - end
20   -end
lib/gitlab/git_stats_log_parser.rb
... ... @@ -1,32 +0,0 @@
1   -class LogParser
2   - #Parses the log file into a collection of commits
3   - #Data model: {author, date, additions, deletions}
4   - def self.parse_log log_from_git
5   - log = log_from_git.split("\n")
6   -
7   - i = 0
8   - collection = []
9   - entry = {}
10   -
11   - while i <= log.size do
12   - pos = i % 4
13   - case pos
14   - when 0
15   - unless i == 0
16   - collection.push(entry)
17   - entry = {}
18   - end
19   - entry[:author] = log[i].to_s
20   - when 1
21   - entry[:date] = log[i].to_s
22   - when 3
23   - changes = log[i].split(",")
24   - entry[:additions] = changes[1].to_i unless changes[1].nil?
25   - entry[:deletions] = changes[2].to_i unless changes[2].nil?
26   - end
27   - i += 1
28   - end
29   -
30   - collection
31   - end
32   -end
33 0 \ No newline at end of file
spec/lib/gitlab/git_stats_log_parser_spec.rb
... ... @@ -1,37 +0,0 @@
1   -require 'spec_helper'
2   -require 'gitlab/git_stats_log_parser'
3   -
4   -
5   -describe LogParser do
6   -
7   - describe "#self.parse_log" do
8   - context "log_from_git is a valid log" do
9   - it "returns the correct log" do
10   - fake_log = "Karlo Soriano
11   -2013-05-09
12   -
13   - 14 files changed, 471 insertions(+)
14   -Dmitriy Zaporozhets
15   -2013-05-08
16   -
17   - 1 file changed, 6 insertions(+), 1 deletion(-)
18   -Dmitriy Zaporozhets
19   -2013-05-08
20   -
21   - 6 files changed, 19 insertions(+), 3 deletions(-)
22   -Dmitriy Zaporozhets
23   -2013-05-08
24   -
25   - 3 files changed, 29 insertions(+), 3 deletions(-)";
26   -
27   - lp = LogParser.parse_log(fake_log)
28   - lp.should eq([
29   - {author: "Karlo Soriano", date: "2013-05-09", additions: 471},
30   - {author: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 6, deletions: 1},
31   - {author: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 19, deletions: 3},
32   - {author: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 29, deletions: 3}])
33   - end
34   - end
35   - end
36   -
37   -end
38 0 \ No newline at end of file
spec/lib/gitlab/git_stats_spec.rb
... ... @@ -1,36 +0,0 @@
1   -require 'spec_helper'
2   -
3   -describe Gitlab::GitStats do
4   -
5   - describe "#parsed_log" do
6   - let(:stats) { Gitlab::GitStats.new(nil, nil) }
7   - before(:each) do
8   - stats.stub(:log).and_return("anything")
9   - end
10   -
11   - context "LogParser#parse_log returns 'test'" do
12   - it "returns 'test'" do
13   - LogParser.stub(:parse_log).and_return("test")
14   - stats.parsed_log.should eq("test")
15   - end
16   - end
17   - end
18   -
19   - describe "#log" do
20   - let(:repo) { Repository.new(nil, nil) }
21   - let(:gs) { Gitlab::GitStats.new(repo.raw, repo.root_ref) }
22   -
23   - before(:each) do
24   - repo.stub(:raw).and_return(nil)
25   - repo.stub(:root_ref).and_return(nil)
26   - repo.raw.stub(:git)
27   - end
28   -
29   - context "repo.git.run returns 'test'" do
30   - it "returns 'test'" do
31   - repo.raw.git.stub(:run).and_return("test")
32   - gs.log.should eq("test")
33   - end
34   - end
35   - end
36   -end
37 0 \ No newline at end of file