Commit ddea7d1689e1bbe62d6f226986e51ce7a0eb835d

Authored by Dmitriy Zaporozhets
2 parents d6513b51 9dccecc9

Merge branch 'easy-to-find-commit-on-network-graph' of https://github.com/hiropo…

…nz/gitlabhq into hiroponz-easy-to-find-commit-on-network-graph
app/controllers/graph_controller.rb
@@ -7,10 +7,20 @@ class GraphController < ProjectResourceController @@ -7,10 +7,20 @@ class GraphController < ProjectResourceController
7 before_filter :require_non_empty_project 7 before_filter :require_non_empty_project
8 8
9 def show 9 def show
  10 + if params.has_key?(:q) && params[:q].blank?
  11 + redirect_to project_graph_path(@project, params[:id])
  12 + return
  13 + end
  14 +
  15 + if params.has_key?(:q)
  16 + @q = params[:q]
  17 + @commit = @project.repository.commit(@q) || @commit
  18 + end
  19 +
10 respond_to do |format| 20 respond_to do |format|
11 format.html 21 format.html
12 format.json do 22 format.json do
13 - graph = Gitlab::Graph::JsonBuilder.new(project, @ref) 23 + graph = Gitlab::Graph::JsonBuilder.new(project, @ref, @commit)
14 render :json => graph.to_json 24 render :json => graph.to_json
15 end 25 end
16 end 26 end
app/views/graph/_head.html.haml 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +%ul.nav.nav-tabs
  2 + %li
  3 + = render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path}
  4 + %li.pull-right.search
  5 + = form_tag project_graph_path(@project, params[:id]), method: :get, class: 'navbar-form' do |f|
  6 + = label_tag :search , "Looking for commit:"
  7 + = text_field_tag :q, @q, placeholder: "Input SHA", class: "search-input"
  8 +
  9 +%h3.page_title Project Network Graph
app/views/graph/show.html.haml
1 -%h3.page_title Project Network Graph  
2 -%br  
3 -= render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path}  
4 -%br 1 += render "head"
5 .graph_holder 2 .graph_holder
6 %h4 3 %h4
7 %small You can move around the graph by using the arrow keys. 4 %small You can move around the graph by using the arrow keys.
@@ -12,8 +9,9 @@ @@ -12,8 +9,9 @@
12 var branch_graph; 9 var branch_graph;
13 $(function(){ 10 $(function(){
14 branch_graph = new BranchGraph($("#holder"), { 11 branch_graph = new BranchGraph($("#holder"), {
15 - url: '#{project_graph_path(@project, @ref, format: :json)}', 12 + url: '#{project_graph_path(@project, @ref, q: @q, format: :json)}',
16 commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}', 13 commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}',
17 - ref: '#{@ref}' 14 + ref: '#{@ref}',
  15 + commit_id: '#{@commit.id}'
18 }); 16 });
19 }); 17 });
lib/extracts_path.rb
@@ -117,7 +117,10 @@ module ExtractsPath @@ -117,7 +117,10 @@ module ExtractsPath
117 117
118 @id = File.join(@ref, @path) 118 @id = File.join(@ref, @path)
119 119
120 - @commit = CommitDecorator.decorate(@project.repository.commit(@ref)) 120 + # It is used "@project.repository.commits(@ref, @path, 1, 0)",
  121 + # because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name.
  122 + commits = @project.repository.commits(@ref, @path, 1, 0)
  123 + @commit = CommitDecorator.decorate(commits.first)
121 124
122 @tree = Tree.new(@commit.tree, @ref, @path) 125 @tree = Tree.new(@commit.tree, @ref, @path)
123 @tree = TreeDecorator.new(@tree) 126 @tree = TreeDecorator.new(@tree)
lib/gitlab/graph/json_builder.rb
@@ -9,9 +9,10 @@ module Gitlab @@ -9,9 +9,10 @@ module Gitlab
9 @max_count ||= 650 9 @max_count ||= 650
10 end 10 end
11 11
12 - def initialize project, ref 12 + def initialize project, ref, commit
13 @project = project 13 @project = project
14 @ref = ref 14 @ref = ref
  15 + @commit = commit
15 @repo = project.repo 16 @repo = project.repo
16 @ref_cache = {} 17 @ref_cache = {}
17 18
@@ -31,7 +32,8 @@ module Gitlab @@ -31,7 +32,8 @@ module Gitlab
31 # Get commits from repository 32 # Get commits from repository
32 # 33 #
33 def collect_commits 34 def collect_commits
34 - @commits = Grit::Commit.find_all(repo, nil, {max_count: self.class.max_count}).dup 35 +
  36 + @commits = Grit::Commit.find_all(repo, nil, {topo_order: true, max_count: self.class.max_count, skip: to_commit}).dup
35 37
36 # Decorate with app/models/commit.rb 38 # Decorate with app/models/commit.rb
37 @commits.map! { |commit| ::Commit.new(commit) } 39 @commits.map! { |commit| ::Commit.new(commit) }
@@ -49,41 +51,28 @@ module Gitlab @@ -49,41 +51,28 @@ module Gitlab
49 # list of commits. As well as returns date list 51 # list of commits. As well as returns date list
50 # corelated with time set on commits. 52 # corelated with time set on commits.
51 # 53 #
52 - # @param [Array<Graph::Commit>] comits to index 54 + # @param [Array<Graph::Commit>] commits to index
53 # 55 #
54 # @return [Array<TimeDate>] list of commit dates corelated with time on commits 56 # @return [Array<TimeDate>] list of commit dates corelated with time on commits
55 def index_commits 57 def index_commits
56 - days, heads, times = [], [], [] 58 + days, times = [], []
57 map = {} 59 map = {}
58 60
59 commits.reverse.each_with_index do |c,i| 61 commits.reverse.each_with_index do |c,i|
60 c.time = i 62 c.time = i
61 days[i] = c.committed_date 63 days[i] = c.committed_date
62 map[c.id] = c 64 map[c.id] = c
63 - heads += c.refs unless c.refs.nil?  
64 times[i] = c 65 times[i] = c
65 end 66 end
66 67
67 - heads.select!{|h| h.is_a? Grit::Head or h.is_a? Grit::Remote}  
68 - # sort heads so the master is top and current branches are closer  
69 - heads.sort! do |a,b|  
70 - if a.name == @ref  
71 - -1  
72 - elsif b.name == @ref  
73 - 1  
74 - else  
75 - b.commit.committed_date <=> a.commit.committed_date  
76 - end  
77 - end  
78 -  
79 @_reserved = {} 68 @_reserved = {}
80 days.each_index do |i| 69 days.each_index do |i|
81 @_reserved[i] = [] 70 @_reserved[i] = []
82 end 71 end
83 72
84 - heads.each do |h|  
85 - if map.include? h.commit.id then  
86 - place_chain(map[h.commit.id], map) 73 + commits_sort_by_ref.each do |commit|
  74 + if map.include? commit.id then
  75 + place_chain(map[commit.id], map)
87 end 76 end
88 end 77 end
89 78
@@ -95,6 +84,45 @@ module Gitlab @@ -95,6 +84,45 @@ module Gitlab
95 days 84 days
96 end 85 end
97 86
  87 + # Skip count that the target commit is displayed in center.
  88 + def to_commit
  89 + commits = Grit::Commit.find_all(repo, nil, {topo_order: true})
  90 + commit_index = commits.index do |c|
  91 + c.id == @commit.id
  92 + end
  93 +
  94 + if commit_index && (self.class.max_count / 2 < commit_index) then
  95 + # get max index that commit is displayed in the center.
  96 + commit_index - self.class.max_count / 2
  97 + else
  98 + 0
  99 + end
  100 + end
  101 +
  102 + def commits_sort_by_ref
  103 + commits.sort do |a,b|
  104 + if include_ref?(a)
  105 + -1
  106 + elsif include_ref?(b)
  107 + 1
  108 + else
  109 + b.committed_date <=> a.committed_date
  110 + end
  111 + end
  112 + end
  113 +
  114 + def include_ref?(commit)
  115 + heads = commit.refs.select do |ref|
  116 + ref.is_a?(Grit::Head) or ref.is_a?(Grit::Remote) or ref.is_a?(Grit::Tag)
  117 + end
  118 +
  119 + heads.map! do |head|
  120 + head.name
  121 + end
  122 +
  123 + heads.include?(@ref)
  124 + end
  125 +
98 def find_free_parent_spaces(commit, map, times) 126 def find_free_parent_spaces(commit, map, times)
99 spaces = [] 127 spaces = []
100 128
vendor/assets/javascripts/branch-graph.js
@@ -161,14 +161,23 @@ @@ -161,14 +161,23 @@
161 161
162 if (this.commits[i].refs) { 162 if (this.commits[i].refs) {
163 this.appendLabel(x, y, this.commits[i].refs); 163 this.appendLabel(x, y, this.commits[i].refs);
164 -  
165 - // The main branch is displayed in the center.  
166 - re = new RegExp('(^| )' + this.options.ref + '( |$)');  
167 - if (this.commits[i].refs.match(re)) {  
168 - scrollLeft = x - graphWidth / 2;  
169 - }  
170 } 164 }
171 165
  166 + // mark commit and displayed in the center
  167 + if (this.commits[i].id == this.options.commit_id) {
  168 + r.path([
  169 + 'M', x, y - 5,
  170 + 'L', x + 4, y - 15,
  171 + 'L', x - 4, y - 15,
  172 + 'Z'
  173 + ]).attr({
  174 + "fill": "#000",
  175 + "fill-opacity": .7,
  176 + "stroke": "none"
  177 + });
  178 + scrollLeft = x - graphWidth / 2;
  179 + }
  180 +
172 this.appendAnchor(top, this.commits[i], x, y); 181 this.appendAnchor(top, this.commits[i], x, y);
173 } 182 }
174 top.toFront(); 183 top.toFront();