Skip to content
Snippets Groups Projects
Commit 211a8c33 authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent 456a7247
No related branches found
No related tags found
No related merge requests found
Showing
with 171 additions and 44 deletions
Loading
Loading
@@ -27,6 +27,7 @@ module MergeRequests
create_pipeline_for(issuable, current_user)
issuable.update_head_pipeline
Gitlab::UsageDataCounters::MergeRequestCounter.count(:create)
link_lfs_objects(issuable)
 
super
end
Loading
Loading
@@ -64,6 +65,10 @@ module MergeRequests
raise Gitlab::Access::AccessDeniedError
end
end
def link_lfs_objects(issuable)
LinkLfsObjectsService.new(issuable.target_project).execute(issuable)
end
end
end
 
Loading
Loading
# frozen_string_literal: true
module MergeRequests
class LinkLfsObjectsService < ::BaseService
def execute(merge_request, oldrev: merge_request.diff_base_sha, newrev: merge_request.diff_head_sha)
return if merge_request.source_project == project
return if no_changes?(oldrev, newrev)
new_lfs_oids = lfs_oids(merge_request.source_project.repository, oldrev, newrev)
return if new_lfs_oids.empty?
Projects::LfsPointers::LfsLinkService
.new(project)
.execute(new_lfs_oids)
end
private
def no_changes?(oldrev, newrev)
oldrev == newrev
end
def lfs_oids(source_repository, oldrev, newrev)
Gitlab::Git::LfsChanges
.new(source_repository, newrev)
.new_pointers(not_in: [oldrev])
.map(&:lfs_oid)
end
end
end
Loading
Loading
@@ -21,6 +21,7 @@ module MergeRequests
# empty diff during a manual merge
close_upon_missing_source_branch_ref
post_merge_manually_merged
link_forks_lfs_objects
reload_merge_requests
outdate_suggestions
refresh_pipelines_on_merge_requests
Loading
Loading
@@ -91,17 +92,25 @@ module MergeRequests
end
# rubocop: enable CodeReuse/ActiveRecord
 
# Link LFS objects that exists in forks but does not exists in merge requests
# target project
def link_forks_lfs_objects
return unless @push.branch_updated?
merge_requests_for_forks.find_each do |mr|
LinkLfsObjectsService
.new(mr.target_project)
.execute(mr, oldrev: @push.oldrev, newrev: @push.newrev)
end
end
# Refresh merge request diff if we push to source or target branch of merge request
# Note: we should update merge requests from forks too
# rubocop: disable CodeReuse/ActiveRecord
def reload_merge_requests
merge_requests = @project.merge_requests.opened
.by_source_or_target_branch(@push.branch_name).to_a
 
# Fork merge requests
merge_requests += MergeRequest.opened
.where(source_branch: @push.branch_name, source_project: @project)
.where.not(target_project: @project).to_a
merge_requests += merge_requests_for_forks.to_a
 
filter_merge_requests(merge_requests).each do |merge_request|
if branch_and_project_match?(merge_request) || @push.force_push?
Loading
Loading
@@ -117,7 +126,6 @@ module MergeRequests
# @source_merge_requests diffs (for MergeRequest#commit_shas for instance).
merge_requests_for_source_branch(reload: true)
end
# rubocop: enable CodeReuse/ActiveRecord
 
def push_commit_ids
@push_commit_ids ||= @commits.map(&:id)
Loading
Loading
@@ -282,6 +290,15 @@ module MergeRequests
@source_merge_requests = nil if reload
@source_merge_requests ||= merge_requests_for(@push.branch_name)
end
# rubocop: disable CodeReuse/ActiveRecord
def merge_requests_for_forks
@merge_requests_for_forks ||=
MergeRequest.opened
.where(source_branch: @push.branch_name, source_project: @project)
.where.not(target_project: @project)
end
# rubocop: enable CodeReuse/ActiveRecord
end
end
 
Loading
Loading
Loading
Loading
@@ -134,7 +134,7 @@ module Projects
 
if @project.save
unless @project.gitlab_project_import?
create_services_from_active_templates(@project)
create_services_from_active_instance_level_services(@project)
@project.create_labels
end
 
Loading
Loading
@@ -160,9 +160,9 @@ module Projects
end
 
# rubocop: disable CodeReuse/ActiveRecord
def create_services_from_active_templates(project)
Service.where(template: true, active: true).each do |template|
service = Service.build_from_template(project.id, template)
def create_services_from_active_instance_level_services(project)
Service.where(instance: true, active: true).each do |template|
service = Service.build_from_instance(project.id, template)
service.save!
end
end
Loading
Loading
Loading
Loading
@@ -26,17 +26,7 @@ module Projects
 
build_fork_network_member(fork_to_project)
 
if link_fork_network(fork_to_project)
# A forked project stores its LFS objects in the `forked_from_project`.
# So the LFS objects become inaccessible, and therefore delete them from
# the database so they'll get cleaned up.
#
# TODO: refactor this to get the correct lfs objects when implementing
# https://gitlab.com/gitlab-org/gitlab-foss/issues/39769
fork_to_project.lfs_objects_projects.delete_all
fork_to_project
end
fork_to_project if link_fork_network(fork_to_project)
end
 
def fork_new_project
Loading
Loading
Loading
Loading
@@ -39,9 +39,9 @@ module Projects
def download_lfs_file!
with_tmp_file do |tmp_file|
download_and_save_file!(tmp_file)
project.all_lfs_objects << LfsObject.new(oid: lfs_oid,
size: lfs_size,
file: tmp_file)
project.lfs_objects << LfsObject.new(oid: lfs_oid,
size: lfs_size,
file: tmp_file)
 
success
end
Loading
Loading
Loading
Loading
@@ -16,7 +16,7 @@ module Projects
private
 
def move_lfs_objects_projects
non_existent_lfs_objects_projects.update_all(project_id: @project.lfs_storage_project.id)
non_existent_lfs_objects_projects.update_all(project_id: @project.id)
end
 
def remove_remaining_lfs_objects_project
Loading
Loading
# frozen_string_literal: true
 
module Projects
class PropagateServiceTemplate
class PropagateInstanceLevelService
BATCH_SIZE = 100
 
def self.propagate(*args)
new(*args).propagate
end
 
def initialize(template)
@template = template
def initialize(instance_level_service)
@instance_level_service = instance_level_service
end
 
def propagate
return unless @template.active?
return unless @instance_level_service.active?
 
Rails.logger.info("Propagating services for template #{@template.id}") # rubocop:disable Gitlab/RailsLogger
Rails.logger.info("Propagating services for instance_level_service #{@instance_level_service.id}") # rubocop:disable Gitlab/RailsLogger
 
propagate_projects_with_template
propagate_projects_with_instance_level_service
end
 
private
 
def propagate_projects_with_template
def propagate_projects_with_instance_level_service
loop do
batch = Project.uncached { project_ids_batch }
 
bulk_create_from_template(batch) unless batch.empty?
bulk_create_from_instance_level_service(batch) unless batch.empty?
 
break if batch.size < BATCH_SIZE
end
end
 
def bulk_create_from_template(batch)
def bulk_create_from_instance_level_service(batch)
service_list = batch.map do |project_id|
service_hash.values << project_id
end
Loading
Loading
@@ -52,7 +52,7 @@ module Projects
SELECT true
FROM services
WHERE services.project_id = projects.id
AND services.type = '#{@template.type}'
AND services.type = '#{@instance_level_service.type}'
)
AND projects.pending_delete = false
AND projects.archived = false
Loading
Loading
@@ -73,9 +73,9 @@ module Projects
def service_hash
@service_hash ||=
begin
template_hash = @template.as_json(methods: :type).except('id', 'template', 'project_id')
instance_hash = @instance_level_service.as_json(methods: :type).except('id', 'instance', 'project_id')
 
template_hash.each_with_object({}) do |(key, value), service_hash|
instance_hash.each_with_object({}) do |(key, value), service_hash|
value = value.is_a?(Hash) ? value.to_json : value
 
service_hash[ActiveRecord::Base.connection.quote_column_name(key)] =
Loading
Loading
@@ -97,11 +97,11 @@ module Projects
# rubocop: enable CodeReuse/ActiveRecord
 
def active_external_issue_tracker?
@template.issue_tracker? && !@template.default
@instance_level_service.issue_tracker? && !@instance_level_service.default
end
 
def active_external_wiki?
@template.type == 'ExternalWikiService'
@instance_level_service.type == 'ExternalWikiService'
end
end
end
Loading
Loading
@@ -52,6 +52,10 @@ module Projects
Projects::ForksCountService.new(project).refresh_cache
end
 
# TODO: Remove this method once all LfsObjectsProject records are backfilled
# for forks.
#
# See https://gitlab.com/gitlab-org/gitlab/issues/122002 for more info.
def save_lfs_objects
return unless @project.forked?
 
Loading
Loading
Loading
Loading
@@ -10,8 +10,8 @@
%p.inline
= s_("MattermostService|See list of available commands in Mattermost after setting up this service, by entering")
%kbd.inline /&lt;trigger&gt; help
- unless enabled || @service.template?
- unless enabled || @service.instance?
= render 'projects/services/mattermost_slash_commands/detailed_help', subject: @service
 
- if enabled && !@service.template?
- if enabled && !@service.instance?
= render 'projects/services/mattermost_slash_commands/installation_info', subject: @service
Loading
Loading
@@ -11,7 +11,7 @@
%p.inline
= s_("SlackService|See list of available commands in Slack after setting up this service, by entering")
%kbd.inline /&lt;command&gt; help
- unless @service.template?
- unless @service.instance?
%p= _("To set up this service:")
%ul.list-unstyled.indent-list
%li
Loading
Loading
Loading
Loading
@@ -951,7 +951,7 @@
:latency_sensitive:
:resource_boundary: :unknown
:weight: 1
- :name: propagate_service_template
- :name: propagate_instance_level_service
:feature_category: :source_code_management
:has_external_dependencies:
:latency_sensitive:
Loading
Loading
# frozen_string_literal: true
 
# Worker for updating any project specific caches.
class PropagateServiceTemplateWorker
class PropagateInstanceLevelServiceWorker
include ApplicationWorker
 
feature_category :source_code_management
Loading
Loading
@@ -9,18 +9,18 @@ class PropagateServiceTemplateWorker
LEASE_TIMEOUT = 4.hours.to_i
 
# rubocop: disable CodeReuse/ActiveRecord
def perform(template_id)
return unless try_obtain_lease_for(template_id)
def perform(instance_level_service_id)
return unless try_obtain_lease_for(instance_level_service_id)
 
Projects::PropagateServiceTemplate.propagate(Service.find_by(id: template_id))
Projects::PropagateInstanceLevelService.propagate(Service.find_by(id: instance_level_service_id))
end
# rubocop: enable CodeReuse/ActiveRecord
 
private
 
def try_obtain_lease_for(template_id)
def try_obtain_lease_for(instance_level_service_id)
Gitlab::ExclusiveLease
.new("propagate_service_template_worker:#{template_id}", timeout: LEASE_TIMEOUT)
.new("propagate_instance_level_service_worker:#{instance_level_service_id}", timeout: LEASE_TIMEOUT)
.try_obtain
end
end
Loading
Loading
@@ -29,7 +29,15 @@ class RepositoryForkWorker
 
result = gitlab_shell.fork_repository(source_project, target_project)
 
raise "Unable to fork project #{target_project.id} for repository #{source_project.disk_path} -> #{target_project.disk_path}" unless result
if result
link_lfs_objects(source_project, target_project)
else
raise_fork_failure(
source_project,
target_project,
'Failed to create fork repository'
)
end
 
target_project.after_import
end
Loading
Loading
@@ -40,4 +48,20 @@ class RepositoryForkWorker
Rails.logger.info("Project #{project.full_path} was in inconsistent state (#{project.import_status}) while forking.") # rubocop:disable Gitlab/RailsLogger
false
end
def link_lfs_objects(source_project, target_project)
Projects::LfsPointers::LfsLinkService
.new(target_project)
.execute(source_project.lfs_objects_oids)
rescue Projects::LfsPointers::LfsLinkService::TooManyOidsError
raise_fork_failure(
source_project,
target_project,
'Source project has too many LFS objects'
)
end
def raise_fork_failure(source_project, target_project, reason)
raise "Unable to fork project #{target_project.id} for repository #{source_project.disk_path} -> #{target_project.disk_path}: #{reason}"
end
end
---
title: Create LfsObjectsProject record for forks as well
merge_request: 22418
author:
type: fixed
---
title: Rename 'Kubernetes configured' button
merge_request: 24487
author:
type: changed
---
title: Fix multiline issue when loading env vars from DinD in SAST
merge_request: 24108
author:
type: fixed
---
title: Do not draw heading borders over floated images in markdown
merge_request:
author: Gwen_
type: fixed
---
title: Conan packages are validated based on full recipe instead of name/version alone
merge_request: 23467
author:
type: changed
---
title: Ensure all Project records have a corresponding ProjectFeature record
merge_request: 23766
author:
type: fixed
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment