summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2016-05-09 09:48:28 +0000
committerYorick Peterse <yorickpeterse@gmail.com>2016-05-09 09:48:28 +0000
commit0a103e983cccc9bb9a7a28fb4eacff8d624010f8 (patch)
treefe2bd0071bccf95cb803e124ed077ba45468cac3
parent7d95d3cde79683fda221e3108d80e7d1fe86e81a (diff)
parent4be77d0b057e3b26f48fbaee947bf8f91a755f41 (diff)
downloadgitlab-ce-0a103e983cccc9bb9a7a28fb4eacff8d624010f8.tar.gz
Merge branch 'improve-multiple-branch-push-performance' into 'master'
Improve multiple branch push performance by memoizing permission checking See merge request !4091
-rw-r--r--CHANGELOG1
-rw-r--r--app/models/project.rb2
-rw-r--r--lib/gitlab/git_access.rb7
3 files changed, 8 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index e85d3c88b28..822fa4be565 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,7 @@ v 8.8.0 (unreleased)
- Assign labels and milestone to target project when moving issue. !3934 (Long Nguyen)
- Project#open_branches has been cleaned up and no longer loads entire records into memory.
- Escape HTML in commit titles in system note messages
+ - Improve multiple branch push performance by memoizing permission checking
- Log to application.log when an admin starts and stops impersonating a user
- Updated gitlab_git to 10.1.0
- GitAccess#protected_tag? no longer loads all tags just to check if a single one exists
diff --git a/app/models/project.rb b/app/models/project.rb
index dfd1e54ecf7..5b556a22755 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -767,7 +767,7 @@ class Project < ActiveRecord::Base
# Check if current branch name is marked as protected in the system
def protected_branch?(branch_name)
- protected_branches.where(name: branch_name).any?
+ protected_branch_names.include?(branch_name)
end
def developers_can_push_to_protected_branch?(branch_name)
diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb
index 6cb41239871..d2a0e316cbe 100644
--- a/lib/gitlab/git_access.rb
+++ b/lib/gitlab/git_access.rb
@@ -122,6 +122,11 @@ module Gitlab
build_status_object(true)
end
+ def can_user_do_action?(action)
+ @permission_cache ||= {}
+ @permission_cache[action] ||= user.can?(action, project)
+ end
+
def change_access_check(change)
oldrev, newrev, ref = change.split(' ')
@@ -135,7 +140,7 @@ module Gitlab
:push_code
end
- unless user.can?(action, project)
+ unless can_user_do_action?(action)
status =
case action
when :force_push_code_to_protected_branches