debian-mirror-gitlab/app/services/post_receive_service.rb

109 lines
3.4 KiB
Ruby
Raw Normal View History

2020-03-13 15:44:24 +05:30
# frozen_string_literal: true
# PostReceiveService class
#
# Used for scheduling related jobs after a push action has been performed
class PostReceiveService
2020-04-08 14:13:33 +05:30
attr_reader :user, :repository, :project, :params
2020-03-13 15:44:24 +05:30
2020-04-08 14:13:33 +05:30
def initialize(user, repository, project, params)
2020-03-13 15:44:24 +05:30
@user = user
2020-04-08 14:13:33 +05:30
@repository = repository
2020-03-13 15:44:24 +05:30
@project = project
@params = params
end
def execute
response = Gitlab::InternalPostReceive::Response.new
push_options = Gitlab::PushOptions.new(params[:push_options])
2021-10-27 15:23:28 +05:30
mr_options = push_options.get(:merge_request)
2020-03-13 15:44:24 +05:30
response.reference_counter_decreased = Gitlab::ReferenceCounter.new(params[:gl_repository]).decrease
2021-10-27 15:23:28 +05:30
# The PostReceive worker will normally invalidate the cache. However, it
# runs asynchronously. If push options require us to create a new merge
# request synchronously, we can't rely on that, so invalidate the cache here
repository&.expire_branches_cache if mr_options&.fetch(:create, false)
2020-03-13 15:44:24 +05:30
PostReceive.perform_async(params[:gl_repository], params[:identifier],
params[:changes], push_options.as_json)
if mr_options.present?
2020-04-08 14:13:33 +05:30
message = process_mr_push_options(mr_options, params[:changes])
2020-03-13 15:44:24 +05:30
response.add_alert_message(message)
end
response.add_alert_message(broadcast_message)
response.add_merge_request_urls(merge_request_urls)
2021-09-30 23:02:18 +05:30
# Neither User nor Repository are guaranteed to be returned; an orphaned write deploy
2020-03-13 15:44:24 +05:30
# key could be used
2021-09-30 23:02:18 +05:30
if user && repository
redirect_message = Gitlab::Checks::ContainerMoved.fetch_message(user, repository)
project_created_message = Gitlab::Checks::ProjectCreated.fetch_message(user, repository)
2020-03-13 15:44:24 +05:30
response.add_basic_message(redirect_message)
response.add_basic_message(project_created_message)
2021-02-22 17:27:13 +05:30
record_onboarding_progress
2020-03-13 15:44:24 +05:30
end
response
end
2020-04-08 14:13:33 +05:30
def process_mr_push_options(push_options, changes)
2021-04-29 21:17:54 +05:30
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/28494')
2020-04-08 14:13:33 +05:30
return unless repository
unless repository.repo_type.project?
return push_options_warning('Push options are only supported for projects')
end
2020-03-13 15:44:24 +05:30
service = ::MergeRequests::PushOptionsHandlerService.new(
2021-06-08 01:23:25 +05:30
project: project, current_user: user, changes: changes, push_options: push_options
2020-03-13 15:44:24 +05:30
).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
2020-04-08 14:13:33 +05:30
return [] unless repository&.repo_type&.project?
2021-06-08 01:23:25 +05:30
::MergeRequests::GetUrlsService.new(project: project).execute(params[:changes])
2020-03-13 15:44:24 +05:30
end
2021-01-29 00:20:46 +05:30
private
def broadcast_message
banner = nil
if project
2022-05-07 20:08:51 +05:30
scoped_messages = BroadcastMessage.current_banner_messages(current_path: project.full_path).select do |message|
2021-01-29 00:20:46 +05:30
message.target_path.present? && message.matches_current_path(project.full_path)
end
banner = scoped_messages.last
end
banner ||= BroadcastMessage.current_banner_messages.last
banner&.message
end
2021-02-22 17:27:13 +05:30
def record_onboarding_progress
2021-09-30 23:02:18 +05:30
return unless project
2021-03-08 18:12:59 +05:30
OnboardingProgressService.new(project.namespace).execute(action: :git_write)
2021-02-22 17:27:13 +05:30
end
2020-03-13 15:44:24 +05:30
end
2020-05-24 23:13:21 +05:30
2021-06-08 01:23:25 +05:30
PostReceiveService.prepend_mod_with('PostReceiveService')