Commit 695fd3cf authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Move protected branches to Project settings

Signed-off-by: default avatarDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
parent 8ae2d215
......@@ -7,7 +7,9 @@ class Projects::BranchesController < Projects::ApplicationController
before_filter :authorize_push!, only: [:create, :destroy]
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
def recent
......
class Projects::ProtectedBranchesController < Projects::ApplicationController
# Authorize
before_filter :authorize_read_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
@branches = @project.protected_branches.to_a
......
......@@ -75,7 +75,7 @@ module TabHelper
def project_tab_class
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"
end
end
......
......@@ -55,12 +55,6 @@ class Repository
tags.find { |tag| tag.name == name }
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)
Rails.cache.delete(cache_key(:branch_names))
......@@ -220,4 +214,19 @@ class Repository
def clean_old_archives
Gitlab::Popen.popen(%W(find #{Gitlab.config.gitlab.repository_downloads_path} -mmin +120 -delete))
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
......@@ -8,7 +8,7 @@
= link_to 'Files', project_tree_path(@project, @ref || @repository.root_ref)
- 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)
- if project_nav_tab? :network
......
......@@ -19,3 +19,7 @@
= link_to project_services_path(@project) do
%i.icon-cogs
Services
= nav_link(controller: :protected_branches) do
= link_to project_protected_branches_path(@project) do
%i.icon-lock
Protected branches
......@@ -8,6 +8,7 @@
- if @project.protected_branch? branch.name
%span.label.label-success
%i.icon-lock
protected
.pull-right
- if can?(current_user, :download_code, @project)
= render 'projects/repositories/download_archive', ref: branch.name, btn_class: 'btn-grouped btn-group-small'
......@@ -21,13 +22,8 @@
%i.icon-trash
- if commit
%p
= link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do
= 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)}
%ul.list-unstyled
= render 'projects/commits/inline_commit', commit: commit, project: @project
- else
%p
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"
.row
.col-md-3
= render "filter"
.col-md-9
- unless @branches.empty?
%ul.bordered-list.top-list.all-branches
- @branches.each do |branch|
= render "projects/branches/branch", branch: branch
= paginate @branches, theme: 'gitlab'
%h3.page-title
Branches
.pull-right
- 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
&nbsp;
.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 @@
= 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
= link_to recent_project_branches_path(@project) do
= link_to project_branches_path(@project) do
Branches
%span.badge= @repository.branches.length
%span.badge= @repository.branches.size
= nav_link(controller: :tags) do
= link_to project_tags_path(@project) do
......
= render "projects/commits/head"
.row
.col-md-3
= 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"}
%h3.page-title Protected branches
%p.light This ability allows to keep stable branches secured and force code review before merge to protected branches
%hr
- if can? current_user, :admin_project, @project
= form_for [@project, @protected_branch], html: { class: 'form-horizontal' } do |f|
-if @protected_branch.errors.any?
.alert.alert-danger
%ul
- @protected_branch.errors.full_messages.each do |msg|
%li= msg
.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 Read more about project permissions #{link_to "here", help_permissions_path, class: "underlined-link"}
.form-group
= f.label :name, "Branch", class: 'control-label'
.col-sm-10
= f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: "Select branch"}, {class: "select2"})
.form-actions
= f.submit 'Protect', class: "btn-create btn"
- unless @branches.empty?
%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 can? current_user, :admin_project, @project
= form_for [@project, @protected_branch], html: { class: 'form-horizontal' } do |f|
-if @protected_branch.errors.any?
.alert.alert-danger
%ul
- @protected_branch.errors.full_messages.each do |msg|
%li= msg
- 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)
.form-group
= f.label :name, "Branch", class: 'control-label'
.col-sm-10
= f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: "Select branch"}, {class: "select2"})
.form-actions
= f.submit 'Protect', class: "btn-create btn"
- unless @branches.empty?
%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
end
end
resources :branches, only: [:index, :new, :create, :destroy], constraints: { id: Gitlab::Regex.git_reference_regex } do
collection do
get :recent, constraints: { id: Gitlab::Regex.git_reference_regex }
end
end
resources :branches, 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 }
......
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