2019-03-28 10:59:24 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Git
|
|
|
|
class BaseHooksService < ::BaseService
|
|
|
|
include Gitlab::Utils::StrongMemoize
|
|
|
|
|
|
|
|
# The N most recent commits to process in a single push payload.
|
|
|
|
PROCESS_COMMIT_LIMIT = 100
|
|
|
|
|
|
|
|
def execute
|
|
|
|
create_events
|
|
|
|
create_pipelines
|
|
|
|
execute_project_hooks
|
|
|
|
|
|
|
|
# Not a hook, but it needs access to the list of changed commits
|
|
|
|
enqueue_invalidate_cache
|
|
|
|
|
2019-05-17 17:43:58 -04:00
|
|
|
update_remote_mirrors
|
|
|
|
|
2019-08-12 18:31:58 -04:00
|
|
|
success
|
2019-03-28 10:59:24 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def hook_name
|
|
|
|
raise NotImplementedError, "Please implement #{self.class}##{__method__}"
|
|
|
|
end
|
|
|
|
|
|
|
|
def commits
|
|
|
|
raise NotImplementedError, "Please implement #{self.class}##{__method__}"
|
|
|
|
end
|
|
|
|
|
|
|
|
def limited_commits
|
2019-08-12 18:31:58 -04:00
|
|
|
@limited_commits ||= commits.last(PROCESS_COMMIT_LIMIT)
|
2019-03-28 10:59:24 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def commits_count
|
|
|
|
commits.count
|
|
|
|
end
|
|
|
|
|
|
|
|
def event_message
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def invalidated_file_types
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
|
2019-08-12 18:31:58 -04:00
|
|
|
# Push events in the activity feed only show information for the
|
|
|
|
# last commit.
|
2019-03-28 10:59:24 -04:00
|
|
|
def create_events
|
2019-08-12 18:31:58 -04:00
|
|
|
EventCreateService.new.push(project, current_user, event_push_data)
|
2019-03-28 10:59:24 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def create_pipelines
|
2019-04-10 05:04:51 -04:00
|
|
|
return unless params.fetch(:create_pipelines, true)
|
|
|
|
|
2019-03-28 10:59:24 -04:00
|
|
|
Ci::CreatePipelineService
|
2019-08-12 18:31:58 -04:00
|
|
|
.new(project, current_user, base_params)
|
2019-03-28 10:59:24 -04:00
|
|
|
.execute(:push, pipeline_options)
|
|
|
|
end
|
|
|
|
|
|
|
|
def execute_project_hooks
|
2019-08-12 18:31:58 -04:00
|
|
|
# Creating push_data invokes one CommitDelta RPC per commit. Only
|
|
|
|
# build this data if we actually need it.
|
|
|
|
project.execute_hooks(push_data, hook_name) if project.has_active_hooks?(hook_name)
|
|
|
|
project.execute_services(push_data, hook_name) if project.has_active_services?(hook_name)
|
2019-03-28 10:59:24 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def enqueue_invalidate_cache
|
2019-08-16 15:53:56 -04:00
|
|
|
file_types = invalidated_file_types
|
|
|
|
|
|
|
|
return unless file_types.present?
|
|
|
|
|
|
|
|
ProjectCacheWorker.perform_async(project.id, file_types, [], false)
|
2019-03-28 10:59:24 -04:00
|
|
|
end
|
|
|
|
|
2019-08-12 18:31:58 -04:00
|
|
|
def base_params
|
|
|
|
{
|
2018-12-30 22:31:35 -05:00
|
|
|
oldrev: params[:oldrev],
|
|
|
|
newrev: params[:newrev],
|
|
|
|
ref: params[:ref],
|
2019-08-12 18:31:58 -04:00
|
|
|
push_options: params[:push_options] || {}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def push_data_params(commits:, with_changed_files: true)
|
|
|
|
base_params.merge(
|
|
|
|
project: project,
|
|
|
|
user: current_user,
|
|
|
|
commits: commits,
|
2018-12-30 22:31:35 -05:00
|
|
|
message: event_message,
|
2019-03-28 10:59:24 -04:00
|
|
|
commits_count: commits_count,
|
2019-08-12 18:31:58 -04:00
|
|
|
with_changed_files: with_changed_files
|
2019-03-28 10:59:24 -04:00
|
|
|
)
|
2019-08-12 18:31:58 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def event_push_data
|
|
|
|
# We only need the last commit for the event push, and we don't
|
|
|
|
# need the full deltas either.
|
|
|
|
@event_push_data ||= Gitlab::DataBuilder::Push.build(
|
|
|
|
push_data_params(commits: commits.last, with_changed_files: false))
|
|
|
|
end
|
|
|
|
|
|
|
|
def push_data
|
|
|
|
@push_data ||= Gitlab::DataBuilder::Push.build(push_data_params(commits: limited_commits))
|
2019-03-28 10:59:24 -04:00
|
|
|
|
|
|
|
# Dependent code may modify the push data, so return a duplicate each time
|
|
|
|
@push_data.dup
|
|
|
|
end
|
|
|
|
|
|
|
|
# to be overridden in EE
|
|
|
|
def pipeline_options
|
|
|
|
{}
|
|
|
|
end
|
2019-05-17 17:43:58 -04:00
|
|
|
|
|
|
|
def update_remote_mirrors
|
|
|
|
return unless project.has_remote_mirror?
|
|
|
|
|
|
|
|
project.mark_stuck_remote_mirrors_as_failed!
|
|
|
|
project.update_remote_mirrors
|
|
|
|
end
|
2019-03-28 10:59:24 -04:00
|
|
|
end
|
|
|
|
end
|