diff options
Diffstat (limited to 'app/services/packages/debian/process_package_file_service.rb')
-rw-r--r-- | app/services/packages/debian/process_package_file_service.rb | 81 |
1 files changed, 66 insertions, 15 deletions
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 |