Skip to content
Snippets Groups Projects
Commit c843722d authored by Jeff Stubler's avatar Jeff Stubler
Browse files

Add graphs showing commits ahead and behind default to branches page

parent 8f75200d
No related branches found
No related tags found
2 merge requests!2301Add graphs of commits ahead/behind default branch (by @brunsa2),!1716Add graphs of commits ahead/behind default branch
Loading
Loading
@@ -16,6 +16,7 @@ v 8.2.0 (unreleased)
- Fix: 500 error returned if destroy request without HTTP referer (Kazuki Shimizu)
- Remove deprecated CI events from project settings page
- Use issue editor as cross reference comment author when issue is edited with a new mention.
- Add graphs of commits ahead and behind default branch (Jeff Stubler)
 
v 8.1.1
- Fix cloning Wiki repositories via HTTP (Stan Hu)
Loading
Loading
Loading
Loading
@@ -113,3 +113,62 @@ li.commit {
}
}
}
.divergence-graph {
padding: 12px 12px 0 0;
float: right;
.graph-side {
position: relative;
width: 80px;
height: 22px;
padding: 5px 0 13px;
float: left;
.bar {
position: absolute;
height: 4px;
background-color: #ccc;
}
.bar-behind {
right: 0;
border-radius: 3px 0 0 3px;
}
.bar-ahead {
left: 0;
border-radius: 0 3px 3px 0;
}
.count {
padding-top: 6px;
padding-bottom: 0px;
font-size: 12px;
color: #333;
display: block;
}
.count-behind {
padding-right: 4px;
text-align: right;
}
.count-ahead {
padding-left: 4px;
text-align: left;
}
}
.graph-separator {
position: relative;
width: 1px;
height: 18px;
margin: 5px 0 0;
float: left;
background-color: #ccc;
}
}
Loading
Loading
@@ -9,6 +9,12 @@ class Projects::BranchesController < Projects::ApplicationController
@sort = params[:sort] || 'name'
@branches = @repository.branches_sorted_by(@sort)
@branches = Kaminari.paginate_array(@branches).page(params[:page]).per(PER_PAGE)
@max_commits = @branches.reduce(0) do
|memo, branch|
diverging_commit_counts = repository.diverging_commit_counts(branch)
[memo, diverging_commit_counts[:behind], diverging_commit_counts[:ahead]].max
end
end
 
def recent
Loading
Loading
Loading
Loading
@@ -714,6 +714,8 @@ class Project < ActiveRecord::Base
end
 
def change_head(branch)
# Cached divergent commit counts are based on repository head
repository.expire_branch_cache
gitlab_shell.update_repository_head(self.path_with_namespace, branch)
reload_default_branch
end
Loading
Loading
Loading
Loading
@@ -147,9 +147,26 @@ class Repository
cache.fetch(:size) { raw_repository.size }
end
def diverging_commit_counts(branch)
branch_cache_key = ('diverging_commit_counts_' + branch.name).to_sym
cache.fetch(branch_cache_key) do
number_commits_behind = commits_between(branch.name, root_ref).size
number_commits_ahead = commits_between(root_ref, branch.name).size
{ behind: number_commits_behind, ahead: number_commits_ahead }
end
end
def cache_keys
%i(size branch_names tag_names commit_count
readme version contribution_guide changelog license)
%i(size branch_names tag_names commit_count readme
contribution_guide changelog license)
end
def branch_cache_keys
branches.map do
|branch|
('diverging_commit_counts_' + branch.name).to_sym
end
end
 
def build_cache
Loading
Loading
@@ -158,12 +175,28 @@ class Repository
send(key)
end
end
branches.each do |branch|
unless cache.exist?(('diverging_commit_counts_' + branch.name).to_sym)
send(:diverging_commit_counts, branch)
end
end
end
 
def expire_cache
cache_keys.each do |key|
cache.expire(key)
end
branches.each do |branch|
cache.expire(('diverging_commit_counts_' + branch.name).to_sym)
end
end
def expire_branch_cache
branches.each do |branch|
cache.expire(('diverging_commit_counts_' + branch.name).to_sym)
end
end
 
def rebuild_cache
Loading
Loading
@@ -171,6 +204,11 @@ class Repository
cache.expire(key)
send(key)
end
branches.each do |branch|
cache.expire(('diverging_commit_counts_' + branch.name).to_sym)
send(:diverging_commit_counts, branch)
end
end
 
def lookup_cache
Loading
Loading
- commit = @repository.commit(branch.target)
- bar_graph_width_factor = @max_commits > 0 ? 100.0/@max_commits : 0
- number_commits_behind = @repository.diverging_commit_counts(branch)[:behind]
- number_commits_ahead = @repository.diverging_commit_counts(branch)[:ahead]
%li(class="js-branch-#{branch.name}")
%div
= link_to namespace_project_tree_path(@project.namespace, @project, branch.name) do
Loading
Loading
@@ -29,6 +32,17 @@
= link_to namespace_project_branch_path(@project.namespace, @project, branch.name), class: 'btn btn-grouped btn-xs btn-remove remove-row', method: :delete, data: { confirm: 'Removed branch cannot be restored. Are you sure?'}, remote: true do
= icon("trash-o")
 
- if branch.name != @repository.root_ref
.divergence-graph{ :title => "#{number_commits_ahead} commits ahead, #{number_commits_behind} commits behind #{@repository.root_ref}" }
.graph-side
.bar.bar-behind{ :style => "width: #{number_commits_behind * bar_graph_width_factor}%" }
%span.count.count-behind= number_commits_behind
.graph-separator
.graph-side
.bar.bar-ahead{ :style => "width: #{number_commits_ahead * bar_graph_width_factor}%" }
%span.count.count-ahead= number_commits_ahead
- if commit
= render 'projects/branches/commit', commit: commit, project: @project
- else
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment