Commit d906f19c authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'move-protected-branches' into 'master'

Move protected branches to Project settings page

Because all settings should be in one place
parents c8abf223 695fd3cf
...@@ -7,7 +7,9 @@ class Projects::BranchesController < Projects::ApplicationController ...@@ -7,7 +7,9 @@ class Projects::BranchesController < Projects::ApplicationController
before_filter :authorize_push!, only: [:create, :destroy] before_filter :authorize_push!, only: [:create, :destroy]
def index def index
@branches = Kaminari.paginate_array(@repository.branches).page(params[:page]).per(30) @sort = params[:sort] || 'name'
@branches = @repository.branches_sorted_by(@sort)
@branches = Kaminari.paginate_array(@branches).page(params[:page]).per(30)
end end
def recent def recent
......
class Projects::ProtectedBranchesController < Projects::ApplicationController class Projects::ProtectedBranchesController < Projects::ApplicationController
# Authorize # Authorize
before_filter :authorize_read_project!
before_filter :require_non_empty_project before_filter :require_non_empty_project
before_filter :authorize_admin_project!
before_filter :authorize_admin_project!, only: [:destroy, :create] layout "project_settings"
def index def index
@branches = @project.protected_branches.to_a @branches = @project.protected_branches.to_a
......
...@@ -75,7 +75,7 @@ module TabHelper ...@@ -75,7 +75,7 @@ module TabHelper
def project_tab_class def project_tab_class
return "active" if current_page?(controller: "/projects", action: :edit, id: @project) return "active" if current_page?(controller: "/projects", action: :edit, id: @project)
if ['services', 'hooks', 'deploy_keys', 'team_members'].include? controller.controller_name if ['services', 'hooks', 'deploy_keys', 'team_members', 'protected_branches'].include? controller.controller_name
"active" "active"
end end
end end
......
...@@ -55,12 +55,6 @@ class Repository ...@@ -55,12 +55,6 @@ class Repository
tags.find { |tag| tag.name == name } tags.find { |tag| tag.name == name }
end end
def recent_branches(limit = 20)
branches.sort do |a, b|
commit(b.target).committed_date <=> commit(a.target).committed_date
end[0..limit]
end
def add_branch(branch_name, ref) def add_branch(branch_name, ref)
Rails.cache.delete(cache_key(:branch_names)) Rails.cache.delete(cache_key(:branch_names))
...@@ -220,4 +214,19 @@ class Repository ...@@ -220,4 +214,19 @@ class Repository
def clean_old_archives def clean_old_archives
Gitlab::Popen.popen(%W(find #{Gitlab.config.gitlab.repository_downloads_path} -mmin +120 -delete)) Gitlab::Popen.popen(%W(find #{Gitlab.config.gitlab.repository_downloads_path} -mmin +120 -delete))
end end
def branches_sorted_by(value)
case value
when 'recently_updated'
branches.sort do |a, b|
commit(b.target).committed_date <=> commit(a.target).committed_date
end
when 'last_updated'
branches.sort do |a, b|
commit(a.target).committed_date <=> commit(b.target).committed_date
end
else
branches
end
end
end end
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
= link_to 'Files', project_tree_path(@project, @ref || @repository.root_ref) = link_to 'Files', project_tree_path(@project, @ref || @repository.root_ref)
- if project_nav_tab? :commits - if project_nav_tab? :commits
= nav_link(controller: %w(commit commits compare repositories protected_branches tags branches)) do = nav_link(controller: %w(commit commits compare repositories tags branches)) do
= link_to "Commits", project_commits_path(@project, @ref || @repository.root_ref) = link_to "Commits", project_commits_path(@project, @ref || @repository.root_ref)
- if project_nav_tab? :network - if project_nav_tab? :network
......
...@@ -19,3 +19,7 @@ ...@@ -19,3 +19,7 @@
= link_to project_services_path(@project) do = link_to project_services_path(@project) do
%i.icon-cogs %i.icon-cogs
Services Services
= nav_link(controller: :protected_branches) do
= link_to project_protected_branches_path(@project) do
%i.icon-lock
Protected branches
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
- if @project.protected_branch? branch.name - if @project.protected_branch? branch.name
%span.label.label-success %span.label.label-success
%i.icon-lock %i.icon-lock
protected
.pull-right .pull-right
- if can?(current_user, :download_code, @project) - if can?(current_user, :download_code, @project)
= render 'projects/repositories/download_archive', ref: branch.name, btn_class: 'btn-grouped btn-group-small' = render 'projects/repositories/download_archive', ref: branch.name, btn_class: 'btn-grouped btn-group-small'
...@@ -21,13 +22,8 @@ ...@@ -21,13 +22,8 @@
%i.icon-trash %i.icon-trash
- if commit - if commit
%p %ul.list-unstyled
= link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do = render 'projects/commits/inline_commit', commit: commit, project: @project
= commit.short_id
= image_tag avatar_icon(commit.author_email), class: "avatar s16", alt: ''
%span.light
= gfm escape_once(truncate(commit.title, length: 40))
#{time_ago_with_tooltip(commit.committed_date)}
- else - else
%p %p
Cant find HEAD commit for this branch Cant find HEAD commit for this branch
%ul.nav.nav-pills.nav-stacked
= nav_link(path: 'branches#recent') do
= link_to recent_project_branches_path(@project) do
Recent
.pull-right
= @repository.recent_branches.count
= nav_link(path: 'protected_branches#index') do
= link_to project_protected_branches_path(@project) do
Protected
%i.icon-lock
.pull-right
= @project.protected_branches.count
= nav_link(path: 'branches#index') do
= link_to project_branches_path(@project) do
All branches
.pull-right
= @repository.branch_names.count
%hr
- if can? current_user, :push_code, @project
= link_to new_project_branch_path(@project), class: 'btn btn-create' do
%i.icon-add-sign
New branch
= render "projects/commits/head" = render "projects/commits/head"
.row %h3.page-title
.col-md-3 Branches
= render "filter" .pull-right
.col-md-9 - if can? current_user, :push_code, @project
- unless @branches.empty? = link_to new_project_branch_path(@project), class: 'btn btn-create' do
%ul.bordered-list.top-list.all-branches %i.icon-add-sign
- @branches.each do |branch| New branch
= render "projects/branches/branch", branch: branch &nbsp;
= paginate @branches, theme: 'gitlab' .dropdown.inline
%a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
%span.light sort:
- if @sort.present?
= @sort.humanize
- else
Name
%b.caret
%ul.dropdown-menu
%li
= link_to project_branches_path(sort: nil) do
Name
= link_to project_branches_path(sort: 'recently_updated') do
Recently updated
= link_to project_branches_path(sort: 'last_updated') do
Last updated
%hr
- unless @branches.empty?
%ul.bordered-list.top-list.all-branches
- @branches.each do |branch|
= render "projects/branches/branch", branch: branch
= paginate @branches, theme: 'gitlab'
= render "projects/commits/head"
.row
.col-md-3
= render "filter"
.col-md-9
%ul.bordered-list.top-list
- @branches.each do |branch|
= render "projects/branches/branch", branch: branch
...@@ -7,9 +7,9 @@ ...@@ -7,9 +7,9 @@
= link_to 'Compare', project_compare_index_path(@project, from: @repository.root_ref, to: @ref || @repository.root_ref) = link_to 'Compare', project_compare_index_path(@project, from: @repository.root_ref, to: @ref || @repository.root_ref)
= nav_link(html_options: {class: branches_tab_class}) do = nav_link(html_options: {class: branches_tab_class}) do
= link_to recent_project_branches_path(@project) do = link_to project_branches_path(@project) do
Branches Branches
%span.badge= @repository.branches.length %span.badge= @repository.branches.size
= nav_link(controller: :tags) do = nav_link(controller: :tags) do
= link_to project_tags_path(@project) do = link_to project_tags_path(@project) do
......
= render "projects/commits/head" %h3.page-title Protected branches
.row %p.light This ability allows to keep stable branches secured and force code review before merge to protected branches
.col-md-3 %hr
= render "projects/branches/filter"
.col-md-9
.bs-callout.bs-callout-info
%p Protected branches designed to
%ul
%li prevent push for all except #{link_to "masters", help_permissions_path, class: "vlink"}.
%li prevent branch from force push
%li prevent branch from removal
%p This ability allows to keep stable branches secured and force code review before merge to protected branches
%p Read more about project permissions #{link_to "here", help_permissions_path, class: "underlined-link"}
- if can? current_user, :admin_project, @project .bs-callout.bs-callout-info
= form_for [@project, @protected_branch], html: { class: 'form-horizontal' } do |f| %p Protected branches designed to
-if @protected_branch.errors.any? %ul
.alert.alert-danger %li prevent push for all except #{link_to "masters", help_permissions_path, class: "vlink"}.
%ul %li prevent branch from force push
- @protected_branch.errors.full_messages.each do |msg| %li prevent branch from removal
%li= msg %p Read more about project permissions #{link_to "here", help_permissions_path, class: "underlined-link"}
.form-group - if can? current_user, :admin_project, @project
= f.label :name, "Branch", class: 'control-label' = form_for [@project, @protected_branch], html: { class: 'form-horizontal' } do |f|
.col-sm-10 -if @protected_branch.errors.any?
= f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: "Select branch"}, {class: "select2"}) .alert.alert-danger
.form-actions %ul
= f.submit 'Protect', class: "btn-create btn" - @protected_branch.errors.full_messages.each do |msg|
- unless @branches.empty? %li= msg
%h5 Already Protected:
%ul.bordered-list.protected-branches-list
- @branches.each do |branch|
%li
%h4
= link_to project_commits_path(@project, branch.name) do
%strong= branch.name
- if @project.root_ref?(branch.name)
%span.label.label-info default
%span.label.label-success
%i.icon-lock
.pull-right
- if can? current_user, :admin_project, @project
= link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small"
- if commit = branch.commit .form-group
= link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do = f.label :name, "Branch", class: 'control-label'
= commit.short_id .col-sm-10
%span.light = f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: "Select branch"}, {class: "select2"})
= gfm escape_once(truncate(commit.title, length: 40)) .form-actions
#{time_ago_with_tooltip(commit.committed_date)} = f.submit 'Protect', class: "btn-create btn"
- else - unless @branches.empty?
(branch was removed from repository) %h5 Already Protected:
%ul.bordered-list.protected-branches-list
- @branches.each do |branch|
%li
%h4
= link_to project_commits_path(@project, branch.name) do
%strong= branch.name
- if @project.root_ref?(branch.name)
%span.label.label-info default
%span.label.label-success
%i.icon-lock
.pull-right
- if can? current_user, :admin_project, @project
= link_to 'Unprotect', [@project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-small"
- if commit = branch.commit
= link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do
= commit.short_id
%span.light
= gfm escape_once(truncate(commit.title, length: 40))
#{time_ago_with_tooltip(commit.committed_date)}
- else
(branch was removed from repository)
...@@ -243,12 +243,7 @@ Gitlab::Application.routes.draw do ...@@ -243,12 +243,7 @@ Gitlab::Application.routes.draw do
end end
end end
resources :branches, only: [:index, :new, :create, :destroy], constraints: { id: Gitlab::Regex.git_reference_regex } do resources :branches, only: [:index, :new, :create, :destroy], constraints: { id: Gitlab::Regex.git_reference_regex }
collection do
get :recent, constraints: { id: Gitlab::Regex.git_reference_regex }
end
end
resources :tags, only: [:index, :new, :create, :destroy], constraints: { id: Gitlab::Regex.git_reference_regex } resources :tags, only: [:index, :new, :create, :destroy], constraints: { id: Gitlab::Regex.git_reference_regex }
resources :protected_branches, only: [:index, :create, :destroy], constraints: { id: Gitlab::Regex.git_reference_regex } resources :protected_branches, only: [:index, :create, :destroy], constraints: { id: Gitlab::Regex.git_reference_regex }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment