summaryrefslogtreecommitdiff
path: root/app/models/concerns/packages/debian
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-02-09 03:09:18 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-02-09 03:09:18 +0000
commit9c8d620e48c59fe3d10f9c4b50f91124d7c09182 (patch)
treec629ebcedd29c2ca756af2367218f6723ac3d58d /app/models/concerns/packages/debian
parent1c0289261b8d67e983b5d3ed1ef23fd800deab98 (diff)
downloadgitlab-ce-9c8d620e48c59fe3d10f9c4b50f91124d7c09182.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/concerns/packages/debian')
-rw-r--r--app/models/concerns/packages/debian/architecture.rb6
-rw-r--r--app/models/concerns/packages/debian/component.rb6
-rw-r--r--app/models/concerns/packages/debian/component_file.rb101
-rw-r--r--app/models/concerns/packages/debian/distribution.rb8
4 files changed, 120 insertions, 1 deletions
diff --git a/app/models/concerns/packages/debian/architecture.rb b/app/models/concerns/packages/debian/architecture.rb
index 4aa633e0357..760ebb49980 100644
--- a/app/models/concerns/packages/debian/architecture.rb
+++ b/app/models/concerns/packages/debian/architecture.rb
@@ -7,6 +7,12 @@ module Packages
included do
belongs_to :distribution, class_name: "Packages::Debian::#{container_type.capitalize}Distribution", inverse_of: :architectures
+ # files must be destroyed by ruby code in order to properly remove carrierwave uploads
+ has_many :files,
+ class_name: "Packages::Debian::#{container_type.capitalize}ComponentFile",
+ foreign_key: :architecture_id,
+ inverse_of: :architecture,
+ dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
validates :distribution,
presence: true
diff --git a/app/models/concerns/packages/debian/component.rb b/app/models/concerns/packages/debian/component.rb
index e37110231ce..7b342c7b684 100644
--- a/app/models/concerns/packages/debian/component.rb
+++ b/app/models/concerns/packages/debian/component.rb
@@ -7,6 +7,12 @@ module Packages
included do
belongs_to :distribution, class_name: "Packages::Debian::#{container_type.capitalize}Distribution", inverse_of: :components
+ # files must be destroyed by ruby code in order to properly remove carrierwave uploads
+ has_many :files,
+ class_name: "Packages::Debian::#{container_type.capitalize}ComponentFile",
+ foreign_key: :component_id,
+ inverse_of: :component,
+ dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
validates :distribution,
presence: true
diff --git a/app/models/concerns/packages/debian/component_file.rb b/app/models/concerns/packages/debian/component_file.rb
new file mode 100644
index 00000000000..3cc2c291e96
--- /dev/null
+++ b/app/models/concerns/packages/debian/component_file.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+module Packages
+ module Debian
+ module ComponentFile
+ extend ActiveSupport::Concern
+
+ included do
+ include Sortable
+ include FileStoreMounter
+
+ def self.container_foreign_key
+ "#{container_type}_id".to_sym
+ end
+
+ def self.distribution_class
+ "::Packages::Debian::#{container_type.capitalize}Distribution".constantize
+ end
+
+ belongs_to :component, class_name: "Packages::Debian::#{container_type.capitalize}Component", inverse_of: :files
+ belongs_to :architecture, class_name: "Packages::Debian::#{container_type.capitalize}Architecture", inverse_of: :files, optional: true
+
+ enum file_type: { packages: 1, source: 2, di_packages: 3 }
+ enum compression_type: { gz: 1, bz2: 2, xz: 3 }
+
+ validates :component, presence: true
+ validates :file_type, presence: true
+ validates :architecture, presence: true, unless: :source?
+ validates :architecture, absence: true, if: :source?
+ validates :file, length: { minimum: 0, allow_nil: false }
+ validates :size, presence: true
+ validates :file_store, presence: true
+ validates :file_md5, presence: true
+ validates :file_sha256, presence: true
+
+ scope :with_container, ->(container) do
+ joins(component: :distribution)
+ .where("packages_debian_#{container_type}_distributions" => { container_foreign_key => container.id })
+ end
+
+ scope :with_codename_or_suite, ->(codename_or_suite) do
+ joins(component: :distribution)
+ .merge(distribution_class.with_codename_or_suite(codename_or_suite))
+ end
+
+ scope :with_component_name, ->(component_name) do
+ joins(:component)
+ .where("packages_debian_#{container_type}_components" => { name: component_name })
+ end
+
+ scope :with_file_type, ->(file_type) { where(file_type: file_type) }
+
+ scope :with_architecture_name, ->(architecture_name) do
+ left_outer_joins(:architecture)
+ .where("packages_debian_#{container_type}_architectures" => { name: architecture_name })
+ end
+
+ scope :with_compression_type, ->(compression_type) { where(compression_type: compression_type) }
+ scope :with_file_sha256, ->(file_sha256) { where(file_sha256: file_sha256) }
+
+ scope :preload_distribution, -> { includes(component: :distribution) }
+
+ mount_file_store_uploader Packages::Debian::ComponentFileUploader
+
+ before_validation :update_size_from_file
+
+ def file_name
+ case file_type
+ when 'di_packages'
+ 'Packages'
+ else
+ file_type.capitalize
+ end
+ end
+
+ def relative_path
+ case file_type
+ when 'packages'
+ "#{component.name}/binary-#{architecture.name}/#{file_name}#{extension}"
+ when 'source'
+ "#{component.name}/source/#{file_name}#{extension}"
+ when 'di_packages'
+ "#{component.name}/debian-installer/binary-#{architecture.name}/#{file_name}#{extension}"
+ end
+ end
+
+ private
+
+ def extension
+ return '' unless compression_type
+
+ ".#{compression_type}"
+ end
+
+ def update_size_from_file
+ self.size ||= file.size
+ end
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/packages/debian/distribution.rb b/app/models/concerns/packages/debian/distribution.rb
index 546d866d670..08fb9ccf3ea 100644
--- a/app/models/concerns/packages/debian/distribution.rb
+++ b/app/models/concerns/packages/debian/distribution.rb
@@ -18,10 +18,16 @@ module Packages
belongs_to container_type
belongs_to :creator, class_name: 'User'
+ # component_files must be destroyed by ruby code in order to properly remove carrierwave uploads
has_many :components,
class_name: "Packages::Debian::#{container_type.capitalize}Component",
foreign_key: :distribution_id,
- inverse_of: :distribution
+ inverse_of: :distribution,
+ dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
+ has_many :component_files,
+ through: :components,
+ source: :files,
+ class_name: "Packages::Debian::#{container_type.capitalize}ComponentFile"
has_many :architectures,
class_name: "Packages::Debian::#{container_type.capitalize}Architecture",
foreign_key: :distribution_id,