Its better to load graph with ajax since it requires ~10 seconds for bigger projects to finish up
This commit is contained in:
parent
64457799c5
commit
f1e0d37b15
11 changed files with 79 additions and 161 deletions
2
Gemfile
2
Gemfile
|
@ -23,7 +23,7 @@ gem 'omniauth-github'
|
|||
|
||||
# Extracting information from a git repository
|
||||
# Provide access to Gitlab::Git library
|
||||
gem 'gitlab_git', '~> 1.2.1'
|
||||
gem 'gitlab_git', '~> 1.3.0'
|
||||
|
||||
# Ruby/Rack Git Smart-HTTP Server Handler
|
||||
gem 'gitlab-grack', '~> 1.0.0', require: 'grack'
|
||||
|
|
|
@ -164,7 +164,7 @@ GEM
|
|||
gitlab-pygments.rb (0.3.2)
|
||||
posix-spawn (~> 0.3.6)
|
||||
yajl-ruby (~> 1.1.0)
|
||||
gitlab_git (1.2.1)
|
||||
gitlab_git (1.3.0)
|
||||
activesupport (~> 3.2.13)
|
||||
github-linguist (~> 2.3.4)
|
||||
gitlab-grit (~> 2.5.1)
|
||||
|
@ -543,7 +543,7 @@ DEPENDENCIES
|
|||
gitlab-gollum-lib (~> 1.0.0)
|
||||
gitlab-grack (~> 1.0.0)
|
||||
gitlab-pygments.rb (~> 0.3.2)
|
||||
gitlab_git (~> 1.2.1)
|
||||
gitlab_git (~> 1.3.0)
|
||||
gitlab_meta (= 5.0)
|
||||
gitlab_omniauth-ldap (= 1.0.2)
|
||||
gon
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
class StatGraphController < ProjectResourceController
|
||||
|
||||
# Authorize
|
||||
before_filter :authorize_read_project!
|
||||
before_filter :authorize_code_access!
|
||||
before_filter :require_non_empty_project
|
||||
|
||||
def show
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.js do
|
||||
@repo = @project.repository
|
||||
@stats = Gitlab::GitStats.new(@repo.raw, @repo.root_ref)
|
||||
@stats = Gitlab::Git::GitStats.new(@repo.raw, @repo.root_ref)
|
||||
@log = @stats.parsed_log.to_json
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,3 +1,9 @@
|
|||
.loading-graph
|
||||
%center
|
||||
.loading
|
||||
%h3.page_title Building repository graph. Please wait a moment.
|
||||
|
||||
.stat-graph
|
||||
.header.clearfix
|
||||
.right
|
||||
%select
|
||||
|
@ -6,24 +12,20 @@
|
|||
%option{:value => "deletions"} Deletions
|
||||
%h3#date_header
|
||||
%input#brush_change{:type => "hidden"}
|
||||
|
||||
.graphs
|
||||
#contributors-master
|
||||
#contributors.clearfix
|
||||
%ol.contributors-list.clearfix
|
||||
|
||||
:javascript
|
||||
controller = new ContributorsStatGraph
|
||||
controller.init(#{@log})
|
||||
$(".stat-graph").hide();
|
||||
|
||||
$("select").change( function () {
|
||||
var field = $(this).val()
|
||||
controller.set_current_field(field)
|
||||
controller.redraw_master()
|
||||
controller.redraw_authors()
|
||||
})
|
||||
|
||||
$("#brush_change").change( function () {
|
||||
controller.change_date_header()
|
||||
controller.redraw_authors()
|
||||
})
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: location.href,
|
||||
complete: function() {
|
||||
$(".loading-graph").hide();
|
||||
$(".stat-graph").show();
|
||||
},
|
||||
dataType: "script"
|
||||
});
|
||||
|
|
16
app/views/stat_graph/show.js.haml
Normal file
16
app/views/stat_graph/show.js.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
:plain
|
||||
controller = new ContributorsStatGraph
|
||||
controller.init(#{@log})
|
||||
|
||||
$("select").change( function () {
|
||||
var field = $(this).val()
|
||||
controller.set_current_field(field)
|
||||
controller.redraw_master()
|
||||
controller.redraw_authors()
|
||||
})
|
||||
|
||||
$("#brush_change").change( function () {
|
||||
controller.change_date_header()
|
||||
controller.redraw_authors()
|
||||
})
|
||||
|
9
features/project/graph.feature
Normal file
9
features/project/graph.feature
Normal file
|
@ -0,0 +1,9 @@
|
|||
Feature: Project Graph
|
||||
Background:
|
||||
Given I sign in as a user
|
||||
And I own project "Shop"
|
||||
And I visit project "Shop" graph page
|
||||
|
||||
@javascript
|
||||
Scenario: I should see project graphs
|
||||
Then page should have graphs
|
13
features/steps/project/project_graph.rb
Normal file
13
features/steps/project/project_graph.rb
Normal file
|
@ -0,0 +1,13 @@
|
|||
class ProjectGraph < Spinach::FeatureSteps
|
||||
include SharedAuthentication
|
||||
include SharedProject
|
||||
|
||||
Then 'page should have graphs' do
|
||||
page.should have_selector ".stat-graph"
|
||||
end
|
||||
|
||||
When 'I visit project "Shop" graph page' do
|
||||
project = Project.find_by_name("Shop")
|
||||
visit project_stat_graph_path(project, "master")
|
||||
end
|
||||
end
|
|
@ -1,20 +0,0 @@
|
|||
require 'gitlab/git_stats_log_parser'
|
||||
|
||||
module Gitlab
|
||||
class GitStats
|
||||
attr_accessor :repo, :ref
|
||||
|
||||
def initialize repo, ref
|
||||
@repo, @ref = repo, ref
|
||||
end
|
||||
|
||||
def log
|
||||
args = ['--format=%aN%x0a%ad', '--date=short', '--shortstat', '--no-merges']
|
||||
repo.git.run(nil, 'log', nil, {}, args)
|
||||
end
|
||||
|
||||
def parsed_log
|
||||
LogParser.parse_log(log)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,32 +0,0 @@
|
|||
class LogParser
|
||||
#Parses the log file into a collection of commits
|
||||
#Data model: {author, date, additions, deletions}
|
||||
def self.parse_log log_from_git
|
||||
log = log_from_git.split("\n")
|
||||
|
||||
i = 0
|
||||
collection = []
|
||||
entry = {}
|
||||
|
||||
while i <= log.size do
|
||||
pos = i % 4
|
||||
case pos
|
||||
when 0
|
||||
unless i == 0
|
||||
collection.push(entry)
|
||||
entry = {}
|
||||
end
|
||||
entry[:author] = log[i].to_s
|
||||
when 1
|
||||
entry[:date] = log[i].to_s
|
||||
when 3
|
||||
changes = log[i].split(",")
|
||||
entry[:additions] = changes[1].to_i unless changes[1].nil?
|
||||
entry[:deletions] = changes[2].to_i unless changes[2].nil?
|
||||
end
|
||||
i += 1
|
||||
end
|
||||
|
||||
collection
|
||||
end
|
||||
end
|
|
@ -1,37 +0,0 @@
|
|||
require 'spec_helper'
|
||||
require 'gitlab/git_stats_log_parser'
|
||||
|
||||
|
||||
describe LogParser do
|
||||
|
||||
describe "#self.parse_log" do
|
||||
context "log_from_git is a valid log" do
|
||||
it "returns the correct log" do
|
||||
fake_log = "Karlo Soriano
|
||||
2013-05-09
|
||||
|
||||
14 files changed, 471 insertions(+)
|
||||
Dmitriy Zaporozhets
|
||||
2013-05-08
|
||||
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
Dmitriy Zaporozhets
|
||||
2013-05-08
|
||||
|
||||
6 files changed, 19 insertions(+), 3 deletions(-)
|
||||
Dmitriy Zaporozhets
|
||||
2013-05-08
|
||||
|
||||
3 files changed, 29 insertions(+), 3 deletions(-)";
|
||||
|
||||
lp = LogParser.parse_log(fake_log)
|
||||
lp.should eq([
|
||||
{author: "Karlo Soriano", date: "2013-05-09", additions: 471},
|
||||
{author: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 6, deletions: 1},
|
||||
{author: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 19, deletions: 3},
|
||||
{author: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 29, deletions: 3}])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
|
@ -1,36 +0,0 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::GitStats do
|
||||
|
||||
describe "#parsed_log" do
|
||||
let(:stats) { Gitlab::GitStats.new(nil, nil) }
|
||||
before(:each) do
|
||||
stats.stub(:log).and_return("anything")
|
||||
end
|
||||
|
||||
context "LogParser#parse_log returns 'test'" do
|
||||
it "returns 'test'" do
|
||||
LogParser.stub(:parse_log).and_return("test")
|
||||
stats.parsed_log.should eq("test")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#log" do
|
||||
let(:repo) { Repository.new(nil, nil) }
|
||||
let(:gs) { Gitlab::GitStats.new(repo.raw, repo.root_ref) }
|
||||
|
||||
before(:each) do
|
||||
repo.stub(:raw).and_return(nil)
|
||||
repo.stub(:root_ref).and_return(nil)
|
||||
repo.raw.stub(:git)
|
||||
end
|
||||
|
||||
context "repo.git.run returns 'test'" do
|
||||
it "returns 'test'" do
|
||||
repo.raw.git.stub(:run).and_return("test")
|
||||
gs.log.should eq("test")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue