Merge branch 'hiroponz-easy-to-find-commit-on-network-graph'
This commit is contained in:
commit
452adb7bcc
7 changed files with 99 additions and 34 deletions
|
@ -20,6 +20,7 @@
|
|||
.hint { font-style: italic; color: #999; }
|
||||
.light { color: #888 }
|
||||
.tiny { font-weight: normal }
|
||||
.vtop { vertical-align: top; }
|
||||
|
||||
|
||||
/** ALERT MESSAGES **/
|
||||
|
|
|
@ -7,10 +7,20 @@ class GraphController < ProjectResourceController
|
|||
before_filter :require_non_empty_project
|
||||
|
||||
def show
|
||||
if params.has_key?(:q) && params[:q].blank?
|
||||
redirect_to project_graph_path(@project, params[:id])
|
||||
return
|
||||
end
|
||||
|
||||
if params.has_key?(:q)
|
||||
@q = params[:q]
|
||||
@commit = @project.repository.commit(@q) || @commit
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.json do
|
||||
graph = Gitlab::Graph::JsonBuilder.new(project, @ref)
|
||||
graph = Gitlab::Graph::JsonBuilder.new(project, @ref, @commit)
|
||||
render :json => graph.to_json
|
||||
end
|
||||
end
|
||||
|
|
16
app/views/graph/_head.html.haml
Normal file
16
app/views/graph/_head.html.haml
Normal file
|
@ -0,0 +1,16 @@
|
|||
%h3.page_title Project Network Graph
|
||||
%hr
|
||||
|
||||
.clearfix
|
||||
.pull-left
|
||||
= render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path}
|
||||
|
||||
.search.pull-right
|
||||
= form_tag project_graph_path(@project, params[:id]), method: :get do |f|
|
||||
.control-group
|
||||
= label_tag :search , "Looking for commit:", class: 'control-label light'
|
||||
.controls
|
||||
= text_field_tag :q, @q, placeholder: "Input SHA", class: "search-input xlarge"
|
||||
= button_tag type: 'submit', class: 'btn vtop' do
|
||||
%i.icon-search
|
||||
|
|
@ -1,7 +1,4 @@
|
|||
%h3.page_title Project Network Graph
|
||||
%br
|
||||
= render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path}
|
||||
%br
|
||||
= render "head"
|
||||
.graph_holder
|
||||
%h4
|
||||
%small You can move around the graph by using the arrow keys.
|
||||
|
@ -12,8 +9,9 @@
|
|||
var branch_graph;
|
||||
$(function(){
|
||||
branch_graph = new BranchGraph($("#holder"), {
|
||||
url: '#{project_graph_path(@project, @ref, format: :json)}',
|
||||
url: '#{project_graph_path(@project, @ref, q: @q, format: :json)}',
|
||||
commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}',
|
||||
ref: '#{@ref}'
|
||||
ref: '#{@ref}',
|
||||
commit_id: '#{@commit.id}'
|
||||
});
|
||||
});
|
||||
|
|
|
@ -117,7 +117,10 @@ module ExtractsPath
|
|||
|
||||
@id = File.join(@ref, @path)
|
||||
|
||||
@commit = CommitDecorator.decorate(@project.repository.commit(@ref))
|
||||
# It is used "@project.repository.commits(@ref, @path, 1, 0)",
|
||||
# because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name.
|
||||
commits = @project.repository.commits(@ref, @path, 1, 0)
|
||||
@commit = CommitDecorator.decorate(commits.first)
|
||||
|
||||
@tree = Tree.new(@commit.tree, @ref, @path)
|
||||
@tree = TreeDecorator.new(@tree)
|
||||
|
|
|
@ -9,9 +9,10 @@ module Gitlab
|
|||
@max_count ||= 650
|
||||
end
|
||||
|
||||
def initialize project, ref
|
||||
def initialize project, ref, commit
|
||||
@project = project
|
||||
@ref = ref
|
||||
@commit = commit
|
||||
@repo = project.repo
|
||||
@ref_cache = {}
|
||||
|
||||
|
@ -31,7 +32,8 @@ module Gitlab
|
|||
# Get commits from repository
|
||||
#
|
||||
def collect_commits
|
||||
@commits = Grit::Commit.find_all(repo, nil, {max_count: self.class.max_count}).dup
|
||||
|
||||
@commits = Grit::Commit.find_all(repo, nil, {topo_order: true, max_count: self.class.max_count, skip: to_commit}).dup
|
||||
|
||||
# Decorate with app/models/commit.rb
|
||||
@commits.map! { |commit| ::Commit.new(commit) }
|
||||
|
@ -49,41 +51,28 @@ module Gitlab
|
|||
# list of commits. As well as returns date list
|
||||
# corelated with time set on commits.
|
||||
#
|
||||
# @param [Array<Graph::Commit>] comits to index
|
||||
# @param [Array<Graph::Commit>] commits to index
|
||||
#
|
||||
# @return [Array<TimeDate>] list of commit dates corelated with time on commits
|
||||
def index_commits
|
||||
days, heads, times = [], [], []
|
||||
days, times = [], []
|
||||
map = {}
|
||||
|
||||
commits.reverse.each_with_index do |c,i|
|
||||
c.time = i
|
||||
days[i] = c.committed_date
|
||||
map[c.id] = c
|
||||
heads += c.refs unless c.refs.nil?
|
||||
times[i] = c
|
||||
end
|
||||
|
||||
heads.select!{|h| h.is_a? Grit::Head or h.is_a? Grit::Remote}
|
||||
# sort heads so the master is top and current branches are closer
|
||||
heads.sort! do |a,b|
|
||||
if a.name == @ref
|
||||
-1
|
||||
elsif b.name == @ref
|
||||
1
|
||||
else
|
||||
b.commit.committed_date <=> a.commit.committed_date
|
||||
end
|
||||
end
|
||||
|
||||
@_reserved = {}
|
||||
days.each_index do |i|
|
||||
@_reserved[i] = []
|
||||
end
|
||||
|
||||
heads.each do |h|
|
||||
if map.include? h.commit.id then
|
||||
place_chain(map[h.commit.id], map)
|
||||
commits_sort_by_ref.each do |commit|
|
||||
if map.include? commit.id then
|
||||
place_chain(map[commit.id], map)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -95,6 +84,45 @@ module Gitlab
|
|||
days
|
||||
end
|
||||
|
||||
# Skip count that the target commit is displayed in center.
|
||||
def to_commit
|
||||
commits = Grit::Commit.find_all(repo, nil, {topo_order: true})
|
||||
commit_index = commits.index do |c|
|
||||
c.id == @commit.id
|
||||
end
|
||||
|
||||
if commit_index && (self.class.max_count / 2 < commit_index) then
|
||||
# get max index that commit is displayed in the center.
|
||||
commit_index - self.class.max_count / 2
|
||||
else
|
||||
0
|
||||
end
|
||||
end
|
||||
|
||||
def commits_sort_by_ref
|
||||
commits.sort do |a,b|
|
||||
if include_ref?(a)
|
||||
-1
|
||||
elsif include_ref?(b)
|
||||
1
|
||||
else
|
||||
b.committed_date <=> a.committed_date
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def include_ref?(commit)
|
||||
heads = commit.refs.select do |ref|
|
||||
ref.is_a?(Grit::Head) or ref.is_a?(Grit::Remote) or ref.is_a?(Grit::Tag)
|
||||
end
|
||||
|
||||
heads.map! do |head|
|
||||
head.name
|
||||
end
|
||||
|
||||
heads.include?(@ref)
|
||||
end
|
||||
|
||||
def find_free_parent_spaces(commit, map, times)
|
||||
spaces = []
|
||||
|
||||
|
|
21
vendor/assets/javascripts/branch-graph.js
vendored
21
vendor/assets/javascripts/branch-graph.js
vendored
|
@ -161,14 +161,23 @@
|
|||
|
||||
if (this.commits[i].refs) {
|
||||
this.appendLabel(x, y, this.commits[i].refs);
|
||||
|
||||
// The main branch is displayed in the center.
|
||||
re = new RegExp('(^| )' + this.options.ref + '( |$)');
|
||||
if (this.commits[i].refs.match(re)) {
|
||||
scrollLeft = x - graphWidth / 2;
|
||||
}
|
||||
}
|
||||
|
||||
// mark commit and displayed in the center
|
||||
if (this.commits[i].id == this.options.commit_id) {
|
||||
r.path([
|
||||
'M', x, y - 5,
|
||||
'L', x + 4, y - 15,
|
||||
'L', x - 4, y - 15,
|
||||
'Z'
|
||||
]).attr({
|
||||
"fill": "#000",
|
||||
"fill-opacity": .7,
|
||||
"stroke": "none"
|
||||
});
|
||||
scrollLeft = x - graphWidth / 2;
|
||||
}
|
||||
|
||||
this.appendAnchor(top, this.commits[i], x, y);
|
||||
}
|
||||
top.toFront();
|
||||
|
|
Loading…
Reference in a new issue