Commit 038d40f0f5b202fe9ed133fdf9de1774bdbc8ede
1 parent
9e2c8d94
Exists in
master
and in
4 other branches
Solve inconsistency between network graph & stat graphs
Showing
21 changed files
with
173 additions
and
167 deletions
Show diff stats
app/controllers/graph_controller.rb
| @@ -1,23 +0,0 @@ | @@ -1,23 +0,0 @@ | ||
| 1 | -class GraphController < ProjectResourceController | ||
| 2 | - include ExtractsPath | ||
| 3 | - include ApplicationHelper | ||
| 4 | - | ||
| 5 | - # Authorize | ||
| 6 | - before_filter :authorize_read_project! | ||
| 7 | - before_filter :authorize_code_access! | ||
| 8 | - before_filter :require_non_empty_project | ||
| 9 | - | ||
| 10 | - def show | ||
| 11 | - if @options[:q] | ||
| 12 | - @commit = @project.repository.commit(@options[:q]) || @commit | ||
| 13 | - end | ||
| 14 | - | ||
| 15 | - respond_to do |format| | ||
| 16 | - format.html | ||
| 17 | - | ||
| 18 | - format.json do | ||
| 19 | - @graph = Network::Graph.new(project, @ref, @commit, @options[:filter_ref]) | ||
| 20 | - end | ||
| 21 | - end | ||
| 22 | - end | ||
| 23 | -end |
| @@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
| 1 | +class GraphsController < ProjectResourceController | ||
| 2 | + # Authorize | ||
| 3 | + before_filter :authorize_read_project! | ||
| 4 | + before_filter :authorize_code_access! | ||
| 5 | + before_filter :require_non_empty_project | ||
| 6 | + | ||
| 7 | + def show | ||
| 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 | ||
| 16 | + end | ||
| 17 | +end |
| @@ -0,0 +1,23 @@ | @@ -0,0 +1,23 @@ | ||
| 1 | +class NetworkController < ProjectResourceController | ||
| 2 | + include ExtractsPath | ||
| 3 | + include ApplicationHelper | ||
| 4 | + | ||
| 5 | + # Authorize | ||
| 6 | + before_filter :authorize_read_project! | ||
| 7 | + before_filter :authorize_code_access! | ||
| 8 | + before_filter :require_non_empty_project | ||
| 9 | + | ||
| 10 | + def show | ||
| 11 | + if @options[:q] | ||
| 12 | + @commit = @project.repository.commit(@options[:q]) || @commit | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + respond_to do |format| | ||
| 16 | + format.html | ||
| 17 | + | ||
| 18 | + format.json do | ||
| 19 | + @graph = Network::Graph.new(project, @ref, @commit, @options[:filter_ref]) | ||
| 20 | + end | ||
| 21 | + end | ||
| 22 | + end | ||
| 23 | +end |
app/controllers/refs_controller.rb
| @@ -14,7 +14,7 @@ class RefsController < ProjectResourceController | @@ -14,7 +14,7 @@ class RefsController < ProjectResourceController | ||
| 14 | elsif params[:destination] == "blob" | 14 | elsif params[:destination] == "blob" |
| 15 | project_blob_path(@project, (@id)) | 15 | project_blob_path(@project, (@id)) |
| 16 | elsif params[:destination] == "graph" | 16 | elsif params[:destination] == "graph" |
| 17 | - project_graph_path(@project, @id, @options) | 17 | + project_network_path(@project, @id, @options) |
| 18 | else | 18 | else |
| 19 | project_commits_path(@project, @id) | 19 | project_commits_path(@project, @id) |
| 20 | end | 20 | end |
app/controllers/stat_graph_controller.rb
| @@ -1,17 +0,0 @@ | @@ -1,17 +0,0 @@ | ||
| 1 | -class StatGraphController < ProjectResourceController | ||
| 2 | - # Authorize | ||
| 3 | - before_filter :authorize_read_project! | ||
| 4 | - before_filter :authorize_code_access! | ||
| 5 | - before_filter :require_non_empty_project | ||
| 6 | - | ||
| 7 | - def show | ||
| 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 | ||
| 16 | - end | ||
| 17 | -end |
app/views/graph/_head.html.haml
| @@ -1,26 +0,0 @@ | @@ -1,26 +0,0 @@ | ||
| 1 | -%h3.page_title Project Network Graph | ||
| 2 | -%hr | ||
| 3 | - | ||
| 4 | -.clearfix | ||
| 5 | - .pull-left | ||
| 6 | - = render partial: 'shared/ref_switcher', locals: {destination: 'graph'} | ||
| 7 | - .pull-left | ||
| 8 | - = form_tag project_graph_path(@project, @id), method: :get do |f| | ||
| 9 | - .control-group | ||
| 10 | - = label_tag :filter_ref, "Show only selected ref", class: 'control-label light' | ||
| 11 | - .controls | ||
| 12 | - = check_box_tag :filter_ref, 1, @options[:filter_ref] | ||
| 13 | - - @options.each do |key, value| | ||
| 14 | - = hidden_field_tag(key, value, id: nil) unless key == "filter_ref" | ||
| 15 | - | ||
| 16 | - .search.pull-right | ||
| 17 | - = form_tag project_graph_path(@project, @id), method: :get do |f| | ||
| 18 | - .control-group | ||
| 19 | - = label_tag :search , "Looking for commit:", class: 'control-label light' | ||
| 20 | - .controls | ||
| 21 | - = text_field_tag :q, @options[:q], placeholder: "Input SHA", class: "search-input xlarge" | ||
| 22 | - = button_tag type: 'submit', class: 'btn vtop' do | ||
| 23 | - %i.icon-search | ||
| 24 | - - @options.each do |key, value| | ||
| 25 | - = hidden_field_tag(key, value, id: nil) unless key == "q" | ||
| 26 | - |
app/views/graph/show.html.haml
| @@ -1,18 +0,0 @@ | @@ -1,18 +0,0 @@ | ||
| 1 | -= render "head" | ||
| 2 | -.graph_holder | ||
| 3 | - %h4 | ||
| 4 | - %small You can move around the graph by using the arrow keys. | ||
| 5 | - #holder.graph | ||
| 6 | - .loading.loading-gray | ||
| 7 | - | ||
| 8 | -:javascript | ||
| 9 | - var branch_graph; | ||
| 10 | - $("#filter_ref").click(function() { | ||
| 11 | - $(this).closest('form').submit(); | ||
| 12 | - }); | ||
| 13 | - branch_graph = new BranchGraph($("#holder"), { | ||
| 14 | - url: '#{project_graph_path(@project, @ref, @options.merge(format: :json))}', | ||
| 15 | - commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}', | ||
| 16 | - ref: '#{@ref}', | ||
| 17 | - commit_id: '#{@commit.id}' | ||
| 18 | - }); |
app/views/graph/show.json.erb
| @@ -1,23 +0,0 @@ | @@ -1,23 +0,0 @@ | ||
| 1 | -<% self.formats = ["html"] %> | ||
| 2 | - | ||
| 3 | -<%= raw( | ||
| 4 | - { | ||
| 5 | - days: @graph.days.compact.map { |d| [d.day, d.strftime("%b")] }, | ||
| 6 | - commits: @graph.commits.map do |c| | ||
| 7 | - { | ||
| 8 | - parents: parents_zip_spaces(c.parents(@graph.map), c.parent_spaces), | ||
| 9 | - author: { | ||
| 10 | - name: c.author_name, | ||
| 11 | - email: c.author_email, | ||
| 12 | - icon: gravatar_icon(c.author_email, 20) | ||
| 13 | - }, | ||
| 14 | - time: c.time, | ||
| 15 | - space: c.spaces.first, | ||
| 16 | - refs: get_refs(c), | ||
| 17 | - id: c.sha, | ||
| 18 | - date: c.date, | ||
| 19 | - message: c.message, | ||
| 20 | - } | ||
| 21 | - end | ||
| 22 | - }.to_json | ||
| 23 | -) %> |
| @@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
| 1 | +.loading-graph | ||
| 2 | + %center | ||
| 3 | + .loading | ||
| 4 | + %h3.page_title Building repository graph. Please wait a moment. | ||
| 5 | + | ||
| 6 | +.stat-graph | ||
| 7 | + .header.clearfix | ||
| 8 | + .pull-right | ||
| 9 | + %select | ||
| 10 | + %option{:value => "commits"} Commits | ||
| 11 | + %option{:value => "additions"} Additions | ||
| 12 | + %option{:value => "deletions"} Deletions | ||
| 13 | + %h3#date_header.page_title | ||
| 14 | + %input#brush_change{:type => "hidden"} | ||
| 15 | + .graphs | ||
| 16 | + #contributors-master | ||
| 17 | + #contributors.clearfix | ||
| 18 | + %ol.contributors-list.clearfix | ||
| 19 | + | ||
| 20 | +:javascript | ||
| 21 | + $(".stat-graph").hide(); | ||
| 22 | + | ||
| 23 | + $.ajax({ | ||
| 24 | + type: "GET", | ||
| 25 | + url: location.href, | ||
| 26 | + complete: function() { | ||
| 27 | + $(".loading-graph").hide(); | ||
| 28 | + $(".stat-graph").show(); | ||
| 29 | + }, | ||
| 30 | + dataType: "script" | ||
| 31 | + }); |
| @@ -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 | + |
app/views/layouts/nav/_project.html.haml
| @@ -9,10 +9,10 @@ | @@ -9,10 +9,10 @@ | ||
| 9 | = link_to 'Files', project_tree_path(@project, @ref || @repository.root_ref) | 9 | = link_to 'Files', project_tree_path(@project, @ref || @repository.root_ref) |
| 10 | = nav_link(controller: %w(commit commits compare repositories protected_branches)) do | 10 | = nav_link(controller: %w(commit commits compare repositories protected_branches)) do |
| 11 | = link_to "Commits", project_commits_path(@project, @ref || @repository.root_ref) | 11 | = link_to "Commits", project_commits_path(@project, @ref || @repository.root_ref) |
| 12 | - = nav_link(controller: %w(graph)) do | ||
| 13 | - = link_to "Network", project_graph_path(@project, @ref || @repository.root_ref) | ||
| 14 | - = nav_link(controller: %w(stat_graph)) do | ||
| 15 | - = link_to "Graphs", project_stat_graph_path(@project, @ref || @repository.root_ref) | 12 | + = nav_link(controller: %w(network)) do |
| 13 | + = link_to "Network", project_network_path(@project, @ref || @repository.root_ref) | ||
| 14 | + = nav_link(controller: %w(graphs)) do | ||
| 15 | + = link_to "Graphs", project_graph_path(@project, @ref || @repository.root_ref) | ||
| 16 | 16 | ||
| 17 | - if @project.issues_enabled | 17 | - if @project.issues_enabled |
| 18 | = nav_link(controller: %w(issues milestones labels)) do | 18 | = nav_link(controller: %w(issues milestones labels)) do |
| @@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
| 1 | +%h3.page_title Project Network Graph | ||
| 2 | +%hr | ||
| 3 | + | ||
| 4 | +.clearfix | ||
| 5 | + .pull-left | ||
| 6 | + = render partial: 'shared/ref_switcher', locals: {destination: 'graph'} | ||
| 7 | + .pull-left | ||
| 8 | + = form_tag project_network_path(@project, @id), method: :get do |f| | ||
| 9 | + .control-group | ||
| 10 | + = label_tag :filter_ref, "Show only selected ref", class: 'control-label light' | ||
| 11 | + .controls | ||
| 12 | + = check_box_tag :filter_ref, 1, @options[:filter_ref] | ||
| 13 | + - @options.each do |key, value| | ||
| 14 | + = hidden_field_tag(key, value, id: nil) unless key == "filter_ref" | ||
| 15 | + | ||
| 16 | + .search.pull-right | ||
| 17 | + = form_tag project_network_path(@project, @id), method: :get do |f| | ||
| 18 | + .control-group | ||
| 19 | + = label_tag :search , "Looking for commit:", class: 'control-label light' | ||
| 20 | + .controls | ||
| 21 | + = text_field_tag :q, @options[:q], placeholder: "Input SHA", class: "search-input xlarge" | ||
| 22 | + = button_tag type: 'submit', class: 'btn vtop' do | ||
| 23 | + %i.icon-search | ||
| 24 | + - @options.each do |key, value| | ||
| 25 | + = hidden_field_tag(key, value, id: nil) unless key == "q" | ||
| 26 | + |
| @@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
| 1 | += render "head" | ||
| 2 | +.graph_holder | ||
| 3 | + %h4 | ||
| 4 | + %small You can move around the graph by using the arrow keys. | ||
| 5 | + #holder.graph | ||
| 6 | + .loading.loading-gray | ||
| 7 | + | ||
| 8 | +:javascript | ||
| 9 | + var branch_graph; | ||
| 10 | + $("#filter_ref").click(function() { | ||
| 11 | + $(this).closest('form').submit(); | ||
| 12 | + }); | ||
| 13 | + branch_graph = new BranchGraph($("#holder"), { | ||
| 14 | + url: '#{project_network_path(@project, @ref, @options.merge(format: :json))}', | ||
| 15 | + commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}', | ||
| 16 | + ref: '#{@ref}', | ||
| 17 | + commit_id: '#{@commit.id}' | ||
| 18 | + }); |
| @@ -0,0 +1,23 @@ | @@ -0,0 +1,23 @@ | ||
| 1 | +<% self.formats = ["html"] %> | ||
| 2 | + | ||
| 3 | +<%= raw( | ||
| 4 | + { | ||
| 5 | + days: @graph.days.compact.map { |d| [d.day, d.strftime("%b")] }, | ||
| 6 | + commits: @graph.commits.map do |c| | ||
| 7 | + { | ||
| 8 | + parents: parents_zip_spaces(c.parents(@graph.map), c.parent_spaces), | ||
| 9 | + author: { | ||
| 10 | + name: c.author_name, | ||
| 11 | + email: c.author_email, | ||
| 12 | + icon: gravatar_icon(c.author_email, 20) | ||
| 13 | + }, | ||
| 14 | + time: c.time, | ||
| 15 | + space: c.spaces.first, | ||
| 16 | + refs: get_refs(c), | ||
| 17 | + id: c.sha, | ||
| 18 | + date: c.date, | ||
| 19 | + message: c.message, | ||
| 20 | + } | ||
| 21 | + end | ||
| 22 | + }.to_json | ||
| 23 | +) %> |
app/views/stat_graph/show.html.haml
| @@ -1,31 +0,0 @@ | @@ -1,31 +0,0 @@ | ||
| 1 | -.loading-graph | ||
| 2 | - %center | ||
| 3 | - .loading | ||
| 4 | - %h3.page_title Building repository graph. Please wait a moment. | ||
| 5 | - | ||
| 6 | -.stat-graph | ||
| 7 | - .header.clearfix | ||
| 8 | - .pull-right | ||
| 9 | - %select | ||
| 10 | - %option{:value => "commits"} Commits | ||
| 11 | - %option{:value => "additions"} Additions | ||
| 12 | - %option{:value => "deletions"} Deletions | ||
| 13 | - %h3#date_header.page_title | ||
| 14 | - %input#brush_change{:type => "hidden"} | ||
| 15 | - .graphs | ||
| 16 | - #contributors-master | ||
| 17 | - #contributors.clearfix | ||
| 18 | - %ol.contributors-list.clearfix | ||
| 19 | - | ||
| 20 | -:javascript | ||
| 21 | - $(".stat-graph").hide(); | ||
| 22 | - | ||
| 23 | - $.ajax({ | ||
| 24 | - type: "GET", | ||
| 25 | - url: location.href, | ||
| 26 | - complete: function() { | ||
| 27 | - $(".loading-graph").hide(); | ||
| 28 | - $(".stat-graph").show(); | ||
| 29 | - }, | ||
| 30 | - dataType: "script" | ||
| 31 | - }); |
app/views/stat_graph/show.js.haml
| @@ -1,16 +0,0 @@ | @@ -1,16 +0,0 @@ | ||
| 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 | - |
config/routes.rb
| @@ -190,8 +190,8 @@ Gitlab::Application.routes.draw do | @@ -190,8 +190,8 @@ Gitlab::Application.routes.draw do | ||
| 190 | resources :commits, only: [:show], constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} | 190 | resources :commits, only: [:show], constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} |
| 191 | resources :compare, only: [:index, :create] | 191 | resources :compare, only: [:index, :create] |
| 192 | resources :blame, only: [:show], constraints: {id: /.+/} | 192 | resources :blame, only: [:show], constraints: {id: /.+/} |
| 193 | - resources :graph, only: [:show], constraints: {id: /(?:[^.]|\.(?!json$))+/, format: /json/} | ||
| 194 | - resources :stat_graph, only: [:show], constraints: {id: /(?:[^.]|\.(?!json$))+/, format: /json/} | 193 | + resources :network, only: [:show], constraints: {id: /(?:[^.]|\.(?!json$))+/, format: /json/} |
| 194 | + resources :graphs, only: [:show], constraints: {id: /(?:[^.]|\.(?!json$))+/, format: /json/} | ||
| 195 | match "/compare/:from...:to" => "compare#show", as: "compare", via: [:get, :post], constraints: {from: /.+/, to: /.+/} | 195 | match "/compare/:from...:to" => "compare#show", as: "compare", via: [:get, :post], constraints: {from: /.+/, to: /.+/} |
| 196 | 196 | ||
| 197 | scope module: :projects do | 197 | scope module: :projects do |
features/steps/project/project_graph.rb
| @@ -8,6 +8,6 @@ class ProjectGraph < Spinach::FeatureSteps | @@ -8,6 +8,6 @@ class ProjectGraph < Spinach::FeatureSteps | ||
| 8 | 8 | ||
| 9 | When 'I visit project "Shop" graph page' do | 9 | When 'I visit project "Shop" graph page' do |
| 10 | project = Project.find_by_name("Shop") | 10 | project = Project.find_by_name("Shop") |
| 11 | - visit project_stat_graph_path(project, "master") | 11 | + visit project_graph_path(project, "master") |
| 12 | end | 12 | end |
| 13 | end | 13 | end |
features/steps/project/project_network_graph.rb
| @@ -12,7 +12,7 @@ class ProjectNetworkGraph < Spinach::FeatureSteps | @@ -12,7 +12,7 @@ class ProjectNetworkGraph < Spinach::FeatureSteps | ||
| 12 | Network::Graph.stub(max_count: 10) | 12 | Network::Graph.stub(max_count: 10) |
| 13 | 13 | ||
| 14 | project = Project.find_by_name("Shop") | 14 | project = Project.find_by_name("Shop") |
| 15 | - visit project_graph_path(project, "master") | 15 | + visit project_network_path(project, "master") |
| 16 | end | 16 | end |
| 17 | 17 | ||
| 18 | And 'page should select "master" in select box' do | 18 | And 'page should select "master" in select box' do |
features/steps/shared/paths.rb
| @@ -149,7 +149,7 @@ module SharedPaths | @@ -149,7 +149,7 @@ module SharedPaths | ||
| 149 | # Stub Graph max_size to speed up test (10 commits vs. 650) | 149 | # Stub Graph max_size to speed up test (10 commits vs. 650) |
| 150 | Network::Graph.stub(max_count: 10) | 150 | Network::Graph.stub(max_count: 10) |
| 151 | 151 | ||
| 152 | - visit project_graph_path(@project, root_ref) | 152 | + visit project_network_path(@project, root_ref) |
| 153 | end | 153 | end |
| 154 | 154 | ||
| 155 | step "I visit my project's issues page" do | 155 | step "I visit my project's issues page" do |
spec/routing/project_routing_spec.rb
| @@ -446,9 +446,15 @@ describe CompareController, "routing" do | @@ -446,9 +446,15 @@ describe CompareController, "routing" do | ||
| 446 | end | 446 | end |
| 447 | end | 447 | end |
| 448 | 448 | ||
| 449 | -describe GraphController, "routing" do | 449 | +describe NetworkController, "routing" do |
| 450 | it "to #show" do | 450 | it "to #show" do |
| 451 | - get("/gitlabhq/graph/master").should route_to('graph#show', project_id: 'gitlabhq', id: 'master') | ||
| 452 | - get("/gitlabhq/graph/master.json").should route_to('graph#show', project_id: 'gitlabhq', id: 'master', format: "json") | 451 | + get("/gitlabhq/network/master").should route_to('network#show', project_id: 'gitlabhq', id: 'master') |
| 452 | + get("/gitlabhq/network/master.json").should route_to('network#show', project_id: 'gitlabhq', id: 'master', format: "json") | ||
| 453 | + end | ||
| 454 | +end | ||
| 455 | + | ||
| 456 | +describe GraphsController, "routing" do | ||
| 457 | + it "to #show" do | ||
| 458 | + get("/gitlabhq/graphs/master").should route_to('graphs#show', project_id: 'gitlabhq', id: 'master') | ||
| 453 | end | 459 | end |
| 454 | end | 460 | end |