From fc4faf47ac4e5f1ddc40640c42c32405c38c9455 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 25 May 2023 12:07:22 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../packages/debian/create_package_file_service.rb | 10 +-- .../debian/extract_changes_metadata_service.rb | 7 +- .../debian/process_package_file_service.rb | 81 ++++++++++++++++++---- 3 files changed, 78 insertions(+), 20 deletions(-) (limited to 'app/services/packages') diff --git a/app/services/packages/debian/create_package_file_service.rb b/app/services/packages/debian/create_package_file_service.rb index 24e40b5c986..2e9299a847c 100644 --- a/app/services/packages/debian/create_package_file_service.rb +++ b/app/services/packages/debian/create_package_file_service.rb @@ -14,7 +14,7 @@ module Packages raise ArgumentError, "Invalid user" unless current_user.present? # Debian package file are first uploaded to incoming with empty metadata, - # and are moved later by Packages::Debian::ProcessChangesService + # and are moved later by Packages::Debian::ProcessPackageFileService package_file = package.package_files.create!( file: params[:file], size: params[:file]&.size, @@ -29,14 +29,12 @@ module Packages } ) - if params[:distribution].present? && params[:component].present? + if end_of_new_upload? ::Packages::Debian::ProcessPackageFileWorker.perform_async( package_file.id, params[:distribution], params[:component] ) - elsif params[:file_name].end_with? '.changes' - ::Packages::Debian::ProcessChangesWorker.perform_async(package_file.id, current_user.id) end package_file @@ -45,6 +43,10 @@ module Packages private attr_reader :package, :current_user, :params + + def end_of_new_upload? + params[:distribution].present? || params[:file_name].end_with?('.changes') + end end end end diff --git a/app/services/packages/debian/extract_changes_metadata_service.rb b/app/services/packages/debian/extract_changes_metadata_service.rb index 43a4db5bdfc..fdca8c88fdc 100644 --- a/app/services/packages/debian/extract_changes_metadata_service.rb +++ b/app/services/packages/debian/extract_changes_metadata_service.rb @@ -101,12 +101,17 @@ module Packages def entries_from_package_files @entries.each do |filename, entry| - entry.package_file = ::Packages::PackageFileFinder.new(@package_file.package, filename).execute! + entry.package_file = ::Packages::PackageFileFinder.new(incoming, filename).execute! entry.validate! rescue ActiveRecord::RecordNotFound raise ExtractionError, "#{filename} is listed in Files but was not uploaded" end end + + def incoming + @package_file.package.project.packages.debian_incoming_package! + end + strong_memoize_attr(:incoming) end end end diff --git a/app/services/packages/debian/process_package_file_service.rb b/app/services/packages/debian/process_package_file_service.rb index f4fcd3a563c..684192f6006 100644 --- a/app/services/packages/debian/process_package_file_service.rb +++ b/app/services/packages/debian/process_package_file_service.rb @@ -10,6 +10,8 @@ module Packages # used by ExclusiveLeaseGuard DEFAULT_LEASE_TIMEOUT = 1.hour.to_i.freeze + SIMPLE_DEB_FILE_TYPES = %i[deb udeb ddeb].freeze + def initialize(package_file, distribution_name, component_name) @package_file = package_file @distribution_name = distribution_name @@ -22,9 +24,10 @@ module Packages validate! try_obtain_lease do - package.transaction do + distribution.transaction do rename_package_and_set_version update_package + update_files_metadata if changes_file? update_file_metadata cleanup_temp_package end @@ -36,28 +39,61 @@ module Packages private def validate! - raise ArgumentError, 'missing distribution name' unless @distribution_name.present? - raise ArgumentError, 'missing component name' unless @component_name.present? raise ArgumentError, 'package file without Debian metadata' unless @package_file.debian_file_metadatum raise ArgumentError, 'already processed package file' unless @package_file.debian_file_metadatum.unknown? - if file_metadata[:file_type] == :deb || file_metadata[:file_type] == :udeb || file_metadata[:file_type] == :ddeb - return - end + changes_file? ? validate_changes_file! : validate_package_file! + end + + def changes_file? + @package_file.file_name.end_with?('.changes') + end + + def validate_changes_file! + raise ArgumentError, 'unwanted distribution name' unless @distribution_name.nil? + raise ArgumentError, 'unwanted component name' unless @component_name.nil? + raise ArgumentError, 'missing Source field' unless file_metadata.dig(:fields, 'Source').present? + raise ArgumentError, 'missing Version field' unless file_metadata.dig(:fields, 'Version').present? + raise ArgumentError, 'missing Distribution field' unless file_metadata.dig(:fields, 'Distribution').present? + end + + def validate_package_file! + raise ArgumentError, 'missing distribution name' unless @distribution_name.present? + raise ArgumentError, 'missing component name' unless @component_name.present? + + return if SIMPLE_DEB_FILE_TYPES.include?(file_metadata[:file_type]) raise ArgumentError, "invalid package file type: #{file_metadata[:file_type]}" end def file_metadata - ::Packages::Debian::ExtractMetadataService.new(@package_file).execute + metadata_service_class.new(@package_file).execute end strong_memoize_attr :file_metadata + def metadata_service_class + changes_file? ? ::Packages::Debian::ExtractChangesMetadataService : ::Packages::Debian::ExtractMetadataService + end + + def distribution + Packages::Debian::DistributionsFinder.new( + @package_file.package.project, + codename_or_suite: package_distribution + ).execute.last! + end + strong_memoize_attr :distribution + + def package_distribution + return file_metadata[:fields]['Distribution'] if changes_file? + + @distribution_name + end + def package packages = temp_package.project .packages .existing_debian_packages_with(name: package_name, version: package_version) - package = packages.with_debian_codename_or_suite(@distribution_name) + package = packages.with_debian_codename_or_suite(package_distribution) .first unless package @@ -79,10 +115,14 @@ module Packages strong_memoize_attr :temp_package def package_name + return file_metadata[:fields]['Source'] if changes_file? + package_name_and_version[0] end def package_version + return file_metadata[:fields]['Version'] if changes_file? + package_name_and_version[1] end @@ -121,13 +161,24 @@ module Packages package.id == temp_package.id end - def distribution - Packages::Debian::DistributionsFinder.new( - @package_file.package.project, - codename_or_suite: @distribution_name - ).execute.last! + def update_files_metadata + file_metadata[:files].each do |_, entry| + file_metadata = ::Packages::Debian::ExtractMetadataService.new(entry.package_file).execute + + ::Packages::UpdatePackageFileService.new(entry.package_file, package_id: package.id) + .execute + + # Force reload from database, as package has changed + entry.package_file.reload_package + + entry.package_file.debian_file_metadatum.update!( + file_type: file_metadata[:file_type], + component: entry.component, + architecture: file_metadata[:architecture], + fields: file_metadata[:fields] + ) + end end - strong_memoize_attr :distribution def update_file_metadata ::Packages::UpdatePackageFileService.new(@package_file, package_id: package.id) @@ -150,7 +201,7 @@ module Packages # used by ExclusiveLeaseGuard def lease_key - "packages:debian:process_package_file_service:package_file:#{@package_file.id}" + "packages:debian:process_package_file_service:#{temp_package.project_id}_#{package_name}_#{package_version}" end # used by ExclusiveLeaseGuard -- cgit v1.2.3