diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-15 03:08:48 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-02-15 03:08:48 +0300 |
commit | b69f406585ff64b1c5140ebba775cc754fabb358 (patch) | |
tree | 9af7dfeb0c3f0f8db189a6e18c6be398a7729e2d /app/services/post_receive_service.rb | |
parent | 866ca4e49ff74ffadf8e6f6ff663a168489c2aba (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/post_receive_service.rb')
-rw-r--r-- | app/services/post_receive_service.rb | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/app/services/post_receive_service.rb b/app/services/post_receive_service.rb new file mode 100644 index 00000000000..e3818e76c4c --- /dev/null +++ b/app/services/post_receive_service.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +# PostReceiveService class +# +# Used for scheduling related jobs after a push action has been performed +class PostReceiveService + attr_reader :user, :project, :params + + def initialize(user, project, params) + @user = user + @project = project + @params = params + end + + def execute + response = Gitlab::InternalPostReceive::Response.new + + push_options = Gitlab::PushOptions.new(params[:push_options]) + + response.reference_counter_decreased = Gitlab::ReferenceCounter.new(params[:gl_repository]).decrease + + PostReceive.perform_async(params[:gl_repository], params[:identifier], + params[:changes], push_options.as_json) + + mr_options = push_options.get(:merge_request) + if mr_options.present? + message = process_mr_push_options(mr_options, project, user, params[:changes]) + response.add_alert_message(message) + end + + broadcast_message = BroadcastMessage.current&.last&.message + response.add_alert_message(broadcast_message) + + response.add_merge_request_urls(merge_request_urls) + + # Neither User nor Project are guaranteed to be returned; an orphaned write deploy + # key could be used + if user && project + redirect_message = Gitlab::Checks::ProjectMoved.fetch_message(user.id, project.id) + project_created_message = Gitlab::Checks::ProjectCreated.fetch_message(user.id, project.id) + + response.add_basic_message(redirect_message) + response.add_basic_message(project_created_message) + end + + response + end + + def process_mr_push_options(push_options, project, user, changes) + Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/61359') + + service = ::MergeRequests::PushOptionsHandlerService.new( + project, user, changes, push_options + ).execute + + if service.errors.present? + push_options_warning(service.errors.join("\n\n")) + end + end + + def push_options_warning(warning) + options = Array.wrap(params[:push_options]).map { |p| "'#{p}'" }.join(' ') + "WARNINGS:\nError encountered with push options #{options}: #{warning}" + end + + def merge_request_urls + ::MergeRequests::GetUrlsService.new(project).execute(params[:changes]) + end +end |