Class: Vanagon::Project::DSL
- Inherits:
-
Object
- Object
- Vanagon::Project::DSL
- Defined in:
- lib/vanagon/project/dsl.rb
Instance Method Summary collapse
-
#_project ⇒ Vanagon::Project
Accessor for the project.
-
#bill_of_materials(target) ⇒ Object
This method will write the project’s bill-of-materials to a designated directory during package creation.
-
#cleanup_during_build ⇒ Object
Toggle to apply additional cleanup during the build for space constrained systems.
-
#component(name) ⇒ Object
Adds a component to the project.
-
#conflicts(pkgname, version = nil) ⇒ Object
Indicates that this component conflicts with another package, so both cannot be installed at the same time.
-
#description(descr) ⇒ Object
Sets the description of the project.
-
#directory(dir, mode: nil, owner: nil, group: nil) ⇒ Object
Adds a directory to the list of directories provided by the project, to be included in any packages of the project.
-
#environment(name, value) ⇒ Object
Adds an arbitrary environment variable to the project, which will be passed on to the platform and inherited by any components built on that platform.
-
#extra_file_to_sign(file) ⇒ Object
Set to sign additional files during buildtime.
-
#fetch_artifact(path) ⇒ Object
Set additional artifacts to fetch from the build.
-
#generate_archives(archive) ⇒ Object
Output os-specific archives containing the binary output.
-
#generate_packages(pkg) ⇒ Object
Generate os-specific packaging artifacts (rpm, deb, etc).
-
#generate_source_artifacts(source_artifacts) ⇒ Object
Generate source packages in addition to binary packages.
-
#homepage(page) ⇒ Object
Sets the homepage for the project.
-
#identifier(ident) ⇒ Object
Sets the identifier for the project.
-
#inherit_settings(upstream_project_name, upstream_git_url, upstream_git_branch) ⇒ Object
Inherit the settings hash from an upstream project.
-
#inherit_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri = nil, metadata_uri: nil) ⇒ Object
Inherit the settings hash for the current project and platform from a yaml file as generated by ‘publish_yaml_settings`.
-
#initialize(name, configdir, platform, include_components = []) ⇒ Vanagon::Project::DSL
constructor
Constructor for the DSL object.
-
#license(lic) ⇒ Object
Sets the license for the project.
-
#method_missing(method_name, *args) ⇒ Object
Project attributes and DSL methods defined below.
-
#name(the_name) ⇒ Object
Resets the name of the project.
-
#no_packaging(var) ⇒ Object
Set to true to skip packaging steps during the vanagon build.
-
#noarch ⇒ Object
Sets the project to be architecture independent, or noarch.
-
#package_override(var) ⇒ Object
Set a package override.
-
#project(name, &block) {|_self| ... } ⇒ Object
Primary way of interacting with the DSL.
-
#provides(provide, version = nil) ⇒ Object
Indicates that this component provides a system level package.
-
#publish_yaml_settings ⇒ Object
This method will write the project’s settings (per-platform) to the output directory as yaml after building.
-
#register_rewrite_rule(protocol, rule) ⇒ Object
Sets up a rewrite rule for component sources for a given protocol.
-
#release(rel) ⇒ Object
Sets the release for the project.
-
#release_from_git ⇒ Object
Sets the release for the project to the number of commits since the last tag.
-
#replaces(replacement, version = nil) ⇒ Object
Indicates that this component replaces a system level package.
-
#requires(requirement, version = nil) ⇒ Object
Sets the run time requirements for the project.
- #respond_to_missing?(method_name, include_private = false) ⇒ Boolean
-
#retry_count(retry_count) ⇒ Object
Counter for the number of times a project should retry a task.
-
#setting(name, value) ⇒ Object
Sets a key value pair on the settings hash of the project.
- #settings ⇒ Object
-
#signing_command(command) ⇒ Object
The command to run to sign additional files.
-
#signing_hostname(hostname) ⇒ Object
The hostname to sign additional files on.
-
#signing_username(username) ⇒ Object
The username to log in to the signing_hostname as.
-
#target_repo(repo) ⇒ Object
Adds a target repo for the project.
-
#timeout(to) ⇒ Object
Sets the timeout for the project retry logic.
-
#user(name, group: nil, shell: nil, is_system: false, homedir: nil) ⇒ Object
Add a user to the project.
-
#vendor(vend) ⇒ Object
Sets the vendor for the project.
-
#version(ver) ⇒ Object
Sets the version for the project.
-
#version_from_branch ⇒ Object
Get the version string from a git branch name.
-
#version_from_git ⇒ Object
Sets the version for the project based on a git describe of the directory that holds the configs.
-
#write_version_file(target) ⇒ Object
This method will write the project’s version to a designated file during package creation.
Constructor Details
#initialize(name, configdir, platform, include_components = []) ⇒ Vanagon::Project::DSL
Constructor for the DSL object
20 21 22 23 24 25 |
# File 'lib/vanagon/project/dsl.rb', line 20 def initialize(name, configdir, platform, include_components = []) @name = name @project = Vanagon::Project.new(@name, platform) @include_components = include_components.to_set @configdir = configdir end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args) ⇒ Object
Project attributes and DSL methods defined below
All purpose getter. This object, which is passed to the project block, won’t have easy access to the attributes of the @project, so we make a getter for each attribute.
We only magically handle get_ methods, any other methods just get the standard method_missing treatment.
53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/vanagon/project/dsl.rb', line 53 def method_missing(method_name, *args) attribute_match = method_name.to_s.match(/get_(.*)/) if attribute_match attribute = attribute_match.captures.first @project.send(attribute) elsif @project.settings.key?(method_name) return @project.settings[method_name] else super end end |
Instance Method Details
#_project ⇒ Vanagon::Project
Accessor for the project.
38 39 40 |
# File 'lib/vanagon/project/dsl.rb', line 38 def _project @project end |
#bill_of_materials(target) ⇒ Object
This method will write the project’s bill-of-materials to a designated directory during package creation.
317 318 319 |
# File 'lib/vanagon/project/dsl.rb', line 317 def bill_of_materials(target) @project.bill_of_materials = Vanagon::Common::Pathname.new(target) end |
#cleanup_during_build ⇒ Object
Toggle to apply additional cleanup during the build for space constrained systems
300 301 302 |
# File 'lib/vanagon/project/dsl.rb', line 300 def cleanup_during_build @project.cleanup = true end |
#component(name) ⇒ Object
Adds a component to the project
271 272 273 274 275 276 277 |
# File 'lib/vanagon/project/dsl.rb', line 271 def component(name) VanagonLogger.info "Loading #{name}" if @project.settings[:verbose] if @include_components.empty? or @include_components.include?(name) component = Vanagon::Component.load_component(name, File.join(@configdir, "components"), @project.settings, @project.platform) @project.components << component end end |
#conflicts(pkgname, version = nil) ⇒ Object
Indicates that this component conflicts with another package, so both cannot be installed at the same time. Conflicts can be collected and used by the project and package.
139 140 141 |
# File 'lib/vanagon/project/dsl.rb', line 139 def conflicts(pkgname, version = nil) @project.conflicts << OpenStruct.new(:pkgname => pkgname, :version => version) end |
#description(descr) ⇒ Object
Sets the description of the project. Mainly for use in packaging.
85 86 87 |
# File 'lib/vanagon/project/dsl.rb', line 85 def description(descr) @project.description = descr end |
#directory(dir, mode: nil, owner: nil, group: nil) ⇒ Object
Adds a directory to the list of directories provided by the project, to be included in any packages of the project
233 234 235 |
# File 'lib/vanagon/project/dsl.rb', line 233 def directory(dir, mode: nil, owner: nil, group: nil) @project.directories << Vanagon::Common::Pathname.new(dir, mode: mode, owner: owner, group: group) end |
#environment(name, value) ⇒ Object
Adds an arbitrary environment variable to the project, which will be passed on to the platform and inherited by any components built on that platform
239 240 241 |
# File 'lib/vanagon/project/dsl.rb', line 239 def environment(name, value) @project.environment[name] = value end |
#extra_file_to_sign(file) ⇒ Object
Set to sign additional files during buildtime. Only implemented for windows. Can be specified more than once
372 373 374 |
# File 'lib/vanagon/project/dsl.rb', line 372 def extra_file_to_sign(file) @project.extra_files_to_sign << file end |
#fetch_artifact(path) ⇒ Object
Set additional artifacts to fetch from the build
357 358 359 |
# File 'lib/vanagon/project/dsl.rb', line 357 def fetch_artifact(path) @project.artifacts_to_fetch << path end |
#generate_archives(archive) ⇒ Object
Output os-specific archives containing the binary output
176 177 178 |
# File 'lib/vanagon/project/dsl.rb', line 176 def generate_archives(archive) @project.compiled_archive = archive end |
#generate_packages(pkg) ⇒ Object
Generate os-specific packaging artifacts (rpm, deb, etc)
169 170 171 |
# File 'lib/vanagon/project/dsl.rb', line 169 def generate_packages(pkg) @project.generate_packages = pkg end |
#generate_source_artifacts(source_artifacts) ⇒ Object
Generate source packages in addition to binary packages. Currently only implemented for rpm/deb packages.
162 163 164 |
# File 'lib/vanagon/project/dsl.rb', line 162 def generate_source_artifacts(source_artifacts) @project.source_artifacts = source_artifacts end |
#homepage(page) ⇒ Object
Sets the homepage for the project. Mainly for use in packaging.
99 100 101 |
# File 'lib/vanagon/project/dsl.rb', line 99 def homepage(page) @project.homepage = page end |
#identifier(ident) ⇒ Object
Sets the identifier for the project. Mainly for use in OSX packaging.
264 265 266 |
# File 'lib/vanagon/project/dsl.rb', line 264 def identifier(ident) @project.identifier = ident end |
#inherit_settings(upstream_project_name, upstream_git_url, upstream_git_branch) ⇒ Object
Inherit the settings hash from an upstream project
331 332 333 |
# File 'lib/vanagon/project/dsl.rb', line 331 def inherit_settings(upstream_project_name, upstream_git_url, upstream_git_branch) @project.load_upstream_settings(upstream_project_name, upstream_git_url, upstream_git_branch) end |
#inherit_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri = nil, metadata_uri: nil) ⇒ Object
Inherit the settings hash for the current project and platform from a yaml file as generated by ‘publish_yaml_settings`
340 341 342 343 |
# File 'lib/vanagon/project/dsl.rb', line 340 def inherit_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri = nil, metadata_uri: nil) @project.load_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri) @project.() if end |
#license(lic) ⇒ Object
Sets the license for the project. Mainly for use in packaging.
257 258 259 |
# File 'lib/vanagon/project/dsl.rb', line 257 def license(lic) @project.license = lic end |
#name(the_name) ⇒ Object
Resets the name of the project. Is useful for dynamically changing the project name.
92 93 94 |
# File 'lib/vanagon/project/dsl.rb', line 92 def name(the_name) @project.name = the_name end |
#no_packaging(var) ⇒ Object
Set to true to skip packaging steps during the vanagon build
364 365 366 |
# File 'lib/vanagon/project/dsl.rb', line 364 def no_packaging(var) @project.no_packaging = var end |
#noarch ⇒ Object
Sets the project to be architecture independent, or noarch
287 288 289 |
# File 'lib/vanagon/project/dsl.rb', line 287 def noarch @project.noarch = true end |
#package_override(var) ⇒ Object
Set a package override. Will call the platform-specific implementation This will get set in the spec file, deb rules, etc.
349 350 351 352 |
# File 'lib/vanagon/project/dsl.rb', line 349 def package_override(var) platform = @project.platform platform.package_override(self._project, var) end |
#project(name, &block) {|_self| ... } ⇒ Object
Primary way of interacting with the DSL
31 32 33 |
# File 'lib/vanagon/project/dsl.rb', line 31 def project(name, &block) yield(self) end |
#provides(provide, version = nil) ⇒ Object
Indicates that this component provides a system level package. Provides can be collected and used by the project and package.
129 130 131 |
# File 'lib/vanagon/project/dsl.rb', line 129 def provides(provide, version = nil) @project.provides << OpenStruct.new(:provide => provide, :version => version) end |
#publish_yaml_settings ⇒ Object
This method will write the project’s settings (per-platform) to the output directory as yaml after building
311 312 313 |
# File 'lib/vanagon/project/dsl.rb', line 311 def publish_yaml_settings @project.yaml_settings = true end |
#register_rewrite_rule(protocol, rule) ⇒ Object
Sets up a rewrite rule for component sources for a given protocol
295 296 297 |
# File 'lib/vanagon/project/dsl.rb', line 295 def register_rewrite_rule(protocol, rule) Vanagon::Component::Source::Rewrite.register_rewrite_rule(protocol, rule) end |
#release(rel) ⇒ Object
Sets the release for the project. Mainly for use in packaging.
153 154 155 |
# File 'lib/vanagon/project/dsl.rb', line 153 def release(rel) @project.release = rel end |
#release_from_git ⇒ Object
Sets the release for the project to the number of commits since the last tag. Requires that a git tag be present and reachable from the current commit in that repository.
184 185 186 187 188 189 190 |
# File 'lib/vanagon/project/dsl.rb', line 184 def release_from_git repo_object = Git.open(File.("..", @configdir)) last_tag = repo_object.describe('HEAD', { :abbrev => 0 }) release(repo_object.rev_list("#{last_tag}..HEAD", { :count => true })) rescue Git::GitExecuteError VanagonLogger.error "Directory '#{File.('..', @configdir)}' cannot be versioned by git. Maybe it hasn't been tagged yet?" end |
#replaces(replacement, version = nil) ⇒ Object
Indicates that this component replaces a system level package. Replaces can be collected and used by the project and package.
121 122 123 |
# File 'lib/vanagon/project/dsl.rb', line 121 def replaces(replacement, version = nil) @project.replaces << OpenStruct.new(:replacement => replacement, :version => version) end |
#requires(requirement, version = nil) ⇒ Object
Sets the run time requirements for the project. Mainly for use in packaging.
113 114 115 |
# File 'lib/vanagon/project/dsl.rb', line 113 def requires(requirement, version = nil) @project.requires << OpenStruct.new(:requirement => requirement, :version => version) end |
#respond_to_missing?(method_name, include_private = false) ⇒ Boolean
65 66 67 |
# File 'lib/vanagon/project/dsl.rb', line 65 def respond_to_missing?(method_name, include_private = false) method_name.to_s.start_with?('get_') || @project.settings.key?(method_name) || super end |
#retry_count(retry_count) ⇒ Object
Counter for the number of times a project should retry a task
322 323 324 |
# File 'lib/vanagon/project/dsl.rb', line 322 def retry_count(retry_count) @project.retry_count = retry_count end |
#setting(name, value) ⇒ Object
Sets a key value pair on the settings hash of the project
74 75 76 |
# File 'lib/vanagon/project/dsl.rb', line 74 def setting(name, value) @project.settings[name] = value end |
#settings ⇒ Object
78 79 80 |
# File 'lib/vanagon/project/dsl.rb', line 78 def settings @project.settings end |
#signing_command(command) ⇒ Object
The command to run to sign additional files. The command should assume it will have the file path appended to the end of the command, since files end up in a temp directory.
397 398 399 |
# File 'lib/vanagon/project/dsl.rb', line 397 def signing_command(command) @project.signing_command = command end |
#signing_hostname(hostname) ⇒ Object
The hostname to sign additional files on. Only does anything when there are extra files to sign
380 381 382 |
# File 'lib/vanagon/project/dsl.rb', line 380 def signing_hostname(hostname) @project.signing_hostname = hostname end |
#signing_username(username) ⇒ Object
The username to log in to the signing_hostname as. Only does anything when there are extra files to sign
388 389 390 |
# File 'lib/vanagon/project/dsl.rb', line 388 def signing_username(username) @project.signing_username = username end |
#target_repo(repo) ⇒ Object
Adds a target repo for the project
282 283 284 |
# File 'lib/vanagon/project/dsl.rb', line 282 def target_repo(repo) @project.repo = repo end |
#timeout(to) ⇒ Object
Sets the timeout for the project retry logic
106 107 108 |
# File 'lib/vanagon/project/dsl.rb', line 106 def timeout(to) @project.timeout = to end |
#user(name, group: nil, shell: nil, is_system: false, homedir: nil) ⇒ Object
Add a user to the project
250 251 252 |
# File 'lib/vanagon/project/dsl.rb', line 250 def user(name, group: nil, shell: nil, is_system: false, homedir: nil) @project.user = Vanagon::Common::User.new(name, group, shell, is_system, homedir) end |
#vendor(vend) ⇒ Object
Sets the vendor for the project. Used in packaging artifacts.
223 224 225 |
# File 'lib/vanagon/project/dsl.rb', line 223 def vendor(vend) @project.vendor = vend end |
#version(ver) ⇒ Object
Sets the version for the project. Mainly for use in packaging.
146 147 148 |
# File 'lib/vanagon/project/dsl.rb', line 146 def version(ver) @project.version = ver.tr('-', '.') end |
#version_from_branch ⇒ Object
Get the version string from a git branch name. This will look for a ‘.’ delimited string of numbers of any length and return that as the version. For example, ‘maint/1.7.0/fixing-some-bugs’ will return ‘1.7.0’ and ‘4.8.x’ will return ‘4.8’.
209 210 211 212 213 214 215 216 217 218 |
# File 'lib/vanagon/project/dsl.rb', line 209 def version_from_branch branch = Git.open(File.("..", @configdir)).current_branch if branch =~ /(\d+(\.\d+)+)/ return $1 else fail "Can't find a version in your branch, make sure it matches <number>.<number>, like maint/1.7.0/fixing-some-bugs" end rescue Git::GitExecuteError => e fail "Something went wrong trying to find your git branch.\n#{e}" end |
#version_from_git ⇒ Object
Sets the version for the project based on a git describe of the directory that holds the configs. Requires that a git tag be present and reachable from the current commit in that repository.
196 197 198 199 200 201 |
# File 'lib/vanagon/project/dsl.rb', line 196 def version_from_git git_version = Git.open(File.("..", @configdir)).describe('HEAD', tags: true) version(git_version.split('-').reject(&:empty?).join('.')) rescue Git::GitExecuteError VanagonLogger.error "Directory '#{File.('..', @configdir)}' cannot be versioned by git. Maybe it hasn't been tagged yet?" end |