vanagon 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +81 -37
- data/bin/build +1 -1
- data/lib/makefile.rb +8 -58
- data/lib/vanagon/component.rb +22 -8
- data/lib/vanagon/component/dsl.rb +7 -7
- data/lib/vanagon/component/rules.rb +7 -3
- data/lib/vanagon/component/source/local.rb +1 -1
- data/lib/vanagon/driver.rb +9 -3
- data/lib/vanagon/environment.rb +40 -29
- data/lib/vanagon/optparse.rb +1 -1
- data/lib/vanagon/platform.rb +40 -0
- data/lib/vanagon/platform/deb.rb +10 -0
- data/lib/vanagon/platform/dsl.rb +10 -12
- data/lib/vanagon/platform/rpm.rb +9 -0
- data/lib/vanagon/project.rb +9 -2
- data/lib/vanagon/project/dsl.rb +30 -9
- data/resources/Makefile.erb +3 -4
- data/resources/deb/rules.erb +4 -0
- data/resources/rpm/project.spec.erb +12 -1
- data/resources/windows/nuget/project.nuspec.erb +2 -2
- data/spec/lib/makefile_spec.rb +5 -5
- data/spec/lib/vanagon/component/dsl_spec.rb +9 -2
- data/spec/lib/vanagon/component/rules_spec.rb +12 -8
- data/spec/lib/vanagon/component/source/git_spec.rb +1 -1
- data/spec/lib/vanagon/component_spec.rb +36 -8
- data/spec/lib/vanagon/driver_spec.rb +3 -3
- data/spec/lib/vanagon/environment_spec.rb +10 -23
- data/spec/lib/vanagon/project/dsl_spec.rb +83 -0
- metadata +16 -17
- data/resources/metrics/profiling_shell.sh +0 -45
@@ -22,7 +22,7 @@ class Vanagon
|
|
22
22
|
# @return [Makefile::Rule] The $1 rule
|
23
23
|
def self.rule(target, &block)
|
24
24
|
define_method("#{target}_rule") do
|
25
|
-
Makefile::Rule.new("#{component.name}-#{target}"
|
25
|
+
Makefile::Rule.new("#{component.name}-#{target}") do |rule|
|
26
26
|
instance_exec(rule, &block)
|
27
27
|
end
|
28
28
|
end
|
@@ -70,7 +70,7 @@ class Vanagon
|
|
70
70
|
#
|
71
71
|
# @return [Makefile::Rule]
|
72
72
|
def component_rule
|
73
|
-
Makefile::Rule.new(component.name
|
73
|
+
Makefile::Rule.new(component.name) do |rule|
|
74
74
|
rule.dependencies = ["#{component.name}-install"]
|
75
75
|
end
|
76
76
|
end
|
@@ -81,7 +81,7 @@ class Vanagon
|
|
81
81
|
# @see [Vanagon::Component::Source]
|
82
82
|
rule("unpack") do |r|
|
83
83
|
r.dependencies = ['file-list-before-build']
|
84
|
-
r.recipe << component.extract_with
|
84
|
+
r.recipe << andand_multiline(component.environment_variables, component.extract_with)
|
85
85
|
r.recipe << "touch #{r.target}"
|
86
86
|
end
|
87
87
|
|
@@ -109,6 +109,7 @@ class Vanagon
|
|
109
109
|
|
110
110
|
unless component.configure.empty?
|
111
111
|
r.recipe << andand_multiline(
|
112
|
+
component.environment_variables,
|
112
113
|
"cd #{component.get_build_dir}",
|
113
114
|
component.configure
|
114
115
|
)
|
@@ -122,6 +123,7 @@ class Vanagon
|
|
122
123
|
r.dependencies = ["#{component.name}-configure"]
|
123
124
|
unless component.build.empty?
|
124
125
|
r.recipe << andand_multiline(
|
126
|
+
component.environment_variables,
|
125
127
|
"cd #{component.get_build_dir}",
|
126
128
|
component.build
|
127
129
|
)
|
@@ -135,6 +137,7 @@ class Vanagon
|
|
135
137
|
r.dependencies = ["#{component.name}-build"]
|
136
138
|
unless component.check.empty? || project.settings[:skipcheck]
|
137
139
|
r.recipe << andand_multiline(
|
140
|
+
component.environment_variables,
|
138
141
|
"cd #{component.get_build_dir}",
|
139
142
|
component.check
|
140
143
|
)
|
@@ -148,6 +151,7 @@ class Vanagon
|
|
148
151
|
r.dependencies = ["#{component.name}-check"]
|
149
152
|
unless component.install.empty?
|
150
153
|
r.recipe << andand_multiline(
|
154
|
+
component.environment_variables,
|
151
155
|
"cd #{component.get_build_dir}",
|
152
156
|
component.install
|
153
157
|
)
|
@@ -108,7 +108,7 @@ class Vanagon
|
|
108
108
|
when "xz"
|
109
109
|
%(unxz "#{file}")
|
110
110
|
when "zip"
|
111
|
-
"unzip '#{file}' || 7za x -r -tzip -o'#{File.basename(file, '.zip')}' '#{file}'"
|
111
|
+
"unzip -d '#{File.basename(file, '.zip')}' '#{file}' || 7za x -r -tzip -o'#{File.basename(file, '.zip')}' '#{file}'"
|
112
112
|
else
|
113
113
|
raise Vanagon::Error, "Don't know how to decompress #{extension} archives"
|
114
114
|
end
|
data/lib/vanagon/driver.rb
CHANGED
@@ -31,7 +31,7 @@ class Vanagon
|
|
31
31
|
filter_out_components(only_build) if only_build
|
32
32
|
loginit('vanagon_hosts.log')
|
33
33
|
|
34
|
-
@remote_workdir = options[:
|
34
|
+
@remote_workdir = options[:"remote-workdir"]
|
35
35
|
|
36
36
|
load_engine(engine, @platform, target)
|
37
37
|
rescue LoadError => e
|
@@ -120,14 +120,18 @@ class Vanagon
|
|
120
120
|
puts "Target is #{@engine.target}"
|
121
121
|
retry_task { install_build_dependencies }
|
122
122
|
retry_task { @project.fetch_sources(@workdir) }
|
123
|
+
|
123
124
|
@project.make_makefile(@workdir)
|
124
125
|
@project.make_bill_of_materials(@workdir)
|
125
126
|
@project.generate_packaging_artifacts(@workdir)
|
126
127
|
@engine.ship_workdir(@workdir)
|
127
128
|
@engine.dispatch("(cd #{@engine.remote_workdir}; #{@platform.make})")
|
128
129
|
@engine.retrieve_built_artifact
|
129
|
-
|
130
|
-
|
130
|
+
|
131
|
+
unless @preserve
|
132
|
+
@engine.teardown
|
133
|
+
cleanup_workdir
|
134
|
+
end
|
131
135
|
rescue => e
|
132
136
|
puts e
|
133
137
|
puts e.backtrace.join("\n")
|
@@ -146,6 +150,8 @@ class Vanagon
|
|
146
150
|
|
147
151
|
puts "rendering Makefile"
|
148
152
|
retry_task { @project.fetch_sources(@workdir) }
|
153
|
+
@project.make_bill_of_materials(@workdir)
|
154
|
+
@project.generate_packaging_artifacts(@workdir)
|
149
155
|
@project.make_makefile(@workdir)
|
150
156
|
end
|
151
157
|
|
data/lib/vanagon/environment.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'forwardable'
|
2
|
+
require 'vanagon/extensions/string'
|
2
3
|
|
3
4
|
class Vanagon
|
4
5
|
# Environment is a validating wrapper around a delegated Hash,
|
@@ -46,22 +47,21 @@ class Vanagon
|
|
46
47
|
@data = {}
|
47
48
|
end
|
48
49
|
|
49
|
-
# Associates the value given by value with the key given by key. Keys
|
50
|
-
# be
|
51
|
-
# shell variable names:
|
50
|
+
# Associates the value given by value with the key given by key. Keys will
|
51
|
+
# be cast to Strings, and should conform to the Open Group's guidelines for
|
52
|
+
# portable shell variable names:
|
52
53
|
# Environment variable names used by the utilities in the Shell and
|
53
54
|
# Utilities volume of IEEE Std 1003.1-2001 consist solely of uppercase
|
54
55
|
# letters, digits, and the '_' (underscore) from the characters defined
|
55
56
|
# in Portable Character Set and do not begin with a digit.
|
56
57
|
#
|
57
|
-
# Values
|
58
|
+
# Values will be cast to Strings, and will be stored precisely as given,
|
58
59
|
# so any escaped characters, single or double quotes, or whitespace will be
|
59
60
|
# preserved exactly as passed during assignment.
|
60
61
|
#
|
61
62
|
# @param key [String]
|
62
63
|
# @param value [String, Integer]
|
63
|
-
# @raise [ArgumentError] if key
|
64
|
-
# String or an Integer
|
64
|
+
# @raise [ArgumentError] if key or value cannot be cast to a String
|
65
65
|
def []=(key, value)
|
66
66
|
@data.update({ validate_key(key) => validate_value(value) })
|
67
67
|
end
|
@@ -133,32 +133,49 @@ class Vanagon
|
|
133
133
|
end
|
134
134
|
alias to_string to_s
|
135
135
|
|
136
|
-
def
|
137
|
-
|
136
|
+
def sanitize_subshells(str)
|
137
|
+
pattern = %r{\$\$\((.*?)\)}
|
138
|
+
escaped_variables = str.scan(pattern).flatten
|
138
139
|
return str if escaped_variables.empty?
|
139
140
|
|
140
|
-
warning = [%(Value "#{str}" looks like it's escaping one or more
|
141
|
-
escaped_variables.each { |v| warning.push
|
141
|
+
warning = [%(Value "#{str}" looks like it's escaping one or more values for subshell interpolation.)]
|
142
|
+
escaped_variables.each { |v| warning.push %(\t"$$(#{v})" will be coerced to "$(shell #{v})") }
|
142
143
|
warning.push <<-eos.undent
|
143
|
-
All environment variables will be resolved by Make
|
144
|
-
be
|
144
|
+
All environment variables will now be resolved by Make before they're executed
|
145
|
+
by the shell. These variables will be mangled for you for now, but you should
|
146
|
+
update your project's parameters.
|
145
147
|
eos
|
146
148
|
|
147
149
|
warn warning.join("\n")
|
148
|
-
str.gsub(
|
150
|
+
str.gsub(pattern, '$(shell \1)')
|
149
151
|
end
|
150
|
-
private :
|
152
|
+
private :sanitize_subshells
|
151
153
|
|
152
|
-
|
154
|
+
def sanitize_variables(str)
|
155
|
+
pattern = %r{\$\$([\w]+)}
|
156
|
+
escaped_variables = str.scan(pattern).flatten
|
157
|
+
return str if escaped_variables.empty?
|
158
|
+
|
159
|
+
warning = [%(Value "#{str}" looks like it's escaping one or more shell variable names for shell interpolation.)]
|
160
|
+
escaped_variables.each { |v| warning.push %(\t"$$#{v}" will be coerced to "$(#{v})") }
|
161
|
+
warning.push <<-eos.undent
|
162
|
+
All environment variables will now be resolved by Make before they're executed
|
163
|
+
by the shell. These variables will be mangled for you for now, but you should
|
164
|
+
update your project's parameters.
|
165
|
+
eos
|
166
|
+
|
167
|
+
warn warning.join("\n")
|
168
|
+
str.gsub(pattern, '$(\1)')
|
169
|
+
end
|
170
|
+
private :sanitize_variables
|
171
|
+
|
172
|
+
# Cast key to a String, and validate that it does not contain invalid
|
153
173
|
# characters, and that it does not begin with a digit
|
154
|
-
# @param key [
|
174
|
+
# @param key [Object]
|
155
175
|
# @raise [ArgumentError] if key is not a String, if key contains invalid
|
156
176
|
# characters, or if key begins with a digit
|
157
177
|
def validate_key(str)
|
158
|
-
|
159
|
-
raise ArgumentError,
|
160
|
-
'environment variable Name must be a String'
|
161
|
-
end
|
178
|
+
str = str.to_s
|
162
179
|
|
163
180
|
if str[0] =~ /\d/
|
164
181
|
raise ArgumentError,
|
@@ -175,19 +192,13 @@ class Vanagon
|
|
175
192
|
end
|
176
193
|
private :validate_key
|
177
194
|
|
178
|
-
#
|
195
|
+
# Cast str to a String, and validate that the value
|
179
196
|
# of str cannot be split into more than a single String by #shellsplit.
|
180
|
-
# @param value [
|
181
|
-
# @raise [ArgumentError] if key is not a String or an Integer
|
197
|
+
# @param value [Object]
|
182
198
|
def validate_value(str)
|
183
|
-
unless str.is_a?(String) || str.is_a?(Integer)
|
184
|
-
raise ArgumentError,
|
185
|
-
'Value must be a String or an Integer'
|
186
|
-
end
|
187
|
-
|
188
199
|
# sanitize the value, which should look for any Shell escaped
|
189
200
|
# variable names inside of the value.
|
190
|
-
|
201
|
+
sanitize_variables(sanitize_subshells(str.to_s))
|
191
202
|
end
|
192
203
|
private :validate_value
|
193
204
|
end
|
data/lib/vanagon/optparse.rb
CHANGED
@@ -4,7 +4,7 @@ class Vanagon
|
|
4
4
|
class OptParse
|
5
5
|
FLAGS = {
|
6
6
|
:workdir => ['-w DIR', '--workdir DIR', "Working directory where build source should be put (defaults to a tmpdir)"],
|
7
|
-
:
|
7
|
+
:"remote-workdir" => ['-r DIR', '--remote-workdir DIR', "Working directory where build source should be put on the remote host (defaults to a tmpdir)"],
|
8
8
|
:configdir => ['-c', '--configdir DIR', 'Configs dir (defaults to $pwd/configs)'],
|
9
9
|
:target => ['-t HOST', '--target HOST', 'Configure a target machine for build and packaging (defaults to grabbing one from the pooler)'],
|
10
10
|
:engine => ['-e ENGINE', '--engine ENGINE', "A custom engine to use (defaults to the pooler) [base, local, docker, pooler currently supported]"],
|
data/lib/vanagon/platform.rb
CHANGED
@@ -72,6 +72,11 @@ class Vanagon
|
|
72
72
|
# cross-compiled or natively compiled.
|
73
73
|
attr_accessor :cross_compiled
|
74
74
|
|
75
|
+
# Stores a string, pointing at the shell that should be used
|
76
|
+
# if a user needs to change the path or name of the shell that
|
77
|
+
# Make will run build recipes in.
|
78
|
+
attr_accessor :shell
|
79
|
+
|
75
80
|
# A string, containing the script that will be executed on
|
76
81
|
# the remote build target to determine how many CPU cores
|
77
82
|
# are available on that platform. Vanagon will use that count
|
@@ -208,9 +213,15 @@ class Vanagon
|
|
208
213
|
@find ||= "find"
|
209
214
|
@sort ||= "sort"
|
210
215
|
@copy ||= "cp"
|
216
|
+
|
217
|
+
# Our first attempt at defining metadata about a platform
|
211
218
|
@cross_compiled ||= false
|
212
219
|
end
|
213
220
|
|
221
|
+
def shell
|
222
|
+
@shell ||= "/bin/bash"
|
223
|
+
end
|
224
|
+
|
214
225
|
# This allows instance variables to be accessed using the hash lookup syntax
|
215
226
|
def [](key)
|
216
227
|
if instance_variable_get("@#{key}")
|
@@ -389,5 +400,34 @@ class Vanagon
|
|
389
400
|
def is_cross_compiled_linux?
|
390
401
|
return (is_cross_compiled? && is_linux?)
|
391
402
|
end
|
403
|
+
|
404
|
+
# Pass in a packaging override. This needs to be implemented for each
|
405
|
+
# individual platform so that this input ends up in the right place.
|
406
|
+
#
|
407
|
+
# @param project
|
408
|
+
# @param var the string that should be added to the build script.
|
409
|
+
def package_override(project, var)
|
410
|
+
fail "I don't know how to set package overrides for #{name}, teach me?"
|
411
|
+
end
|
412
|
+
|
413
|
+
# Generic adder for build repositories
|
414
|
+
#
|
415
|
+
# @param *args [Array<String>] List of arguments to pass on to the platform specific method
|
416
|
+
# @raise [Vanagon::Error] an arror is raised if the current platform does not define add_repository
|
417
|
+
def add_build_repository(*args)
|
418
|
+
if self.respond_to?(:add_repository)
|
419
|
+
self.provision_with self.send(:add_repository, *args)
|
420
|
+
else
|
421
|
+
raise Vanagon::Error, "Adding a build repository not defined for #{name}"
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
# Set the command to turn the target machine into a builder for vanagon
|
426
|
+
#
|
427
|
+
# @param command [String] Command to enable the target machine to build packages for the platform
|
428
|
+
def provision_with(command)
|
429
|
+
provisioning << command
|
430
|
+
provisioning.flatten!
|
431
|
+
end
|
392
432
|
end
|
393
433
|
end
|
data/lib/vanagon/platform/deb.rb
CHANGED
@@ -102,6 +102,16 @@ class Vanagon
|
|
102
102
|
provisioning << "apt-get -qq update"
|
103
103
|
end
|
104
104
|
|
105
|
+
|
106
|
+
# Pass in a packaging override. This will get added to the rules file, and
|
107
|
+
# is a good way to pass in arbitrary environment variables
|
108
|
+
#
|
109
|
+
# @param project
|
110
|
+
# @param var the string that should be added to the build script.
|
111
|
+
def package_override(project, var)
|
112
|
+
project.package_overrides << var
|
113
|
+
end
|
114
|
+
|
105
115
|
# Constructor. Sets up some defaults for the debian platform and calls the parent constructor
|
106
116
|
#
|
107
117
|
# @param name [String] name of the platform
|
data/lib/vanagon/platform/dsl.rb
CHANGED
@@ -26,7 +26,7 @@ class Vanagon
|
|
26
26
|
#
|
27
27
|
# @param name [String] name of the platform
|
28
28
|
# @param block [Proc] DSL definition of the platform to call
|
29
|
-
def platform(platform_name, &block)
|
29
|
+
def platform(platform_name, &block)
|
30
30
|
@platform = case platform_name
|
31
31
|
when /^aix-/
|
32
32
|
Vanagon::Platform::RPM::AIX.new(@name)
|
@@ -51,7 +51,6 @@ class Vanagon
|
|
51
51
|
end
|
52
52
|
|
53
53
|
yield(self)
|
54
|
-
environment 'VANAGON_PLATFORM', platform_name.tr('-', '.')
|
55
54
|
@platform
|
56
55
|
end
|
57
56
|
|
@@ -98,6 +97,13 @@ class Vanagon
|
|
98
97
|
@platform.make = make_cmd
|
99
98
|
end
|
100
99
|
|
100
|
+
# Set the path for Make's SHELL for the platform
|
101
|
+
#
|
102
|
+
# @param shell_path [String] Full path to the shell Make should use
|
103
|
+
def shell(shell_path)
|
104
|
+
@platform.shell = shell_path
|
105
|
+
end
|
106
|
+
|
101
107
|
# Set the path to tar for the platform
|
102
108
|
#
|
103
109
|
# @param tar [String] Full path to the tar command for the platform
|
@@ -138,7 +144,6 @@ class Vanagon
|
|
138
144
|
# @param xcc [Boolean] True if this is a cross-compiled platform
|
139
145
|
def cross_compiled(xcc_flag)
|
140
146
|
@platform.cross_compiled = !!xcc_flag
|
141
|
-
environment 'VANAGON_PLATFORM_XCC', @platform.cross_compiled.to_s
|
142
147
|
end
|
143
148
|
|
144
149
|
# define an explicit Dist for the platform (most likely used for RPM platforms)
|
@@ -179,8 +184,7 @@ class Vanagon
|
|
179
184
|
#
|
180
185
|
# @param command [String] Command to enable the target machine to build packages for the platform
|
181
186
|
def provision_with(command)
|
182
|
-
@platform.
|
183
|
-
@platform.provisioning.flatten!
|
187
|
+
@platform.provision_with(command)
|
184
188
|
end
|
185
189
|
|
186
190
|
# Set the command to install any needed build dependencies for the target machine
|
@@ -316,7 +320,6 @@ class Vanagon
|
|
316
320
|
# @param user[String] a user string to login with.
|
317
321
|
def target_user(user = "root")
|
318
322
|
@platform.target_user = user
|
319
|
-
environment 'VANAGON_PLATFORM_USER', user
|
320
323
|
end
|
321
324
|
|
322
325
|
# Set the target ip address or hostname to start build
|
@@ -339,7 +342,6 @@ class Vanagon
|
|
339
342
|
# @param codename [String] codename for this platform (squeeze for example)
|
340
343
|
def codename(codename)
|
341
344
|
@platform.codename = codename
|
342
|
-
environment 'VANAGON_PLATFORM_CODENAME', codename
|
343
345
|
end
|
344
346
|
|
345
347
|
def output_dir(directory)
|
@@ -379,11 +381,7 @@ class Vanagon
|
|
379
381
|
# @param *args [Array<String>] List of arguments to pass on to the platform specific method
|
380
382
|
# @raise [Vanagon::Error] an arror is raised if the current platform does not define add_repository
|
381
383
|
def add_build_repository(*args)
|
382
|
-
|
383
|
-
self.provision_with @platform.send(:add_repository, *args)
|
384
|
-
else
|
385
|
-
raise Vanagon::Error, "Adding a build repository not defined for #{@platform.name}"
|
386
|
-
end
|
384
|
+
@platform.add_build_repository(*args)
|
387
385
|
end
|
388
386
|
end
|
389
387
|
end
|
data/lib/vanagon/platform/rpm.rb
CHANGED
@@ -69,6 +69,15 @@ class Vanagon
|
|
69
69
|
commands
|
70
70
|
end
|
71
71
|
|
72
|
+
# Pass in a packaging override. This will get added to the spec file, and
|
73
|
+
# is a good way to pass in arbitrary `%_define` or `%_global`
|
74
|
+
#
|
75
|
+
# @param project
|
76
|
+
# @param var the string that should be added to the build script.
|
77
|
+
def package_override(project, var)
|
78
|
+
project.package_overrides << var
|
79
|
+
end
|
80
|
+
|
72
81
|
# Constructor. Sets up some defaults for the rpm platform and calls the parent constructor
|
73
82
|
#
|
74
83
|
# @param name [String] name of the platform
|
data/lib/vanagon/project.rb
CHANGED
@@ -73,6 +73,13 @@ class Vanagon
|
|
73
73
|
# project should pass to each platform
|
74
74
|
attr_accessor :environment
|
75
75
|
|
76
|
+
# Extra vars to be set in the spec file or debian rules.
|
77
|
+
# Good for setting extra %define or %global things for RPM, or env
|
78
|
+
# variables needed in the debian rules file
|
79
|
+
# No extra munging will be performed, so these should be set as you want
|
80
|
+
# them to appear in your spec/rules files!
|
81
|
+
attr_accessor :package_overrides
|
82
|
+
|
76
83
|
# Loads a given project from the configdir
|
77
84
|
#
|
78
85
|
# @param name [String] the name of the project
|
@@ -114,6 +121,7 @@ class Vanagon
|
|
114
121
|
@replaces = []
|
115
122
|
@provides = []
|
116
123
|
@conflicts = []
|
124
|
+
@package_overrides = []
|
117
125
|
end
|
118
126
|
|
119
127
|
# Magic getter to retrieve settings in the project
|
@@ -393,7 +401,7 @@ class Vanagon
|
|
393
401
|
files.push get_files.map(&:path)
|
394
402
|
files.push get_configfiles.map(&:path)
|
395
403
|
if @platform.is_windows?
|
396
|
-
files.flatten.map { |f| "
|
404
|
+
files.flatten.map { |f| "$(shell cygpath --mixed --long-name '#{f}')" }
|
397
405
|
else
|
398
406
|
files.flatten
|
399
407
|
end
|
@@ -462,7 +470,6 @@ class Vanagon
|
|
462
470
|
#
|
463
471
|
# @param workdir [String] workdir to put the packaging files into
|
464
472
|
def generate_packaging_artifacts(workdir)
|
465
|
-
FileUtils.install File.join(VANAGON_ROOT, "resources", "metrics", "profiling_shell.sh"), File.join(workdir, "profiling_shell.sh"), :mode => 0775
|
466
473
|
@platform.generate_packaging_artifacts(workdir, @name, binding)
|
467
474
|
end
|
468
475
|
end
|
data/lib/vanagon/project/dsl.rb
CHANGED
@@ -24,7 +24,6 @@ class Vanagon
|
|
24
24
|
# @param block [Proc] DSL definition of the project to call
|
25
25
|
def project(name, &block)
|
26
26
|
yield(self)
|
27
|
-
environment 'VANAGON_PROJECT', @name
|
28
27
|
end
|
29
28
|
|
30
29
|
# Accessor for the project.
|
@@ -70,6 +69,10 @@ class Vanagon
|
|
70
69
|
@project.settings[name] = value
|
71
70
|
end
|
72
71
|
|
72
|
+
def settings
|
73
|
+
@project.settings
|
74
|
+
end
|
75
|
+
|
73
76
|
# Sets the description of the project. Mainly for use in packaging.
|
74
77
|
#
|
75
78
|
# @param descr [String] description of the project
|
@@ -82,9 +85,6 @@ class Vanagon
|
|
82
85
|
# @param the_name [String] name of the project
|
83
86
|
def name(the_name)
|
84
87
|
@project.name = the_name
|
85
|
-
# Overwrite the environment variable name using the reset name
|
86
|
-
# of the project.
|
87
|
-
environment 'VANAGON_PROJECT_NAME', @project.name
|
88
88
|
end
|
89
89
|
|
90
90
|
# Sets the homepage for the project. Mainly for use in packaging.
|
@@ -99,7 +99,6 @@ class Vanagon
|
|
99
99
|
# @param page [Integer] timeout in seconds
|
100
100
|
def timeout(to)
|
101
101
|
@project.timeout = to
|
102
|
-
environment 'VANAGON_PROJECT_TIMEOUT', @project.timeout
|
103
102
|
end
|
104
103
|
|
105
104
|
# Sets the run time requirements for the project. Mainly for use in packaging.
|
@@ -140,7 +139,6 @@ class Vanagon
|
|
140
139
|
# @param ver [String] version of the project
|
141
140
|
def version(ver)
|
142
141
|
@project.version = ver.tr('-', '.')
|
143
|
-
environment 'VANAGON_PROJECT_VERSION', @project.version
|
144
142
|
end
|
145
143
|
|
146
144
|
# Sets the release for the project. Mainly for use in packaging.
|
@@ -148,7 +146,6 @@ class Vanagon
|
|
148
146
|
# @param rel [String] release of the project
|
149
147
|
def release(rel)
|
150
148
|
@project.release = rel
|
151
|
-
environment 'VANAGON_PROJECT_RELEASE', @project.release
|
152
149
|
end
|
153
150
|
|
154
151
|
# Sets the version for the project based on a git describe of the
|
@@ -162,12 +159,28 @@ class Vanagon
|
|
162
159
|
warn "Directory '#{dirname}' cannot be versioned by git. Maybe it hasn't been tagged yet?"
|
163
160
|
end
|
164
161
|
|
162
|
+
# Get the version string from a git branch name. This will look for a '.'
|
163
|
+
# delimited string of numbers of any length and return that as the version.
|
164
|
+
# For example, 'maint/1.7.0/fixing-some-bugs' will return '1.7.0' and '4.8.x'
|
165
|
+
# will return '4.8'.
|
166
|
+
#
|
167
|
+
# @return version string parsed from branch name, fails if unable to find version
|
168
|
+
def version_from_branch
|
169
|
+
branch = Git.open(File.expand_path("..", Vanagon::Driver.configdir)).current_branch
|
170
|
+
if branch =~ /(\d+(\.\d+)+)/
|
171
|
+
return $1
|
172
|
+
else
|
173
|
+
fail "Can't find a version in your branch, make sure it matches <number>.<number>, like maint/1.7.0/fixing-some-bugs"
|
174
|
+
end
|
175
|
+
rescue Git::GitExecuteError => e
|
176
|
+
fail "Something went wrong trying to find your git branch.\n#{e}"
|
177
|
+
end
|
178
|
+
|
165
179
|
# Sets the vendor for the project. Used in packaging artifacts.
|
166
180
|
#
|
167
181
|
# @param vend [String] vendor or author of the project
|
168
182
|
def vendor(vend)
|
169
183
|
@project.vendor = vend
|
170
|
-
environment 'VANAGON_PROJECT_VENDOR', @project.vendor
|
171
184
|
end
|
172
185
|
|
173
186
|
# Adds a directory to the list of directories provided by the project, to be included in any packages of the project
|
@@ -262,7 +275,15 @@ class Vanagon
|
|
262
275
|
# Counter for the number of times a project should retry a task
|
263
276
|
def retry_count(retry_count)
|
264
277
|
@project.retry_count = retry_count
|
265
|
-
|
278
|
+
end
|
279
|
+
|
280
|
+
# Set a package override. Will call the platform-specific implementation
|
281
|
+
# This will get set in the spec file, deb rules, etc.
|
282
|
+
#
|
283
|
+
# @param var the string to be included in the build script
|
284
|
+
def package_override(var)
|
285
|
+
platform = @project.platform
|
286
|
+
platform.package_override(self._project, var)
|
266
287
|
end
|
267
288
|
end
|
268
289
|
end
|