1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
# frozen_string_literal: true
module Packages
module Conan
class Package < Packages::Package
self.allow_legacy_sti_class = true
has_one :conan_metadatum, inverse_of: :package, class_name: 'Packages::Conan::Metadatum'
has_many :conan_recipe_revisions, inverse_of: :package, class_name: 'Packages::Conan::RecipeRevision'
has_many :conan_package_references, inverse_of: :package, class_name: 'Packages::Conan::PackageReference'
has_many :conan_package_revisions, inverse_of: :package, class_name: 'Packages::Conan::PackageRevision'
accepts_nested_attributes_for :conan_metadatum
delegate :recipe, :recipe_path, to: :conan_metadatum, prefix: :conan
validates :name, :version, format: { with: Gitlab::Regex.conan_recipe_component_regex }
validate :valid_conan_package_recipe
scope :with_conan_channel, ->(package_channel) do
joins(:conan_metadatum).where(packages_conan_metadata: { package_channel: package_channel })
end
scope :with_conan_username, ->(package_username) do
joins(:conan_metadatum).where(packages_conan_metadata: { package_username: package_username })
end
scope :preload_conan_metadatum, -> { preload(:conan_metadatum) }
private
def valid_conan_package_recipe
return unless self.class
.for_projects(project)
.includes(:conan_metadatum)
.not_pending_destruction
.with_name(name)
.with_version(version)
.with_conan_channel(conan_metadatum.package_channel)
.with_conan_username(conan_metadatum.package_username)
.id_not_in(id)
.exists?
errors.add(:base, _('Package recipe already exists'))
end
end
end
end
|