Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-02-15 03:08:48 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-02-15 03:08:48 +0300
commitb69f406585ff64b1c5140ebba775cc754fabb358 (patch)
tree9af7dfeb0c3f0f8db189a6e18c6be398a7729e2d /app/services/post_receive_service.rb
parent866ca4e49ff74ffadf8e6f6ff663a168489c2aba (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.rb69
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