diff --git a/app/controllers/repositories/lfs_api_controller.rb b/app/controllers/repositories/lfs_api_controller.rb index b8c5970e088aff05bf6447496ad5d18b3091826d..5f0186c5c9bb76e71ab0f4495ca315bea232d81a 100644 --- a/app/controllers/repositories/lfs_api_controller.rb +++ b/app/controllers/repositories/lfs_api_controller.rb @@ -133,7 +133,7 @@ def upload_actions(object) # Overridden in EE def upload_http_url_to_repo - project.http_url_to_repo + Gitlab::RepositoryUrlBuilder.build(repository.full_path, protocol: :http) end def upload_headers @@ -196,7 +196,7 @@ def link_to_project!(object) return unless lfs_object - LfsObjectsProject.link_to_project!(lfs_object, project) + LfsObjectsProject.link_to_project!(lfs_object, project, repo_type.name) Gitlab::AppJsonLogger.info( message: "LFS object auto-linked to forked project", diff --git a/app/controllers/repositories/lfs_storage_controller.rb b/app/controllers/repositories/lfs_storage_controller.rb index e545f63bfd797783c4a182b135c2e859fd2effdf..d40ae7d23fc29535c1619e46786b3d304aa7f4bf 100644 --- a/app/controllers/repositories/lfs_storage_controller.rb +++ b/app/controllers/repositories/lfs_storage_controller.rb @@ -45,7 +45,8 @@ def upload_finalize oid: oid, size: size, uploaded_file: uploaded_file, - project: project + project: project, + repository_type: repo_type.name ) response = service.execute diff --git a/app/models/lfs_objects_project.rb b/app/models/lfs_objects_project.rb index 32beb6c795bd7693d530e1d63b8f95badfc6ba48..da63c0581cd27178b80462b7ea2f3c3008b06804 100644 --- a/app/models/lfs_objects_project.rb +++ b/app/models/lfs_objects_project.rb @@ -19,10 +19,8 @@ class LfsObjectsProject < ApplicationRecord scope :project_id_in, ->(ids) { where(project_id: ids) } scope :lfs_object_in, ->(lfs_objects) { where(lfs_object: lfs_objects) } - def self.link_to_project!(lfs_object, project) - # We can't use an upsert here because there is no uniqueness constraint: - # https://gitlab.com/gitlab-org/gitlab/-/issues/347466 - self.safe_find_or_create_by!(lfs_object_id: lfs_object.id, project_id: project.id) # rubocop:disable Performance/ActiveRecordSubtransactionMethods + def self.link_to_project!(lfs_object, project, repository_type) + safe_find_or_create_by!(lfs_object_id: lfs_object.id, project_id: project.id, repository_type: repository_type) # rubocop:disable Performance/ActiveRecordSubtransactionMethods -- We can't use an upsert here because there is no uniqueness constraint: https://gitlab.com/gitlab-org/gitlab/-/issues/347466 end def self.update_statistics_for_project_id(project_id) diff --git a/app/services/lfs/finalize_upload_service.rb b/app/services/lfs/finalize_upload_service.rb index 91a80dc9f7c6440860e294fa73fd1ff820a07680..6a84b9c58121ab8cdfe73a0fc245028391d20919 100644 --- a/app/services/lfs/finalize_upload_service.rb +++ b/app/services/lfs/finalize_upload_service.rb @@ -2,11 +2,12 @@ module Lfs class FinalizeUploadService - def initialize(oid:, size:, uploaded_file:, project:) + def initialize(oid:, size:, uploaded_file:, project:, repository_type:) @oid = oid @size = size @uploaded_file = uploaded_file @project = project + @repository_type = repository_type end def execute @@ -27,7 +28,7 @@ def execute private - attr_reader :oid, :size, :uploaded_file, :project + attr_reader :oid, :size, :uploaded_file, :project, :repository_type def service_response_error(reason, message) ServiceResponse.error(reason: reason, message: message) @@ -42,7 +43,7 @@ def store_file! object = create_file! end - link_to_project!(object) + LfsObjectsProject.link_to_project!(object, project, repository_type) end def create_file! @@ -54,12 +55,5 @@ def replace_file!(lfs_object) lfs_object.file = uploaded_file lfs_object.save! end - - def link_to_project!(object) - LfsObjectsProject.safe_find_or_create_by!( # rubocop:disable Performance/ActiveRecordSubtransactionMethods -- Used in the original controller: https://gitlab.com/gitlab-org/gitlab/-/blob/3841ce47b1d6d4611067ff5b8b86dc9cbf290641/app/controllers/repositories/lfs_storage_controller.rb#L118 - project: project, - lfs_object: object - ) - end end end diff --git a/ee/app/controllers/ee/repositories/lfs_api_controller.rb b/ee/app/controllers/ee/repositories/lfs_api_controller.rb index 88ad3d922be1389b5bb172fb7ac39cb405fa7349..14039f960ec4362fe9b8daff5a276cb3d18499a6 100644 --- a/ee/app/controllers/ee/repositories/lfs_api_controller.rb +++ b/ee/app/controllers/ee/repositories/lfs_api_controller.rb @@ -21,7 +21,7 @@ def batch_operation_disallowed? override :upload_http_url_to_repo def upload_http_url_to_repo - return geo_primary_http_url_to_repo(project) if ::Gitlab::Geo.primary? + return geo_primary_http_url_to_repo(repository) if ::Gitlab::Geo.primary? super end diff --git a/spec/models/lfs_objects_project_spec.rb b/spec/models/lfs_objects_project_spec.rb index 9fde97a83ee22fda2fdcbe20e0529759b8a2b98c..91a236cac332a4abdf5e05e24ec7e8dc49deb63e 100644 --- a/spec/models/lfs_objects_project_spec.rb +++ b/spec/models/lfs_objects_project_spec.rb @@ -123,11 +123,17 @@ end describe '#link_to_project!' do + let(:repository_type) { :project } + it 'does not throw error when duplicate exists' do lfs_objects_project expect do - result = described_class.link_to_project!(lfs_objects_project.lfs_object, lfs_objects_project.project) + result = described_class.link_to_project!( + lfs_objects_project.lfs_object, + lfs_objects_project.project, + repository_type + ) expect(result).to be_a(described_class) end.not_to change { described_class.count } end @@ -137,7 +143,7 @@ allow(ProjectCacheWorker).to receive(:perform_async).and_call_original expect(ProjectCacheWorker).to receive(:perform_async).with(new_project.id, [], %w[lfs_objects_size]) - expect { described_class.link_to_project!(lfs_objects_project.lfs_object, new_project) } + expect { described_class.link_to_project!(lfs_objects_project.lfs_object, new_project, repository_type) } .to change { described_class.count } expect(described_class.find_by( diff --git a/spec/services/lfs/finalize_upload_service_spec.rb b/spec/services/lfs/finalize_upload_service_spec.rb index e75e60d9b4c2258aef1448867a447ac4f8abb329..3e1ea933dd608e0e2b676e45f47bb98d8f661222 100644 --- a/spec/services/lfs/finalize_upload_service_spec.rb +++ b/spec/services/lfs/finalize_upload_service_spec.rb @@ -38,7 +38,13 @@ end subject(:service) do - described_class.new(oid: params[:oid], size: params[:size], uploaded_file: uploaded_file, project: project).execute + described_class.new( + oid: params[:oid], + size: params[:size], + uploaded_file: uploaded_file, + project: project, + repository_type: :project + ).execute end describe '#execute' do