Class: Vanagon::Project
- Inherits:
-
Object
- Object
- Vanagon::Project
- Includes:
- Utilities
- Defined in:
- lib/vanagon/project.rb,
lib/vanagon/project/dsl.rb
Defined Under Namespace
Classes: DSL
Instance Attribute Summary collapse
-
#artifacts_to_fetch ⇒ Object
Additional File(s) to retrieve from the system after the installation steps are all complete.
-
#bill_of_materials ⇒ Object
Stores the location for the bill-of-materials (a receipt of all files written during) project package assembly.
-
#cleanup ⇒ Object
Stores whether or not a project should cleanup as it builds because the target builder is space-constrained.
-
#compiled_archive ⇒ Object
Should we include platform-specific archives as final outputs probably gzipped tarball for *nix, and probably 7z for win.
-
#components ⇒ Object
Returns the value of attribute components.
-
#configdir ⇒ Object
Returns the value of attribute configdir.
-
#conflicts ⇒ Object
Returns the value of attribute conflicts.
-
#description ⇒ Object
Returns the value of attribute description.
-
#directories ⇒ Object
Store any target directories that should be packed up into the resultant artifact produced by a given Vanagon project.
-
#environment ⇒ Object
The overall Environment that a given Vanagon project should pass to each platform.
-
#extra_files_to_sign ⇒ Object
Extra files to sign Right now just supported on windows, useful for signing powershell scripts that need to be signed between build and MSI creation.
-
#generate_packages ⇒ Object
Should we generate platform-specific packages (rpm, deb, dmg, msi, etc).
-
#homepage ⇒ Object
Returns the value of attribute homepage.
-
#identifier ⇒ Object
This is macOS specific, and defines the Identifier that macOS should use when it builds a .pkg.
-
#license ⇒ Object
Returns the value of attribute license.
-
#name ⇒ Object
Numerous attributes related to the artifact that a given Vanagon project will produce.
-
#no_packaging ⇒ Object
Specify that the project should not perform the packaging steps in vanagon and instead just stop after installation.
-
#noarch ⇒ Object
Mark a project as being architecture independent.
-
#package_overrides ⇒ Object
Extra vars to be set in the spec file or debian rules.
-
#platform ⇒ Object
Platform’s abstraction is kind of backwards – we should refactor how this works, and make it possible for Vanagon to default to all defined platforms if nothing is specified.
-
#provides ⇒ Object
Returns the value of attribute provides.
-
#release ⇒ Object
Returns the value of attribute release.
-
#replaces ⇒ Object
Returns the value of attribute replaces.
-
#repo ⇒ Object
This is entirely too Puppet centric, and should be refactored out !depreciate !refactor.
-
#requires ⇒ Object
Returns the value of attribute requires.
-
#retry_count ⇒ Object
Returns the value of attribute retry_count.
-
#settings ⇒ Object
Stores individual settings related to a given Vanagon project, not necessarily the artifact that the project produces.
-
#signing_command ⇒ Object
Returns the value of attribute signing_command.
-
#signing_hostname ⇒ Object
Returns the value of attribute signing_hostname.
-
#signing_username ⇒ Object
Returns the value of attribute signing_username.
-
#source_artifacts ⇒ Object
Should we include source packages?.
-
#timeout ⇒ Object
Returns the value of attribute timeout.
-
#user ⇒ Object
This will define any new users that a project should create.
-
#vendor ⇒ Object
Returns the value of attribute vendor.
-
#version ⇒ Object
Returns the value of attribute version.
-
#version_file ⇒ Object
Stores whether or not Vanagon should write the project’s version out into a file inside the package – do we really need this? !depreciate !refactor.
-
#yaml_settings ⇒ Object
Store whether Vanagon should write the project’s settings to a yaml file during builds.
Class Method Summary collapse
-
.load_project(name, configdir, platform, include_components = []) ⇒ Vanagon::Project
Loads a given project from the configdir.
Instance Method Summary collapse
-
#build_manifest_json(pretty = false) ⇒ Hash
Generate a hash which contains relevant information regarding components of a package, what vanagon built the package, time of build, as well as version of the thing we were building.
-
#check_pkg_state_string(pkg_state) ⇒ Object
Checks that the string pkg_state is valid (install OR upgrade).
-
#dirnames ⇒ Array
This originally lived in the Makefile.erb template, but it’s pretty domain-inspecific and we should try to minimize assignment inside an ERB template.
-
#fetch_sources(workdir, retry_count = 1, timeout = 7200) ⇒ Object
Collects all sources and patches into the provided workdir.
-
#filter_component(name) ⇒ Array
Returns a filtered out set of components only including those components necessary to build a specific component.
-
#generate_bill_of_materials ⇒ Array
Generate a bill-of-materials: a listing of the components and their versions in the current project.
-
#generate_dependencies_info ⇒ Hash
Generate a json hash which lists all of the dependant components of the project.
-
#generate_package ⇒ String, Array
Ascertain how to build a package for the current platform.
-
#generate_packaging_artifacts(workdir) ⇒ Object
Generate any required files to build a package for this project on the current platform into the provided workdir.
-
#get_activate_triggers ⇒ Array
Collects activate triggers for the project and its components.
-
#get_all_trigger_pkgs ⇒ Array
Grabs all pkgs that have trigger scripts for ‘install’ and ‘upgrade’.
-
#get_component(name) ⇒ Vanagon::Component
Gets the component with component.name = “name” from the list of project.components.
-
#get_configfiles ⇒ Array
Collects any configfiles supplied by components.
-
#get_conflicts ⇒ Object
Collects all of the conflicts for the project and its components.
-
#get_directories ⇒ Array
Collects any directories declared by the project and components.
-
#get_files ⇒ Array
Collects any additional files supplied by components.
-
#get_install_trigger_scripts(pkg) ⇒ Object
Grabs the install trigger scripts for the specified pkg.
-
#get_interest_triggers(pkg_state) ⇒ Array
Collects the interest triggers for the project and its scripts for the specified packaging state.
-
#get_postinstall_actions(pkg_state) ⇒ String
Collects the postinstall packaging actions for the project and it’s components for the specified packaging state.
-
#get_postremove_actions(pkg_state) ⇒ String
Collects the postremove packaging actions for the project and it’s components for the specified packaging state.
-
#get_preinstall_actions(pkg_state) ⇒ String
Collects the preinstall packaging actions for the project and its components for the specified packaging state.
-
#get_preremove_actions(pkg_state) ⇒ String
Collects the preremove packaging actions for the project and it’s components for the specified packaging state.
-
#get_provides ⇒ Array
Collects all of the provides for the project and its components.
-
#get_replaces ⇒ Array
Collects all of the replacements for the project and its components.
-
#get_requires ⇒ Array
Collects all of the requires for both the project and its components.
-
#get_root_directories ⇒ Array
Gets the highest level directories declared by the project.
-
#get_rpm_ghost_files ⇒ Array
Collects any rpm %ghost files supplied by components.
-
#get_service(name) ⇒ @component.service obj
Grabs a specific service based on which name is passed in note that if the name is wrong or there was no will return nil.
-
#get_services ⇒ Array
Get any services registered by components in the project.
-
#get_tarball_files ⇒ Array
Generate a list of all files and directories to be included in a tarball for the project.
-
#get_trigger_scripts(pkg_state) ⇒ Hash
Collects the install trigger scripts for the project for the specified packing state.
-
#get_upgrade_trigger_scripts(pkg) ⇒ Object
Grabs the upgrade trigger scripts for the specified pkg.
- #has_configfiles? ⇒ Boolean
- #has_conflicts? ⇒ Boolean
- #has_provides? ⇒ Boolean
- #has_replaces? ⇒ Boolean
-
#has_services? ⇒ True, False
Simple utility for determining if the components in the project declare any services.
-
#initialize(name, platform) ⇒ Vanagon::Project
constructor
Project constructor.
-
#list_component_dependencies(component) ⇒ Array
Return a list of the build_dependencies that are satisfied by an internal component.
- #load_upstream_metadata(metadata_uri) ⇒ Object
-
#load_upstream_settings(upstream_project_name, upstream_git_url, upstream_git_branch) ⇒ Object
Load the settings hash from an upstream vanagon project.
-
#load_yaml_settings(settings_uri, settings_sha1_uri = nil) ⇒ Object
Load the settings hash for the current project/platform combination from a yaml file as produced by ‘publish_yaml_settings`.
-
#make_bill_of_materials(workdir) ⇒ String
Generates a bill-of-materials and writes the contents to the workdir for use in building the project.
-
#make_makefile(workdir) ⇒ String
Evaluates the makefile template and writes the contents to the workdir for use in building the project.
-
#merged_environment ⇒ Environment
Merge the platform’s Environment into the project’s Environment and return the result.
-
#metadata_merge(original, upstream) ⇒ Hash
Recursive merge of metadata hashes Input is not modified In case of duplicate keys, original value is kept.
-
#method_missing(method_name, *args) ⇒ Object
Magic getter to retrieve settings in the project.
-
#pack_tarball_command ⇒ String
Method to generate the command to create a tarball of the project.
-
#package_name ⇒ String
Get the package name for the project on the current platform.
-
#publish_yaml_settings(platform) ⇒ Object
Writes a yaml file at ‘output/<name>-<version>.<platform>.settings.yaml` containing settings used to build the current project on the platform provided (and a corresponding sha1sum file) if `yaml_settings` has been set in the project definition.
- #respond_to_missing?(method_name, include_private = false) ⇒ Boolean
-
#save_manifest_json(platform, additional_directories = nil) ⇒ Object
Writes a json file at ‘ext/build_metadata.<project>.<platform>.json` containing information about what went into a built artifact.
-
#vendor_email_only ⇒ String
Parses the vendor for the project by taking only the email address field (e.g. ‘<[email protected]>`).
-
#vendor_name_only ⇒ String
Parses the vendor for the project by cutting off the email address field (e.g. ‘<[email protected]>`).
Methods included from Utilities
#erb_file, #erb_string, #ex, #find_program_on_path, #get_md5sum, #get_sum, #http_request, #http_request_code, #http_request_generic, #local_command, #remote_ssh_command, #retry_with_timeout, #rsync_from, #rsync_to, #ssh_command
Constructor Details
#initialize(name, platform) ⇒ Vanagon::Project
Project constructor. Takes just the name. Also sets the @name and @platform, and initializes @components, @directories and @settings.
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/vanagon/project.rb', line 146 def initialize(name, platform) # rubocop:disable Metrics/AbcSize @name = name @components = [] @requires = [] @directories = [] @settings = platform.settings # Environments are like Hashes but with specific constraints # around their keys and values. @environment = Vanagon::Environment.new @platform = platform @release = "1" @replaces = [] @provides = [] @conflicts = [] @package_overrides = [] @source_artifacts = false @compiled_archive = false @generate_packages = true @yaml_settings = false @upstream_metadata = {} @no_packaging = false @artifacts_to_fetch = [] @extra_files_to_sign = [] @signing_hostname = '' @signing_username = '' @signing_command = '' end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args) ⇒ Object
Magic getter to retrieve settings in the project
175 176 177 178 179 180 |
# File 'lib/vanagon/project.rb', line 175 def method_missing(method_name, *args) if @settings.key?(method_name) return @settings[method_name] end super end |
Instance Attribute Details
#artifacts_to_fetch ⇒ Object
Additional File(s) to retrieve from the system after the installation steps are all complete.
103 104 105 |
# File 'lib/vanagon/project.rb', line 103 def artifacts_to_fetch @artifacts_to_fetch end |
#bill_of_materials ⇒ Object
Stores the location for the bill-of-materials (a receipt of all files written during) project package assembly
74 75 76 |
# File 'lib/vanagon/project.rb', line 74 def bill_of_materials @bill_of_materials end |
#cleanup ⇒ Object
Stores whether or not a project should cleanup as it builds because the target builder is space-constrained
61 62 63 |
# File 'lib/vanagon/project.rb', line 61 def cleanup @cleanup end |
#compiled_archive ⇒ Object
Should we include platform-specific archives as final outputs probably gzipped tarball for *nix, and probably 7z for win
96 97 98 |
# File 'lib/vanagon/project.rb', line 96 def compiled_archive @compiled_archive end |
#components ⇒ Object
Returns the value of attribute components.
26 27 28 |
# File 'lib/vanagon/project.rb', line 26 def components @components end |
#configdir ⇒ Object
Returns the value of attribute configdir.
36 37 38 |
# File 'lib/vanagon/project.rb', line 36 def configdir @configdir end |
#conflicts ⇒ Object
Returns the value of attribute conflicts.
27 28 29 |
# File 'lib/vanagon/project.rb', line 27 def conflicts @conflicts end |
#description ⇒ Object
Returns the value of attribute description.
25 26 27 |
# File 'lib/vanagon/project.rb', line 25 def description @description end |
#directories ⇒ Object
Store any target directories that should be packed up into the resultant artifact produced by a given Vanagon project.
42 43 44 |
# File 'lib/vanagon/project.rb', line 42 def directories @directories end |
#environment ⇒ Object
The overall Environment that a given Vanagon project should pass to each platform
82 83 84 |
# File 'lib/vanagon/project.rb', line 82 def environment @environment end |
#extra_files_to_sign ⇒ Object
Extra files to sign Right now just supported on windows, useful for signing powershell scripts that need to be signed between build and MSI creation
115 116 117 |
# File 'lib/vanagon/project.rb', line 115 def extra_files_to_sign @extra_files_to_sign end |
#generate_packages ⇒ Object
Should we generate platform-specific packages (rpm, deb, dmg, msi, etc)
99 100 101 |
# File 'lib/vanagon/project.rb', line 99 def generate_packages @generate_packages end |
#homepage ⇒ Object
Returns the value of attribute homepage.
23 24 25 |
# File 'lib/vanagon/project.rb', line 23 def homepage @homepage end |
#identifier ⇒ Object
This is macOS specific, and defines the Identifier that macOS should use when it builds a .pkg
57 58 59 |
# File 'lib/vanagon/project.rb', line 57 def identifier @identifier end |
#license ⇒ Object
Returns the value of attribute license.
22 23 24 |
# File 'lib/vanagon/project.rb', line 22 def license @license end |
#name ⇒ Object
Numerous attributes related to the artifact that a given Vanagon project will produce
19 20 21 |
# File 'lib/vanagon/project.rb', line 19 def name @name end |
#no_packaging ⇒ Object
Specify that the project should not perform the packaging steps in vanagon and instead just stop after installation.
Useful alongside fetch_artifact when you don’t need vanagon’s packaging system and you just want to perform installation and pull down a file.
110 111 112 |
# File 'lib/vanagon/project.rb', line 110 def no_packaging @no_packaging end |
#noarch ⇒ Object
Mark a project as being architecture independent
53 54 55 |
# File 'lib/vanagon/project.rb', line 53 def noarch @noarch end |
#package_overrides ⇒ Object
Extra vars to be set in the spec file or debian rules. Good for setting extra %define or %global things for RPM, or env variables needed in the debian rules file No extra munging will be performed, so these should be set as you want them to appear in your spec/rules files!
89 90 91 |
# File 'lib/vanagon/project.rb', line 89 def package_overrides @package_overrides end |
#platform ⇒ Object
Platform’s abstraction is kind of backwards – we should refactor how this works, and make it possible for Vanagon to default to all defined platforms if nothing is specified.
35 36 37 |
# File 'lib/vanagon/project.rb', line 35 def platform @platform end |
#provides ⇒ Object
Returns the value of attribute provides.
30 31 32 |
# File 'lib/vanagon/project.rb', line 30 def provides @provides end |
#release ⇒ Object
Returns the value of attribute release.
21 22 23 |
# File 'lib/vanagon/project.rb', line 21 def release @release end |
#replaces ⇒ Object
Returns the value of attribute replaces.
29 30 31 |
# File 'lib/vanagon/project.rb', line 29 def replaces @replaces end |
#repo ⇒ Object
This is entirely too Puppet centric, and should be refactored out !depreciate !refactor
50 51 52 |
# File 'lib/vanagon/project.rb', line 50 def repo @repo end |
#requires ⇒ Object
Returns the value of attribute requires.
28 29 30 |
# File 'lib/vanagon/project.rb', line 28 def requires @requires end |
#retry_count ⇒ Object
Returns the value of attribute retry_count.
37 38 39 |
# File 'lib/vanagon/project.rb', line 37 def retry_count @retry_count end |
#settings ⇒ Object
Stores individual settings related to a given Vanagon project, not necessarily the artifact that the project produces
78 79 80 |
# File 'lib/vanagon/project.rb', line 78 def settings @settings end |
#signing_command ⇒ Object
Returns the value of attribute signing_command.
118 119 120 |
# File 'lib/vanagon/project.rb', line 118 def signing_command @signing_command end |
#signing_hostname ⇒ Object
Returns the value of attribute signing_hostname.
116 117 118 |
# File 'lib/vanagon/project.rb', line 116 def signing_hostname @signing_hostname end |
#signing_username ⇒ Object
Returns the value of attribute signing_username.
117 118 119 |
# File 'lib/vanagon/project.rb', line 117 def signing_username @signing_username end |
#source_artifacts ⇒ Object
Should we include source packages?
92 93 94 |
# File 'lib/vanagon/project.rb', line 92 def source_artifacts @source_artifacts end |
#timeout ⇒ Object
Returns the value of attribute timeout.
38 39 40 |
# File 'lib/vanagon/project.rb', line 38 def timeout @timeout end |
#user ⇒ Object
This will define any new users that a project should create
45 46 47 |
# File 'lib/vanagon/project.rb', line 45 def user @user end |
#vendor ⇒ Object
Returns the value of attribute vendor.
24 25 26 |
# File 'lib/vanagon/project.rb', line 24 def vendor @vendor end |
#version ⇒ Object
Returns the value of attribute version.
20 21 22 |
# File 'lib/vanagon/project.rb', line 20 def version @version end |
#version_file ⇒ Object
Stores whether or not Vanagon should write the project’s version out into a file inside the package – do we really need this? !depreciate !refactor
67 68 69 |
# File 'lib/vanagon/project.rb', line 67 def version_file @version_file end |
#yaml_settings ⇒ Object
Store whether Vanagon should write the project’s settings to a yaml file during builds
70 71 72 |
# File 'lib/vanagon/project.rb', line 70 def yaml_settings @yaml_settings end |
Class Method Details
.load_project(name, configdir, platform, include_components = []) ⇒ Vanagon::Project
Loads a given project from the configdir
128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/vanagon/project.rb', line 128 def self.load_project(name, configdir, platform, include_components = []) projfile = File.join(configdir, "#{name}.rb") dsl = Vanagon::Project::DSL.new(name, File.dirname(configdir), platform, include_components) dsl.instance_eval(File.read(projfile), projfile, 1) dsl._project rescue StandardError => e VanagonLogger.error "Error loading project '#{name}' using '#{projfile}':" VanagonLogger.error(e) VanagonLogger.error e.backtrace.join("\n") raise e end |
Instance Method Details
#build_manifest_json(pretty = false) ⇒ Hash
Generate a hash which contains relevant information regarding components of a package, what vanagon built the package, time of build, as well as version of the thing we were building.
699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 |
# File 'lib/vanagon/project.rb', line 699 def build_manifest_json(pretty = false) manifest = { "packaging_type" => { "vanagon" => VANAGON_VERSION, }, "version" => version, "components" => generate_dependencies_info, "build_time" => BUILD_TIME, } if pretty JSON.pretty_generate(manifest) else manifest end end |
#check_pkg_state_string(pkg_state) ⇒ Object
Checks that the string pkg_state is valid (install OR upgrade). Return vanagon error if invalid
388 389 390 391 392 |
# File 'lib/vanagon/project.rb', line 388 def check_pkg_state_string(pkg_state) unless ["install", "upgrade"].include? pkg_state raise Vanagon::Error, "#{pkg_state} should be a string containing one of 'install' or 'upgrade'" end end |
#dirnames ⇒ Array
This originally lived in the Makefile.erb template, but it’s pretty domain-inspecific and we should try to minimize assignment inside an ERB template
566 567 568 |
# File 'lib/vanagon/project.rb', line 566 def dirnames get_directories.map(&:path) end |
#fetch_sources(workdir, retry_count = 1, timeout = 7200) ⇒ Object
Collects all sources and patches into the provided workdir
228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/vanagon/project.rb', line 228 def fetch_sources(workdir, retry_count = 1, timeout = 7200) @components.each do |component| Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do component.get_source(workdir) end # Fetch secondary sources Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do component.get_sources(workdir) end Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do component.get_patches(workdir) end end end |
#filter_component(name) ⇒ Array
Returns a filtered out set of components only including those components necessary to build a specific component. This is a recursive function that will call itself until it gets to a component with no build requirements
270 271 272 273 274 275 276 277 278 279 280 281 282 283 |
# File 'lib/vanagon/project.rb', line 270 def filter_component(name) filtered_component = get_component(name) return [] if filtered_component.nil? included_components = [filtered_component] unless filtered_component.build_requires.empty? filtered_component.build_requires.each do |build_requirement| unless get_component(build_requirement).nil? included_components += filter_component(build_requirement) end end end included_components.uniq end |
#generate_bill_of_materials ⇒ Array
Generate a bill-of-materials: a listing of the components and their versions in the current project
613 614 615 |
# File 'lib/vanagon/project.rb', line 613 def generate_bill_of_materials components.map { |comp| "#{comp.name} #{comp.version}" }.sort end |
#generate_dependencies_info ⇒ Hash
Generate a json hash which lists all of the dependant components of the project.
687 688 689 690 691 |
# File 'lib/vanagon/project.rb', line 687 def generate_dependencies_info components.each_with_object({}) do |component, hsh| hsh.merge!(component.get_dependency_hash) end end |
#generate_package ⇒ String, Array
Ascertain how to build a package for the current platform
663 664 665 666 667 668 669 670 671 672 |
# File 'lib/vanagon/project.rb', line 663 def generate_package cmds = [] if generate_packages cmds << @platform.generate_package(self) end if compiled_archive cmds << @platform.generate_compiled_archive(self) end cmds.flatten end |
#generate_packaging_artifacts(workdir) ⇒ Object
Generate any required files to build a package for this project on the current platform into the provided workdir
678 679 680 |
# File 'lib/vanagon/project.rb', line 678 def generate_packaging_artifacts(workdir) @platform.generate_packaging_artifacts(workdir, @name, binding, self) end |
#get_activate_triggers ⇒ Array
Collects activate triggers for the project and its components
473 474 475 |
# File 'lib/vanagon/project.rb', line 473 def get_activate_triggers() components.flat_map(&:activate_triggers).compact.map(&:activate_name) end |
#get_all_trigger_pkgs ⇒ Array
Grabs all pkgs that have trigger scripts for ‘install’ and ‘upgrade’
446 447 448 449 450 451 |
# File 'lib/vanagon/project.rb', line 446 def get_all_trigger_pkgs() install_triggers = get_trigger_scripts("install") upgrade_triggers = get_trigger_scripts("upgrade") packages = (install_triggers.keys + upgrade_triggers.keys).uniq return packages end |
#get_component(name) ⇒ Vanagon::Component
Gets the component with component.name = “name” from the list of project.components
290 291 292 293 294 |
# File 'lib/vanagon/project.rb', line 290 def get_component(name) comps = @components.select { |comp| comp.name.to_s == name.to_s } raise "ERROR: two or more components with the same name: #{comps.first.name}" if comps.size > 1 comps.first end |
#get_configfiles ⇒ Array
Collects any configfiles supplied by components
528 529 530 |
# File 'lib/vanagon/project.rb', line 528 def get_configfiles components.flat_map(&:configfiles).uniq end |
#get_conflicts ⇒ Object
Collects all of the conflicts for the project and its components
331 332 333 334 335 336 337 338 339 340 341 342 |
# File 'lib/vanagon/project.rb', line 331 def get_conflicts conflicts = [] conflicts << @conflicts.flatten conflicts << components.flat_map(&:conflicts) conflicts.flatten! conflicts.each do |conflict| # TODO: Make this a more reasonable default before 1.0.0 # but in the interim, maintain the current behavior conflict.version = @platform.version_munger(conflict.version, default: '<') if conflict.version end conflicts.uniq end |
#get_directories ⇒ Array
Collects any directories declared by the project and components
539 540 541 542 543 544 |
# File 'lib/vanagon/project.rb', line 539 def get_directories dirs = [] dirs.push @directories dirs.push components.flat_map(&:directories) dirs.flatten.uniq end |
#get_files ⇒ Array
Collects any additional files supplied by components
246 247 248 249 250 251 |
# File 'lib/vanagon/project.rb', line 246 def get_files files = [] files.push @version_file if @version_file files.push components.flat_map(&:files) files.flatten.uniq end |
#get_install_trigger_scripts(pkg) ⇒ Object
Grabs the install trigger scripts for the specified pkg
430 431 432 433 |
# File 'lib/vanagon/project.rb', line 430 def get_install_trigger_scripts(pkg) scripts = get_trigger_scripts("install") return scripts[pkg].join("\n") end |
#get_interest_triggers(pkg_state) ⇒ Array
Collects the interest triggers for the project and its scripts for the
specified packaging state
460 461 462 463 464 465 466 467 468 |
# File 'lib/vanagon/project.rb', line 460 def get_interest_triggers(pkg_state) interest_triggers = [] check_pkg_state_string(pkg_state) interests = components.flat_map(&:interest_triggers).compact.select { |s| s.pkg_state.include? pkg_state } interests.each do |interest| interest_triggers.push(interest) end interest_triggers.flatten.compact end |
#get_postinstall_actions(pkg_state) ⇒ String
Collects the postinstall packaging actions for the project and it’s components
for the specified packaging state
484 485 486 487 488 489 490 491 |
# File 'lib/vanagon/project.rb', line 484 def get_postinstall_actions(pkg_state) scripts = components.flat_map(&:postinstall_actions).compact.select { |s| s.pkg_state.include? pkg_state }.map(&:scripts) if scripts.empty? return ': no postinstall scripts provided' else return scripts.join("\n") end end |
#get_postremove_actions(pkg_state) ⇒ String
Collects the postremove packaging actions for the project and it’s components for the specified packaging state
516 517 518 519 520 521 522 523 |
# File 'lib/vanagon/project.rb', line 516 def get_postremove_actions(pkg_state) scripts = components.flat_map(&:postremove_actions).compact.select { |s| s.pkg_state.include? pkg_state }.map(&:scripts) if scripts.empty? return ': no postremove scripts provided' else return scripts.join("\n") end end |
#get_preinstall_actions(pkg_state) ⇒ String
Collects the preinstall packaging actions for the project and its components
for the specified packaging state
401 402 403 404 405 406 407 408 409 |
# File 'lib/vanagon/project.rb', line 401 def get_preinstall_actions(pkg_state) check_pkg_state_string(pkg_state) scripts = components.flat_map(&:preinstall_actions).compact.select { |s| s.pkg_state.include? pkg_state }.map(&:scripts) if scripts.empty? return ': no preinstall scripts provided' else return scripts.join("\n") end end |
#get_preremove_actions(pkg_state) ⇒ String
Collects the preremove packaging actions for the project and it’s components for the specified packaging state
500 501 502 503 504 505 506 507 |
# File 'lib/vanagon/project.rb', line 500 def get_preremove_actions(pkg_state) scripts = components.flat_map(&:preremove_actions).compact.select { |s| s.pkg_state.include? pkg_state }.map(&:scripts) if scripts.empty? return ': no preremove scripts provided' else return scripts.join("\n") end end |
#get_provides ⇒ Array
Collects all of the provides for the project and its components
367 368 369 370 371 372 373 374 375 376 377 378 |
# File 'lib/vanagon/project.rb', line 367 def get_provides provides = [] provides << @provides.flatten provides << components.flat_map(&:provides) provides.flatten! provides.each do |provide| # TODO: Make this a more reasonable default before 1.0.0 # but in the interim, maintain the current behavior provide.version = @platform.version_munger(provide.version, default: '>=') if provide.version end provides.uniq end |
#get_replaces ⇒ Array
Collects all of the replacements for the project and its components
313 314 315 316 317 318 319 320 321 322 323 324 |
# File 'lib/vanagon/project.rb', line 313 def get_replaces replaces = [] replaces << @replaces.flatten replaces << components.flat_map(&:replaces) replaces.flatten! replaces.each do |replace| # TODO: Make this a more reasonable default before 1.0.0 # but in the interim, maintain the current behavior replace.version = @platform.version_munger(replace.version, default: '<') if replace.version end replaces.uniq end |
#get_requires ⇒ Array
Collects all of the requires for both the project and its components
299 300 301 302 303 304 305 306 307 308 |
# File 'lib/vanagon/project.rb', line 299 def get_requires requires = [] requires << @requires.flatten requires << components.flat_map(&:requires) requires.flatten! requires.each do |requirement| requirement.version = @platform.version_munger(requirement.version, default: '<') if requirement.version end requires.uniq end |
#get_root_directories ⇒ Array
Gets the highest level directories declared by the project
549 550 551 552 553 554 555 556 557 558 559 560 |
# File 'lib/vanagon/project.rb', line 549 def get_root_directories # rubocop:disable Metrics/AbcSize dirs = get_directories.map { |dir| dir.path.split('/') } dirs.sort! { |dir1, dir2| dir1.length <=> dir2.length } ret_dirs = [] dirs.each do |dir| unless ret_dirs.include?(dir.first(dir.length - 1).join('/')) ret_dirs << dir.join('/') end end ret_dirs end |
#get_rpm_ghost_files ⇒ Array
Collects any rpm %ghost files supplied by components
257 258 259 260 261 |
# File 'lib/vanagon/project.rb', line 257 def get_rpm_ghost_files files = [] files.push components.flat_map(&:rpm_ghost_files) files.flatten.uniq end |
#get_service(name) ⇒ @component.service obj
Grabs a specific service based on which name is passed in note that if the name is wrong or there was no will return nil
355 356 357 358 359 360 361 362 |
# File 'lib/vanagon/project.rb', line 355 def get_service(name) components.each do |component| if component.name == name return component.service end end return nil end |
#get_services ⇒ Array
Get any services registered by components in the project
573 574 575 |
# File 'lib/vanagon/project.rb', line 573 def get_services components.flat_map(&:service).compact end |
#get_tarball_files ⇒ Array
Generate a list of all files and directories to be included in a tarball for the project
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 |
# File 'lib/vanagon/project.rb', line 589 def get_tarball_files # rubocop:disable Metrics/AbcSize # It is very important that 'file-list' remains the first element in this # array, lest the tar command be malformed and the package creation fail files = ['file-list'] if bill_of_materials files.push "#{bill_of_materials.path}/bill-of-materials" else files.push 'bill-of-materials' end files.push get_files.map(&:path) files.push get_configfiles.map(&:path) if @platform.is_windows? files.flatten.map { |f| "$(shell cygpath --mixed --long-name '#{f}')" } else files.flatten end end |
#get_trigger_scripts(pkg_state) ⇒ Hash
Collects the install trigger scripts for the project for the specified packing state
417 418 419 420 421 422 423 424 425 |
# File 'lib/vanagon/project.rb', line 417 def get_trigger_scripts(pkg_state) triggers = Hash.new { |hsh, key| hsh[key] = [] } check_pkg_state_string(pkg_state) pkgs = components.flat_map(&:install_triggers).compact.select { |s| s.pkg_state.include? pkg_state } pkgs.each do |package| triggers[package.pkg].push package.scripts end triggers end |
#get_upgrade_trigger_scripts(pkg) ⇒ Object
Grabs the upgrade trigger scripts for the specified pkg
438 439 440 441 |
# File 'lib/vanagon/project.rb', line 438 def get_upgrade_trigger_scripts(pkg) scripts = get_trigger_scripts("upgrade") return scripts[pkg].join("\n") end |
#has_configfiles? ⇒ Boolean
532 533 534 |
# File 'lib/vanagon/project.rb', line 532 def has_configfiles? !get_configfiles.empty? end |
#has_conflicts? ⇒ Boolean
344 345 346 |
# File 'lib/vanagon/project.rb', line 344 def has_conflicts? !get_conflicts.empty? end |
#has_provides? ⇒ Boolean
380 381 382 |
# File 'lib/vanagon/project.rb', line 380 def has_provides? !get_provides.empty? end |
#has_replaces? ⇒ Boolean
326 327 328 |
# File 'lib/vanagon/project.rb', line 326 def has_replaces? !get_replaces.empty? end |
#has_services? ⇒ True, False
Simple utility for determining if the components in the project declare any services
581 582 583 |
# File 'lib/vanagon/project.rb', line 581 def has_services? !get_services.empty? end |
#list_component_dependencies(component) ⇒ Array
Return a list of the build_dependencies that are satisfied by an internal component
649 650 651 |
# File 'lib/vanagon/project.rb', line 649 def list_component_dependencies(component) component.build_requires.select { |dep| components.map(&:name).include?(dep) } end |
#load_upstream_metadata(metadata_uri) ⇒ Object
849 850 851 852 853 854 855 856 857 858 859 860 |
# File 'lib/vanagon/project.rb', line 849 def () VanagonLogger.info "Loading metadata from #{}" case when /^http/ @upstream_metadata = JSON.parse(Net::HTTP.get(URI())) when /^file/ filename = .sub(/^file:\/\//, '') @upstream_metadata = JSON.parse(File.read(filename)) else raise Vanagon::Error, "Metadata URI must be 'file://' or 'http://', don't know how to parse #{}" end end |
#load_upstream_settings(upstream_project_name, upstream_git_url, upstream_git_branch) ⇒ Object
Load the settings hash from an upstream vanagon project. This will clone a git repo at a specified branch and load the specified vanagon project (with no components). The settings hash of the upstream project will be merged with the existing settings hash, overriding any duplicates at the time of calling with the value from upstream. To override settings from upstream, you need to set the ‘proj.setting` after `proj.inherit_settings`.
As the settings are not lazy-loaded, if you need to override a setting from upstream that is used in later settings, you’ll need to override all of the settings based on the one you’re overriding.
797 798 799 800 801 802 803 804 805 806 807 808 809 810 |
# File 'lib/vanagon/project.rb', line 797 def load_upstream_settings(upstream_project_name, upstream_git_url, upstream_git_branch) # rubocop:disable Metrics/AbcSize Dir.mktmpdir do |working_directory| upstream_source = Vanagon::Component::Source::Git.new(upstream_git_url, workdir: working_directory, ref: upstream_git_branch) upstream_source.fetch Dir.chdir(File.join(working_directory, upstream_source.dirname)) do upstream_platform = Vanagon::Platform.load_platform(platform.name, File.join(working_directory, upstream_source.dirname, "configs", "platforms")) upstream_project = Vanagon::Project.load_project(upstream_project_name, File.join(working_directory, upstream_source.dirname, "configs", "projects"), upstream_platform) @settings.merge!(upstream_project.settings) @upstream_metadata = upstream_project.build_manifest_json upstream_project.cleanup end end end |
#load_yaml_settings(settings_uri, settings_sha1_uri = nil) ⇒ Object
Load the settings hash for the current project/platform combination from a yaml file as produced by ‘publish_yaml_settings`. file:// and http:// URIs are accepted. If the URI uses http://, a sha1 URI is also required.
819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 |
# File 'lib/vanagon/project.rb', line 819 def load_yaml_settings(settings_uri, settings_sha1_uri = nil) # rubocop:disable Metrics/AbcSize source_type = Vanagon::Component::Source.determine_source_type(settings_uri) if %i[unknown git].include?(source_type) = "Can't inherit settings from '#{settings_uri}'. Only http and file URIs are valid." if settings_uri =~ /^file/ = "Tried to load YAML settings from '#{settings_uri}', but the file doesn't exist." end raise Vanagon::Error, end if (source_type == :http) && !settings_sha1_uri raise Vanagon::Error, "You must provide a sha1sum URI for the YAML file when inheriting YAML settings over http" end Dir.mktmpdir do |working_directory| source = Vanagon::Component::Source.source(settings_uri, workdir: working_directory, sum: settings_sha1_uri, sum_type: 'sha1') source.fetch source.verify yaml_path = source.file if source_type == :http yaml_path = File.join(working_directory, source.file) end @settings.merge!(YAML.safe_load(File.read(yaml_path), [Symbol])) end end |
#make_bill_of_materials(workdir) ⇒ String
Generates a bill-of-materials and writes the contents to the workdir for use in building the project
641 642 643 |
# File 'lib/vanagon/project.rb', line 641 def make_bill_of_materials(workdir) File.open(File.join(workdir, 'bill-of-materials'), 'w') { |f| f.puts(generate_bill_of_materials.join("\n")) } end |
#make_makefile(workdir) ⇒ String
Evaluates the makefile template and writes the contents to the workdir for use in building the project
632 633 634 |
# File 'lib/vanagon/project.rb', line 632 def make_makefile(workdir) erb_file(File.join(VANAGON_ROOT, "resources/Makefile.erb"), File.join(workdir, "Makefile")) end |
#merged_environment ⇒ Environment
Merge the platform’s Environment into the project’s Environment and return the result. This will produce the top-level Environment in the Makefile, that all components (and their Make targets) will inherit from.
193 194 195 |
# File 'lib/vanagon/project.rb', line 193 def merged_environment environment.merge(@platform.environment) end |
#metadata_merge(original, upstream) ⇒ Hash
Recursive merge of metadata hashes Input is not modified In case of duplicate keys, original value is kept
722 723 724 725 726 727 728 729 730 |
# File 'lib/vanagon/project.rb', line 722 def (original, upstream) upstream.merge(original) do |key, upstream_value, original_value| if original_value.is_a?(Hash) (original_value, upstream_value) else original_value end end end |
#pack_tarball_command ⇒ String
Method to generate the command to create a tarball of the project
620 621 622 623 624 625 |
# File 'lib/vanagon/project.rb', line 620 def pack_tarball_command tar_root = "#{@name}-#{@version}" ["mkdir -p '#{tar_root}'", %('#{@platform.tar}' -cf - -T "#{get_tarball_files.join('" "')}" | ( cd '#{tar_root}/'; '#{@platform.tar}' xfp -)), %('#{@platform.tar}' -cf - #{tar_root}/ | gzip -9c > #{tar_root}.tar.gz)].join("\n\t") end |
#package_name ⇒ String
Get the package name for the project on the current platform
656 657 658 |
# File 'lib/vanagon/project.rb', line 656 def package_name @platform.package_name(self) end |
#publish_yaml_settings(platform) ⇒ Object
Writes a yaml file at ‘output/<name>-<version>.<platform>.settings.yaml` containing settings used to build the current project on the platform provided (and a corresponding sha1sum file) if `yaml_settings` has been set in the project definition.
767 768 769 770 771 772 773 774 775 776 777 778 779 780 |
# File 'lib/vanagon/project.rb', line 767 def publish_yaml_settings(platform) # rubocop:disable Metrics/AbcSize return unless yaml_settings raise(Vanagon::Error, "You must specify a project version") unless version filename = "#{name}-#{version}.#{platform.name}.settings.yaml" filepath = File.(File.join('output', filename)) File.open(filepath, 'w') do |f| f.write(@settings.to_yaml) end sha1 = Digest::SHA1.file(filepath).hexdigest File.open("#{filepath}.sha1", 'w') { |f| f.puts(sha1) } end |
#respond_to_missing?(method_name, include_private = false) ⇒ Boolean
182 183 184 |
# File 'lib/vanagon/project.rb', line 182 def respond_to_missing?(method_name, include_private = false) @settings.key?(method_name) || super end |
#save_manifest_json(platform, additional_directories = nil) ⇒ Object
Writes a json file at ‘ext/build_metadata.<project>.<platform>.json` containing information about what went into a built artifact
738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 |
# File 'lib/vanagon/project.rb', line 738 def save_manifest_json(platform, additional_directories = nil) # rubocop:disable Metrics/AbcSize manifest = build_manifest_json = (manifest, @upstream_metadata) ext_directory = 'ext' FileUtils.mkdir_p ext_directory directories = [ext_directory, additional_directories].compact = "build_metadata.#{name}.#{platform.name}.json" directories.each do |directory| File.open(File.join(directory, ), 'w') do |f| f.write(JSON.pretty_generate()) end end ## VANAGON-132 Backwards compatibility: make a 'build_metadata.json' file # No need to propagate this backwards compatibility to the new additional # directories File.open(File.join(ext_directory, 'build_metadata.json'), 'w') do |f| f.write(JSON.pretty_generate()) end end |
#vendor_email_only ⇒ String
Parses the vendor for the project by taking only the email address field (e.g. ‘<[email protected]>`).
218 219 220 |
# File 'lib/vanagon/project.rb', line 218 def vendor_email_only return @vendor.match(VENDOR_REGEX)[2] end |
#vendor_name_only ⇒ String
Parses the vendor for the project by cutting off the email address field (e.g. ‘<[email protected]>`).
210 211 212 |
# File 'lib/vanagon/project.rb', line 210 def vendor_name_only return @vendor.match(VENDOR_REGEX)[1] end |