summaryrefslogtreecommitdiff
path: root/app/services/packages/rpm/repository_metadata/build_primary_xml_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/packages/rpm/repository_metadata/build_primary_xml_service.rb')
-rw-r--r--app/services/packages/rpm/repository_metadata/build_primary_xml_service.rb78
1 files changed, 78 insertions, 0 deletions
diff --git a/app/services/packages/rpm/repository_metadata/build_primary_xml_service.rb b/app/services/packages/rpm/repository_metadata/build_primary_xml_service.rb
new file mode 100644
index 00000000000..1044ab3997a
--- /dev/null
+++ b/app/services/packages/rpm/repository_metadata/build_primary_xml_service.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+module Packages
+ module Rpm
+ module RepositoryMetadata
+ class BuildPrimaryXmlService < BuildXmlBaseService
+ ROOT_TAG = 'metadata'
+ ROOT_ATTRIBUTES = {
+ xmlns: 'http://linux.duke.edu/metadata/common',
+ 'xmlns:rpm': 'http://linux.duke.edu/metadata/rpm',
+ packages: '0'
+ }.freeze
+
+ # Nodes that have only text without attributes
+ BASE_ATTRIBUTES = %i[name arch summary description url packager].freeze
+ FORMAT_NODE_BASE_ATTRIBUTES = %i[license vendor group buildhost sourcerpm].freeze
+
+ def execute
+ super do |xml|
+ xml.package(type: :rpm, 'xmlns:rpm': 'http://linux.duke.edu/metadata/rpm') do
+ build_base_attributes(xml)
+ xml.version epoch: data[:epoch], ver: data[:version], rel: data[:release]
+ xml.checksum data[:pkgid], type: 'sha256', pkgid: 'YES'
+ xml.size package: data[:packagesize], installed: data[:installedsize], archive: data[:archivesize]
+ xml.time file: data[:filetime], build: data[:buildtime]
+ xml.location href: data[:location] if data[:location].present?
+ build_format_node(xml)
+ end
+ end
+ end
+
+ private
+
+ def build_base_attributes(xml)
+ BASE_ATTRIBUTES.each do |attribute|
+ xml.method_missing(attribute, data[attribute]) if data[attribute].present?
+ end
+ end
+
+ def build_format_node(xml)
+ xml.format do
+ build_base_format_attributes(xml)
+ build_provides_node(xml)
+ build_requires_node(xml)
+ end
+ end
+
+ def build_base_format_attributes(xml)
+ FORMAT_NODE_BASE_ATTRIBUTES.each do |attribute|
+ xml[:rpm].method_missing(attribute, data[attribute]) if data[attribute].present?
+ end
+ end
+
+ def build_requires_node(xml)
+ xml[:rpm].requires do
+ data[:requirements].each do |requires|
+ xml[:rpm].entry(
+ name: requires[:requirename],
+ flags: requires[:requireflags],
+ ver: requires[:requireversion]
+ )
+ end
+ end
+ end
+
+ def build_provides_node(xml)
+ xml[:rpm].provides do
+ data[:provides].each do |provides|
+ xml[:rpm].entry(
+ name: provides[:providename],
+ flags: provides[:provideflags],
+ ver: provides[:provideversion])
+ end
+ end
+ end
+ end
+ end
+ end
+end