Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-05-25 15:07:22 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-05-25 15:07:22 +0300
commitfc4faf47ac4e5f1ddc40640c42c32405c38c9455 (patch)
treef6d8642f577eda485efc0570300b5da28f0a7dfe /app/services/packages
parent91a7f1897e7cb14d60c2aaf3afa76ebdc879d939 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/packages')
-rw-r--r--app/services/packages/debian/create_package_file_service.rb10
-rw-r--r--app/services/packages/debian/extract_changes_metadata_service.rb7
-rw-r--r--app/services/packages/debian/process_package_file_service.rb81
3 files changed, 78 insertions, 20 deletions
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