diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-03 18:06:49 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-03 18:06:49 +0000 |
commit | ab7cf450ba19cf80b9534f25dc707b33845e3014 (patch) | |
tree | bbfa6aba83c48aea68d79c4179ce576b6eec326d /app/services | |
parent | 4204cf308596e0e26f578a6e2da88f49c0f4aad9 (diff) | |
download | gitlab-ce-ab7cf450ba19cf80b9534f25dc707b33845e3014.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/branches/create_service.rb | 39 | ||||
-rw-r--r-- | app/services/branches/delete_merged_service.rb | 34 | ||||
-rw-r--r-- | app/services/branches/delete_service.rb | 32 | ||||
-rw-r--r-- | app/services/branches/validate_new_service.rb | 31 | ||||
-rw-r--r-- | app/services/clusters/kubernetes/create_or_update_service_account_service.rb | 41 | ||||
-rw-r--r-- | app/services/clusters/kubernetes/kubernetes.rb | 3 | ||||
-rw-r--r-- | app/services/commits/commit_patch_service.rb | 2 | ||||
-rw-r--r-- | app/services/commits/create_service.rb | 2 | ||||
-rw-r--r-- | app/services/create_branch_service.rb | 38 | ||||
-rw-r--r-- | app/services/delete_branch_service.rb | 30 | ||||
-rw-r--r-- | app/services/delete_merged_branches_service.rb | 32 | ||||
-rw-r--r-- | app/services/merge_requests/create_from_issue_service.rb | 2 | ||||
-rw-r--r-- | app/services/merge_requests/merge_service.rb | 2 | ||||
-rw-r--r-- | app/services/todo_service.rb | 8 | ||||
-rw-r--r-- | app/services/validate_new_branch_service.rb | 21 |
15 files changed, 192 insertions, 125 deletions
diff --git a/app/services/branches/create_service.rb b/app/services/branches/create_service.rb new file mode 100644 index 00000000000..c8afd97e6bf --- /dev/null +++ b/app/services/branches/create_service.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module Branches + class CreateService < BaseService + def execute(branch_name, ref, create_master_if_empty: true) + create_master_branch if create_master_if_empty && project.empty_repo? + + result = ::Branches::ValidateNewService.new(project).execute(branch_name) + + return result if result[:status] == :error + + new_branch = repository.add_branch(current_user, branch_name, ref) + + if new_branch + success(new_branch) + else + error("Invalid reference name: #{branch_name}") + end + rescue Gitlab::Git::PreReceiveError => ex + error(ex.message) + end + + def success(branch) + super().merge(branch: branch) + end + + private + + def create_master_branch + project.repository.create_file( + current_user, + '/README.md', + '', + message: 'Add README.md', + branch_name: 'master' + ) + end + end +end diff --git a/app/services/branches/delete_merged_service.rb b/app/services/branches/delete_merged_service.rb new file mode 100644 index 00000000000..9fd5964bf94 --- /dev/null +++ b/app/services/branches/delete_merged_service.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Branches + class DeleteMergedService < BaseService + def async_execute + DeleteMergedBranchesWorker.perform_async(project.id, current_user.id) + end + + def execute + raise Gitlab::Access::AccessDeniedError unless can?(current_user, :push_code, project) + + branches = project.repository.merged_branch_names + # Prevent deletion of branches relevant to open merge requests + branches -= merge_request_branch_names + # Prevent deletion of protected branches + branches = branches.reject { |branch| ProtectedBranch.protected?(project, branch) } + + branches.each do |branch| + ::Branches::DeleteService.new(project, current_user).execute(branch) + end + end + + private + + # rubocop: disable CodeReuse/ActiveRecord + def merge_request_branch_names + # reorder(nil) is necessary for SELECT DISTINCT because default scope adds an ORDER BY + source_names = project.origin_merge_requests.opened.reorder(nil).distinct.pluck(:source_branch) + target_names = project.merge_requests.opened.reorder(nil).distinct.pluck(:target_branch) + (source_names + target_names).uniq + end + # rubocop: enable CodeReuse/ActiveRecord + end +end diff --git a/app/services/branches/delete_service.rb b/app/services/branches/delete_service.rb new file mode 100644 index 00000000000..ca2b4556b58 --- /dev/null +++ b/app/services/branches/delete_service.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Branches + class DeleteService < BaseService + def execute(branch_name) + repository = project.repository + branch = repository.find_branch(branch_name) + + unless current_user.can?(:push_code, project) + return ServiceResponse.error( + message: 'You dont have push access to repo', + http_status: 405) + end + + unless branch + return ServiceResponse.error( + message: 'No such branch', + http_status: 404) + end + + if repository.rm_branch(current_user, branch_name) + ServiceResponse.success(message: 'Branch was deleted') + else + ServiceResponse.error( + message: 'Failed to remove branch', + http_status: 400) + end + rescue Gitlab::Git::PreReceiveError => ex + ServiceResponse.error(message: ex.message, http_status: 400) + end + end +end diff --git a/app/services/branches/validate_new_service.rb b/app/services/branches/validate_new_service.rb new file mode 100644 index 00000000000..e45183d160f --- /dev/null +++ b/app/services/branches/validate_new_service.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Branches + class ValidateNewService < BaseService + def initialize(project) + @project = project + end + + def execute(branch_name, force: false) + return error('Branch name is invalid') unless valid_name?(branch_name) + + if branch_exist?(branch_name) && !force + return error('Branch already exists') + end + + success + rescue Gitlab::Git::PreReceiveError => ex + error(ex.message) + end + + private + + def valid_name?(branch_name) + Gitlab::GitRefValidator.validate(branch_name) + end + + def branch_exist?(branch_name) + project.repository.branch_exists?(branch_name) + end + end +end diff --git a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb index d798dcdcfd3..0fea398d234 100644 --- a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb +++ b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb @@ -49,8 +49,14 @@ module Clusters create_or_update_knative_serving_role create_or_update_knative_serving_role_binding + create_or_update_crossplane_database_role create_or_update_crossplane_database_role_binding + + return unless knative_serving_namespace + + create_or_update_knative_version_role + create_or_update_knative_version_role_binding end private @@ -64,6 +70,12 @@ module Clusters ).ensure_exists! end + def knative_serving_namespace + kubeclient.core_client.get_namespaces.find do |namespace| + namespace.metadata.name == Clusters::Kubernetes::KNATIVE_SERVING_NAMESPACE + end + end + def create_role_or_cluster_role_binding if namespace_creator kubeclient.create_or_update_role_binding(role_binding_resource) @@ -88,6 +100,14 @@ module Clusters kubeclient.update_role_binding(crossplane_database_role_binding_resource) end + def create_or_update_knative_version_role + kubeclient.update_cluster_role(knative_version_role_resource) + end + + def create_or_update_knative_version_role_binding + kubeclient.update_cluster_role_binding(knative_version_role_binding_resource) + end + def service_account_resource Gitlab::Kubernetes::ServiceAccount.new( service_account_name, @@ -166,6 +186,27 @@ module Clusters service_account_name: service_account_name ).generate end + + def knative_version_role_resource + Gitlab::Kubernetes::ClusterRole.new( + name: Clusters::Kubernetes::GITLAB_KNATIVE_VERSION_ROLE_NAME, + rules: [{ + apiGroups: %w(apps), + resources: %w(deployments), + verbs: %w(list get) + }] + ).generate + end + + def knative_version_role_binding_resource + subjects = [{ kind: 'ServiceAccount', name: service_account_name, namespace: service_account_namespace }] + + Gitlab::Kubernetes::ClusterRoleBinding.new( + Clusters::Kubernetes::GITLAB_KNATIVE_VERSION_ROLE_BINDING_NAME, + Clusters::Kubernetes::GITLAB_KNATIVE_VERSION_ROLE_NAME, + subjects + ).generate + end end end end diff --git a/app/services/clusters/kubernetes/kubernetes.rb b/app/services/clusters/kubernetes/kubernetes.rb index d29519999b2..59cb1c4b3a9 100644 --- a/app/services/clusters/kubernetes/kubernetes.rb +++ b/app/services/clusters/kubernetes/kubernetes.rb @@ -12,5 +12,8 @@ module Clusters GITLAB_KNATIVE_SERVING_ROLE_BINDING_NAME = 'gitlab-knative-serving-rolebinding' GITLAB_CROSSPLANE_DATABASE_ROLE_NAME = 'gitlab-crossplane-database-role' GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME = 'gitlab-crossplane-database-rolebinding' + GITLAB_KNATIVE_VERSION_ROLE_NAME = 'gitlab-knative-version-role' + GITLAB_KNATIVE_VERSION_ROLE_BINDING_NAME = 'gitlab-knative-version-rolebinding' + KNATIVE_SERVING_NAMESPACE = 'knative-serving' end end diff --git a/app/services/commits/commit_patch_service.rb b/app/services/commits/commit_patch_service.rb index 49113c3c691..4fa6c30e901 100644 --- a/app/services/commits/commit_patch_service.rb +++ b/app/services/commits/commit_patch_service.rb @@ -32,7 +32,7 @@ module Commits end def prepare_branch! - branch_result = CreateBranchService.new(project, current_user) + branch_result = ::Branches::CreateService.new(project, current_user) .execute(@branch_name, @start_branch) if branch_result[:status] != :success diff --git a/app/services/commits/create_service.rb b/app/services/commits/create_service.rb index b42494563b2..bd238605ac1 100644 --- a/app/services/commits/create_service.rb +++ b/app/services/commits/create_service.rb @@ -101,7 +101,7 @@ module Commits end def validate_new_branch_name! - result = ValidateNewBranchService.new(project, current_user).execute(@branch_name, force: force?) + result = ::Branches::ValidateNewService.new(project).execute(@branch_name, force: force?) if result[:status] == :error raise_error("Something went wrong when we tried to create '#{@branch_name}' for you: #{result[:message]}") diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb deleted file mode 100644 index d58cb0f9e2b..00000000000 --- a/app/services/create_branch_service.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -class CreateBranchService < BaseService - def execute(branch_name, ref, create_master_if_empty: true) - create_master_branch if create_master_if_empty && project.empty_repo? - - result = ValidateNewBranchService.new(project, current_user) - .execute(branch_name) - - return result if result[:status] == :error - - new_branch = repository.add_branch(current_user, branch_name, ref) - - if new_branch - success(new_branch) - else - error("Invalid reference name: #{branch_name}") - end - rescue Gitlab::Git::PreReceiveError => ex - error(ex.message) - end - - def success(branch) - super().merge(branch: branch) - end - - private - - def create_master_branch - project.repository.create_file( - current_user, - '/README.md', - '', - message: 'Add README.md', - branch_name: 'master' - ) - end -end diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb deleted file mode 100644 index fd41ce54486..00000000000 --- a/app/services/delete_branch_service.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -class DeleteBranchService < BaseService - def execute(branch_name) - repository = project.repository - branch = repository.find_branch(branch_name) - - unless current_user.can?(:push_code, project) - return ServiceResponse.error( - message: 'You dont have push access to repo', - http_status: 405) - end - - unless branch - return ServiceResponse.error( - message: 'No such branch', - http_status: 404) - end - - if repository.rm_branch(current_user, branch_name) - ServiceResponse.success(message: 'Branch was deleted') - else - ServiceResponse.error( - message: 'Failed to remove branch', - http_status: 400) - end - rescue Gitlab::Git::PreReceiveError => ex - ServiceResponse.error(message: ex.message, http_status: 400) - end -end diff --git a/app/services/delete_merged_branches_service.rb b/app/services/delete_merged_branches_service.rb deleted file mode 100644 index 80de897e94b..00000000000 --- a/app/services/delete_merged_branches_service.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -class DeleteMergedBranchesService < BaseService - def async_execute - DeleteMergedBranchesWorker.perform_async(project.id, current_user.id) - end - - def execute - raise Gitlab::Access::AccessDeniedError unless can?(current_user, :push_code, project) - - branches = project.repository.merged_branch_names - # Prevent deletion of branches relevant to open merge requests - branches -= merge_request_branch_names - # Prevent deletion of protected branches - branches = branches.reject { |branch| ProtectedBranch.protected?(project, branch) } - - branches.each do |branch| - DeleteBranchService.new(project, current_user).execute(branch) - end - end - - private - - # rubocop: disable CodeReuse/ActiveRecord - def merge_request_branch_names - # reorder(nil) is necessary for SELECT DISTINCT because default scope adds an ORDER BY - source_names = project.origin_merge_requests.opened.reorder(nil).distinct.pluck(:source_branch) - target_names = project.merge_requests.opened.reorder(nil).distinct.pluck(:target_branch) - (source_names + target_names).uniq - end - # rubocop: enable CodeReuse/ActiveRecord -end diff --git a/app/services/merge_requests/create_from_issue_service.rb b/app/services/merge_requests/create_from_issue_service.rb index 200a34cae04..95fb99d3e7a 100644 --- a/app/services/merge_requests/create_from_issue_service.rb +++ b/app/services/merge_requests/create_from_issue_service.rb @@ -19,7 +19,7 @@ module MergeRequests return error('Not allowed to create merge request') unless can_create_merge_request? return error('Invalid issue iid') unless @issue_iid.present? && issue.present? - result = CreateBranchService.new(target_project, current_user).execute(branch_name, ref) + result = ::Branches::CreateService.new(target_project, current_user).execute(branch_name, ref) return result if result[:status] == :error new_merge_request = create(merge_request) diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 2eef3eed804..4a109fe4e16 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -99,7 +99,7 @@ module MergeRequests log_info("Post merge finished on JID #{merge_jid} with state #{state}") if delete_source_branch? - DeleteBranchService.new(@merge_request.source_project, branch_deletion_user) + ::Branches::DeleteService.new(@merge_request.source_project, branch_deletion_user) .execute(merge_request.source_branch) end end diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index e7bcca1a38d..55f888d5664 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -179,6 +179,14 @@ class TodoService mark_todos_as_done(todos, current_user) end + def mark_todo_as_done(todo, current_user) + return if todo.done? + + todo.update(state: :done) + + current_user.update_todos_count_cache + end + # When user marks some todos as pending def mark_todos_as_pending(todos, current_user) update_todos_state(todos, current_user, :pending) diff --git a/app/services/validate_new_branch_service.rb b/app/services/validate_new_branch_service.rb deleted file mode 100644 index 3f4a59e5cee..00000000000 --- a/app/services/validate_new_branch_service.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -require_relative 'base_service' - -class ValidateNewBranchService < BaseService - def execute(branch_name, force: false) - valid_branch = Gitlab::GitRefValidator.validate(branch_name) - - unless valid_branch - return error('Branch name is invalid') - end - - if project.repository.branch_exists?(branch_name) && !force - return error('Branch already exists') - end - - success - rescue Gitlab::Git::PreReceiveError => ex - error(ex.message) - end -end |