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

@@ -23,7 +23,7 @@ gem 'omniauth-github' @@ -23,7 +23,7 @@ gem 'omniauth-github'
23 23
24 # Extracting information from a git repository 24 # Extracting information from a git repository
25 # Provide access to Gitlab::Git library 25 # Provide access to Gitlab::Git library
26 -gem 'gitlab_git', '~> 1.2.1' 26 +gem 'gitlab_git', '~> 1.3.0'
27 27
28 # Ruby/Rack Git Smart-HTTP Server Handler 28 # Ruby/Rack Git Smart-HTTP Server Handler
29 gem 'gitlab-grack', '~> 1.0.0', require: 'grack' 29 gem 'gitlab-grack', '~> 1.0.0', require: 'grack'
@@ -183,7 +183,7 @@ group :development, :test do @@ -183,7 +183,7 @@ group :development, :test do
183 gem 'poltergeist', '~> 1.3.0' 183 gem 'poltergeist', '~> 1.3.0'
184 184
185 gem 'spork', '~> 1.0rc' 185 gem 'spork', '~> 1.0rc'
186 - gem 'jasmine' 186 + gem 'jasmine'
187 end 187 end
188 188
189 group :test do 189 group :test do
@@ -164,7 +164,7 @@ GEM @@ -164,7 +164,7 @@ GEM
164 gitlab-pygments.rb (0.3.2) 164 gitlab-pygments.rb (0.3.2)
165 posix-spawn (~> 0.3.6) 165 posix-spawn (~> 0.3.6)
166 yajl-ruby (~> 1.1.0) 166 yajl-ruby (~> 1.1.0)
167 - gitlab_git (1.2.1) 167 + gitlab_git (1.3.0)
168 activesupport (~> 3.2.13) 168 activesupport (~> 3.2.13)
169 github-linguist (~> 2.3.4) 169 github-linguist (~> 2.3.4)
170 gitlab-grit (~> 2.5.1) 170 gitlab-grit (~> 2.5.1)
@@ -543,7 +543,7 @@ DEPENDENCIES @@ -543,7 +543,7 @@ DEPENDENCIES
543 gitlab-gollum-lib (~> 1.0.0) 543 gitlab-gollum-lib (~> 1.0.0)
544 gitlab-grack (~> 1.0.0) 544 gitlab-grack (~> 1.0.0)
545 gitlab-pygments.rb (~> 0.3.2) 545 gitlab-pygments.rb (~> 0.3.2)
546 - gitlab_git (~> 1.2.1) 546 + gitlab_git (~> 1.3.0)
547 gitlab_meta (= 5.0) 547 gitlab_meta (= 5.0)
548 gitlab_omniauth-ldap (= 1.0.2) 548 gitlab_omniauth-ldap (= 1.0.2)
549 gon 549 gon
app/controllers/stat_graph_controller.rb
1 class StatGraphController < ProjectResourceController 1 class StatGraphController < ProjectResourceController
2 -  
3 # Authorize 2 # Authorize
4 before_filter :authorize_read_project! 3 before_filter :authorize_read_project!
5 before_filter :authorize_code_access! 4 before_filter :authorize_code_access!
6 before_filter :require_non_empty_project 5 before_filter :require_non_empty_project
7 - 6 +
8 def show 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 end 16 end
13 -  
14 -end  
15 \ No newline at end of file 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 :javascript 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 \ No newline at end of file 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 @@ @@ -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 @@ @@ -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 @@ @@ -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,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,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 \ No newline at end of file 0 \ No newline at end of file
spec/lib/gitlab/git_stats_log_parser_spec.rb
@@ -1,37 +0,0 @@ @@ -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 \ No newline at end of file 0 \ No newline at end of file
spec/lib/gitlab/git_stats_spec.rb
@@ -1,36 +0,0 @@ @@ -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 \ No newline at end of file 0 \ No newline at end of file