omnibus 1.3.0 → 2.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +4 -1
- data/.rubocop.yml +30 -0
- data/.travis.yml +14 -3
- data/CHANGELOG.md +72 -49
- data/Gemfile +8 -5
- data/NOTICE +2 -2
- data/README.md +65 -7
- data/Rakefile +12 -3
- data/bin/makeself-header.sh +1 -1
- data/bin/makeself.sh +2 -2
- data/bin/omnibus +2 -2
- data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/background.png +0 -0
- data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/license.html +1 -0
- data/functional/fixtures/mac_pkg/files/mac_pkg/Resources/welcome.html +1 -0
- data/functional/fixtures/mac_pkg/package-scripts/functional-test-project/postinstall +4 -0
- data/functional/packagers/mac_pkg_spec.rb +72 -0
- data/lib/omnibus/artifact.rb +11 -13
- data/lib/omnibus/build_version.rb +18 -21
- data/lib/omnibus/builder.rb +37 -48
- data/lib/omnibus/clean_tasks.rb +3 -5
- data/lib/omnibus/cli/application.rb +46 -53
- data/lib/omnibus/cli/base.rb +16 -19
- data/lib/omnibus/cli/build.rb +13 -13
- data/lib/omnibus/cli/cache.rb +13 -15
- data/lib/omnibus/cli/release.rb +4 -9
- data/lib/omnibus/cli.rb +2 -4
- data/lib/omnibus/config.rb +43 -23
- data/lib/omnibus/exceptions.rb +35 -1
- data/lib/omnibus/fetcher.rb +9 -13
- data/lib/omnibus/fetchers/git_fetcher.rb +15 -19
- data/lib/omnibus/fetchers/net_fetcher.rb +34 -38
- data/lib/omnibus/fetchers/path_fetcher.rb +7 -9
- data/lib/omnibus/fetchers/s3_cache_fetcher.rb +3 -4
- data/lib/omnibus/fetchers.rb +3 -3
- data/lib/omnibus/health_check.rb +126 -127
- data/lib/omnibus/library.rb +11 -12
- data/lib/omnibus/overrides.rb +6 -8
- data/lib/omnibus/package_release.rb +20 -22
- data/lib/omnibus/packagers/mac_pkg.rb +285 -0
- data/lib/omnibus/project.rb +215 -110
- data/lib/omnibus/reports.rb +16 -24
- data/lib/omnibus/s3_cacher.rb +15 -21
- data/lib/omnibus/software.rb +178 -88
- data/lib/omnibus/util.rb +25 -13
- data/lib/omnibus/version.rb +2 -2
- data/lib/omnibus.rb +11 -13
- data/omnibus.gemspec +20 -18
- data/spec/artifact_spec.rb +55 -52
- data/spec/build_version_spec.rb +121 -129
- data/spec/config_spec.rb +40 -0
- data/spec/data/projects/chefdk.rb +41 -0
- data/spec/data/projects/sample.rb +10 -0
- data/spec/data/software/erchef.rb +12 -12
- data/spec/data/software/zlib.rb +67 -0
- data/spec/fetchers/git_fetcher_spec.rb +55 -48
- data/spec/fetchers/net_fetcher_spec.rb +72 -78
- data/spec/omnibus_spec.rb +59 -0
- data/spec/overrides_spec.rb +64 -64
- data/spec/package_release_spec.rb +65 -64
- data/spec/packagers/mac_pkg_spec.rb +261 -0
- data/spec/project_spec.rb +138 -0
- data/spec/s3_cacher_spec.rb +9 -10
- data/spec/software_spec.rb +71 -50
- data/spec/spec_helper.rb +14 -7
- metadata +68 -60
- data/.rspec +0 -1
- data/.yardopts +0 -6
- data/spec/software_dirs_spec.rb +0 -34
data/lib/omnibus/reports.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright:: Copyright (c) 2012
|
2
|
+
# Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -16,11 +16,9 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
module Omnibus
|
19
|
-
|
20
19
|
module Reports
|
21
20
|
extend self
|
22
21
|
|
23
|
-
|
24
22
|
PADDING = 3
|
25
23
|
|
26
24
|
# Determine how wide a column should be, taking into account both
|
@@ -28,7 +26,7 @@ module Omnibus
|
|
28
26
|
# will be stored in the column, the width is 0 (i.e., nothing
|
29
27
|
# should be printed, not even the column header)
|
30
28
|
def column_width(items, column_name)
|
31
|
-
widest_item = items.max{|a,b| a.size <=> b.size}
|
29
|
+
widest_item = items.max { |a, b| a.size <=> b.size }
|
32
30
|
if widest_item
|
33
31
|
widest = (widest_item.size >= column_name.size) ? widest_item : column_name
|
34
32
|
widest.size + PADDING
|
@@ -38,14 +36,13 @@ module Omnibus
|
|
38
36
|
end
|
39
37
|
|
40
38
|
def non_nil_values(hashes, selector_key)
|
41
|
-
hashes.map{|v| v[selector_key]}.compact
|
39
|
+
hashes.map { |v| v[selector_key] }.compact
|
42
40
|
end
|
43
41
|
|
44
42
|
def pretty_version_map(project)
|
45
|
-
out =
|
43
|
+
out = ''
|
46
44
|
version_map = project.library.version_map
|
47
45
|
|
48
|
-
|
49
46
|
# Pull out data to print out
|
50
47
|
versions = non_nil_values(version_map.values, :version)
|
51
48
|
guids = non_nil_values(version_map.values, :version_guid)
|
@@ -53,25 +50,23 @@ module Omnibus
|
|
53
50
|
# We only want the versions that have truly been overridden;
|
54
51
|
# because we want to output a column only if something was
|
55
52
|
# overridden, but nothing if no packages were changed
|
56
|
-
overridden_versions = non_nil_values(version_map.values.select{|v| v[:overridden]},
|
57
|
-
:given_version)
|
58
|
-
|
53
|
+
overridden_versions = non_nil_values(version_map.values.select { |v| v[:overridden] }, :default_version)
|
59
54
|
|
60
55
|
# Determine how wide the printed table columns need to be
|
61
|
-
name_width = column_width(version_map.keys,
|
62
|
-
version_width = column_width(versions,
|
63
|
-
guid_width = column_width(guids,
|
64
|
-
override_width = column_width(overridden_versions,
|
56
|
+
name_width = column_width(version_map.keys, 'Component')
|
57
|
+
version_width = column_width(versions, 'Installed Version')
|
58
|
+
guid_width = column_width(guids, 'Version GUID')
|
59
|
+
override_width = column_width(overridden_versions, 'Overridden From')
|
65
60
|
|
66
61
|
total_width = name_width + version_width + guid_width + override_width
|
67
|
-
divider =
|
62
|
+
divider = '-' * total_width
|
68
63
|
|
69
64
|
# Print out the column headers
|
70
|
-
out <<
|
71
|
-
out <<
|
72
|
-
out <<
|
65
|
+
out << 'Component'.ljust(name_width)
|
66
|
+
out << 'Installed Version'.ljust(version_width)
|
67
|
+
out << 'Version GUID'.ljust(guid_width)
|
73
68
|
# Only print out column if something was overridden
|
74
|
-
out <<
|
69
|
+
out << 'Overridden From'.ljust(override_width) if override_width > 0
|
75
70
|
out << "\n"
|
76
71
|
out << divider << "\n"
|
77
72
|
|
@@ -80,20 +75,17 @@ module Omnibus
|
|
80
75
|
version = version_map[name][:version]
|
81
76
|
version_guid = version_map[name][:version_guid]
|
82
77
|
|
83
|
-
|
78
|
+
default_version = version_map[name][:default_version]
|
84
79
|
overridden = version_map[name][:overridden]
|
85
80
|
|
86
81
|
out << "#{name}".ljust(name_width)
|
87
82
|
out << version.to_s.ljust(version_width)
|
88
83
|
out << version_guid.to_s.ljust(guid_width) if version_guid
|
89
84
|
# Only print out column if something was overridden
|
90
|
-
out <<
|
85
|
+
out << default_version.ljust(override_width) if overridden
|
91
86
|
out << "\n"
|
92
87
|
end
|
93
88
|
out
|
94
89
|
end
|
95
|
-
|
96
90
|
end
|
97
|
-
|
98
|
-
|
99
91
|
end
|
data/lib/omnibus/s3_cacher.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright:: Copyright (c) 2012
|
2
|
+
# Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -20,10 +20,7 @@ require 'uber-s3'
|
|
20
20
|
require 'omnibus/fetchers'
|
21
21
|
|
22
22
|
module Omnibus
|
23
|
-
|
24
|
-
|
25
23
|
module SoftwareS3URLs
|
26
|
-
|
27
24
|
class InsufficientSpecification < ArgumentError
|
28
25
|
end
|
29
26
|
|
@@ -38,27 +35,25 @@ module Omnibus
|
|
38
35
|
private
|
39
36
|
|
40
37
|
def key_for_package(package)
|
41
|
-
package.name
|
42
|
-
package.version
|
43
|
-
package.checksum
|
38
|
+
package.name || fail(InsufficientSpecification, "Software must have a name to cache it in S3 (#{package.inspect})")
|
39
|
+
package.version || fail(InsufficientSpecification, "Software must set a version to cache it in S3 (#{package.inspect})")
|
40
|
+
package.checksum || fail(InsufficientSpecification, "Software must specify a checksum (md5) to cache it in S3 (#{package.inspect})")
|
44
41
|
"#{package.name}-#{package.version}-#{package.checksum}"
|
45
42
|
end
|
46
|
-
|
47
43
|
end
|
48
44
|
|
49
45
|
class S3Cache
|
50
|
-
|
51
46
|
include SoftwareS3URLs
|
52
47
|
|
53
48
|
def initialize
|
54
49
|
unless config.s3_bucket && config.s3_access_key && config.s3_secret_key
|
55
|
-
|
50
|
+
fail InvalidS3Configuration.new(config.s3_bucket, config.s3_access_key, config.s3_secret_key)
|
56
51
|
end
|
57
52
|
@client = UberS3.new(
|
58
|
-
:
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:
|
53
|
+
access_key: config.s3_access_key,
|
54
|
+
secret_access_key: config.s3_secret_key,
|
55
|
+
bucket: config.s3_bucket,
|
56
|
+
adapter: :net_http,
|
62
57
|
)
|
63
58
|
end
|
64
59
|
|
@@ -72,7 +67,7 @@ module Omnibus
|
|
72
67
|
|
73
68
|
def list
|
74
69
|
existing_keys = list_by_key
|
75
|
-
tarball_software.select {|s| existing_keys.include?(key_for_package(s))}
|
70
|
+
tarball_software.select { |s| existing_keys.include?(key_for_package(s)) }
|
76
71
|
end
|
77
72
|
|
78
73
|
def list_by_key
|
@@ -81,12 +76,12 @@ module Omnibus
|
|
81
76
|
|
82
77
|
def missing
|
83
78
|
already_cached = list_by_key
|
84
|
-
tarball_software.delete_if {|s| already_cached.include?(key_for_package(s))}
|
79
|
+
tarball_software.delete_if { |s| already_cached.include?(key_for_package(s)) }
|
85
80
|
end
|
86
81
|
|
87
82
|
def tarball_software
|
88
83
|
Omnibus.projects.map do |project|
|
89
|
-
project.library.select {|s| s.source && s.source.key?(:url)}
|
84
|
+
project.library.select { |s| s.source && s.source.key?(:url) }
|
90
85
|
end.flatten
|
91
86
|
end
|
92
87
|
|
@@ -98,7 +93,7 @@ module Omnibus
|
|
98
93
|
content = IO.read(software.project_file)
|
99
94
|
|
100
95
|
log "Uploading #{software.project_file} as #{config.s3_bucket}/#{key}"
|
101
|
-
@client.store(key, content, :
|
96
|
+
@client.store(key, content, access: :public_read, content_md5: software.checksum)
|
102
97
|
end
|
103
98
|
end
|
104
99
|
|
@@ -121,7 +116,7 @@ module Omnibus
|
|
121
116
|
fetcher.download
|
122
117
|
fetcher.verify_checksum!
|
123
118
|
else
|
124
|
-
log
|
119
|
+
log 'Cached copy up to date, skipping.'
|
125
120
|
end
|
126
121
|
end
|
127
122
|
|
@@ -129,10 +124,9 @@ module Omnibus
|
|
129
124
|
@bucket ||= begin
|
130
125
|
b = UberS3::Bucket.new(@client, @client.bucket)
|
131
126
|
# creating the bucket is idempotent, make sure it's created:
|
132
|
-
@client.connection.put(
|
127
|
+
@client.connection.put('/')
|
133
128
|
b
|
134
129
|
end
|
135
130
|
end
|
136
|
-
|
137
131
|
end
|
138
132
|
end
|
data/lib/omnibus/software.rb
CHANGED
@@ -29,12 +29,12 @@ require 'omnibus/config'
|
|
29
29
|
require 'rake'
|
30
30
|
|
31
31
|
module Omnibus
|
32
|
-
|
33
32
|
# Omnibus software DSL reader
|
34
33
|
class Software
|
35
34
|
include Rake::DSL
|
36
35
|
|
37
36
|
NULL_ARG = Object.new
|
37
|
+
UNINITIALIZED = Object.new
|
38
38
|
|
39
39
|
# It appears that this is not used
|
40
40
|
attr_reader :builder
|
@@ -49,18 +49,20 @@ module Omnibus
|
|
49
49
|
|
50
50
|
attr_reader :project
|
51
51
|
|
52
|
-
attr_reader :
|
53
|
-
|
52
|
+
attr_reader :version
|
53
|
+
|
54
|
+
attr_reader :overrides
|
55
|
+
|
54
56
|
attr_reader :whitelist_files
|
55
57
|
|
56
|
-
def self.load(filename, project,
|
57
|
-
new(IO.read(filename), filename, project,
|
58
|
+
def self.load(filename, project, repo_overrides = {})
|
59
|
+
new(IO.read(filename), filename, project, repo_overrides)
|
58
60
|
end
|
59
61
|
|
60
62
|
# @param io [String]
|
61
63
|
# @param filename [String]
|
62
64
|
# @param project [???] Is this a string or an Omnibus::Project?
|
63
|
-
# @param
|
65
|
+
# @param repo_overrides [Hash]
|
64
66
|
#
|
65
67
|
# @see Omnibus::Overrides
|
66
68
|
#
|
@@ -70,9 +72,9 @@ module Omnibus
|
|
70
72
|
# project, and override hash directly? That is, why io AND a
|
71
73
|
# filename, if the filename can always get you the contents you
|
72
74
|
# need anyway?
|
73
|
-
def initialize(io, filename, project,
|
74
|
-
@
|
75
|
-
@
|
75
|
+
def initialize(io, filename, project, repo_overrides = {})
|
76
|
+
@version = nil
|
77
|
+
@overrides = UNINITIALIZED
|
76
78
|
@name = nil
|
77
79
|
@description = nil
|
78
80
|
@source = nil
|
@@ -81,25 +83,58 @@ module Omnibus
|
|
81
83
|
@source_config = filename
|
82
84
|
@project = project
|
83
85
|
@always_build = false
|
86
|
+
@repo_overrides = repo_overrides
|
84
87
|
|
85
88
|
# Seems like this should just be Builder.new(self) instead
|
86
89
|
@builder = NullBuilder.new(self)
|
87
90
|
|
88
|
-
@dependencies =
|
89
|
-
@whitelist_files =
|
91
|
+
@dependencies = []
|
92
|
+
@whitelist_files = []
|
90
93
|
instance_eval(io, filename, 0)
|
91
94
|
|
92
|
-
# Set override information after the DSL file has been consumed
|
93
|
-
@override_version = overrides[name]
|
94
|
-
|
95
95
|
render_tasks
|
96
96
|
end
|
97
97
|
|
98
|
-
|
98
|
+
# Retrieves the override_version
|
99
|
+
#
|
100
|
+
# @return [Hash]
|
101
|
+
#
|
102
|
+
# @todo: can't we just use #version here or are we testing this against nil? somewhere and
|
103
|
+
# not using #overridden?
|
104
|
+
def override_version
|
105
|
+
$stderr.puts 'The #override_version is DEPRECATED, please use #version or test with #overridden?'
|
106
|
+
overrides[:version]
|
107
|
+
end
|
108
|
+
|
109
|
+
# Retrieves the repo-level and project-level overrides for the software.
|
110
|
+
#
|
111
|
+
# @return [Hash]
|
112
|
+
def overrides
|
113
|
+
# deliberately not providing a setter since that feels like a shotgun pointed at a foot
|
114
|
+
if @overrides == UNINITIALIZED
|
115
|
+
# lazily initialized because we need the 'name' to be parsed first
|
116
|
+
@overrides = {}
|
117
|
+
@overrides = project.overrides[name.to_sym].dup if project.overrides[name.to_sym]
|
118
|
+
if @repo_overrides[name]
|
119
|
+
@overrides[:version] = @repo_overrides[name]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
@overrides
|
123
|
+
end
|
124
|
+
|
125
|
+
# Sets or retreives the name of the software
|
126
|
+
#
|
127
|
+
# @param val [String] name of the Software
|
128
|
+
# @return [String]
|
129
|
+
def name(val = NULL_ARG)
|
99
130
|
@name = val unless val.equal?(NULL_ARG)
|
100
|
-
@name
|
131
|
+
@name || fail(MissingSoftwareConfiguration.new(name, 'name', 'libxslt'))
|
101
132
|
end
|
102
133
|
|
134
|
+
# Sets the description of the software
|
135
|
+
#
|
136
|
+
# @param val [String] description of the Software
|
137
|
+
# @return [void]
|
103
138
|
def description(val)
|
104
139
|
@description = val
|
105
140
|
end
|
@@ -125,7 +160,7 @@ module Omnibus
|
|
125
160
|
#
|
126
161
|
# @param val [Array<String>] a list of names of Software components
|
127
162
|
# @return [Array<String>]
|
128
|
-
def dependencies(val=NULL_ARG)
|
163
|
+
def dependencies(val = NULL_ARG)
|
129
164
|
@dependencies = val unless val.equal?(NULL_ARG)
|
130
165
|
@dependencies
|
131
166
|
end
|
@@ -140,19 +175,60 @@ module Omnibus
|
|
140
175
|
#
|
141
176
|
# @todo Consider changing this to accept two arguments instead
|
142
177
|
# @todo This should throw an error if an invalid key is given, or
|
143
|
-
# if more than one pair is given
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
178
|
+
# if more than one pair is given
|
179
|
+
def source(val = NULL_ARG)
|
180
|
+
unless val.equal?(NULL_ARG)
|
181
|
+
@source ||= {}
|
182
|
+
@source.merge!(val)
|
183
|
+
end
|
184
|
+
apply_overrides(:source)
|
148
185
|
end
|
149
186
|
|
150
|
-
#
|
151
|
-
#
|
152
|
-
#
|
153
|
-
|
154
|
-
|
155
|
-
|
187
|
+
# Retieve the default_version of the software
|
188
|
+
#
|
189
|
+
# @return [String]
|
190
|
+
#
|
191
|
+
# @todo: remove this in favor of default_version
|
192
|
+
def given_version
|
193
|
+
$stderr.puts "Getting the default version via #given_version is DEPRECATED, please use 'default_version'"
|
194
|
+
default_version
|
195
|
+
end
|
196
|
+
|
197
|
+
# Set or retieve the default_version of the software to build
|
198
|
+
#
|
199
|
+
# @param val [String]
|
200
|
+
# @return [String]
|
201
|
+
def default_version(val = NULL_ARG)
|
202
|
+
@version = val unless val.equal?(NULL_ARG)
|
203
|
+
@version
|
204
|
+
end
|
205
|
+
|
206
|
+
# Evaluate a block only if the version matches.
|
207
|
+
#
|
208
|
+
# Note that passing only a string without a block will set the default_version but this
|
209
|
+
# behavior is deprecated and will be removed, use the default_version method instead.
|
210
|
+
#
|
211
|
+
# @param val [String] version of the software.
|
212
|
+
# @param block [Proc] block to run if the version we are building matches the argument.
|
213
|
+
# @return [void]
|
214
|
+
#
|
215
|
+
# @todo remove deprecated setting of version
|
216
|
+
def version(val = NULL_ARG)
|
217
|
+
if block_given?
|
218
|
+
if val.equal?(NULL_ARG)
|
219
|
+
fail 'block needs a version argument to apply against'
|
220
|
+
else
|
221
|
+
if val == apply_overrides(:version)
|
222
|
+
yield
|
223
|
+
end
|
224
|
+
end
|
225
|
+
else
|
226
|
+
unless val.equal?(NULL_ARG)
|
227
|
+
$stderr.puts "Setting the version via 'version' is DEPRECATED, please use 'default_version'"
|
228
|
+
@version = val
|
229
|
+
end
|
230
|
+
end
|
231
|
+
apply_overrides(:version)
|
156
232
|
end
|
157
233
|
|
158
234
|
# Add an Omnibus software dependency.
|
@@ -169,7 +245,8 @@ module Omnibus
|
|
169
245
|
#
|
170
246
|
# @return [Boolean]
|
171
247
|
def overridden?
|
172
|
-
|
248
|
+
# note: using instance variables to bypass accessors that enforce overrides
|
249
|
+
@overrides.key?(:version) && (@overrides[:version] != @version)
|
173
250
|
end
|
174
251
|
|
175
252
|
# @todo see comments on {Omnibus::Fetcher#without_caching_for}
|
@@ -312,12 +389,12 @@ module Omnibus
|
|
312
389
|
path = project_path.dup
|
313
390
|
# split the path and remmove and empty strings
|
314
391
|
if platform == 'windows'
|
315
|
-
path.sub!(
|
316
|
-
parts = path.split(
|
317
|
-
parts.join(
|
392
|
+
path.sub!(':', '')
|
393
|
+
parts = path.split('\\') - ['']
|
394
|
+
parts.join('_')
|
318
395
|
else
|
319
|
-
parts = path.split(
|
320
|
-
parts.join(
|
396
|
+
parts = path.split('/') - ['']
|
397
|
+
parts.join('_')
|
321
398
|
end
|
322
399
|
end
|
323
400
|
|
@@ -351,16 +428,30 @@ module Omnibus
|
|
351
428
|
# @return [String] Either "sparc" or "intel", as appropriate
|
352
429
|
# @todo Is this used? Doesn't appear to be...
|
353
430
|
def architecture
|
354
|
-
OHAI.kernel['machine'] =~ /sun/ ?
|
431
|
+
OHAI.kernel['machine'] =~ /sun/ ? 'sparc' : 'intel'
|
355
432
|
end
|
356
433
|
|
357
434
|
private
|
358
435
|
|
436
|
+
# Apply overrides in the @overrides hash that mask instance variables
|
437
|
+
# that are set by parsing the DSL
|
438
|
+
#
|
439
|
+
def apply_overrides(attr)
|
440
|
+
val = instance_variable_get(:"@#{attr}")
|
441
|
+
if val.is_a?(Hash) || overrides[attr].is_a?(Hash)
|
442
|
+
val ||= {}
|
443
|
+
override = overrides[attr] || {}
|
444
|
+
val.merge(override)
|
445
|
+
else
|
446
|
+
overrides[attr] || val
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
359
450
|
# @todo What?!
|
360
451
|
# @todo It seems that this is not used... remove it
|
361
452
|
# @deprecated Use something else (?)
|
362
453
|
def command(*args)
|
363
|
-
|
454
|
+
fail 'Method Moved.'
|
364
455
|
end
|
365
456
|
|
366
457
|
def execute_build(fetcher)
|
@@ -371,71 +462,70 @@ module Omnibus
|
|
371
462
|
|
372
463
|
def render_tasks
|
373
464
|
namespace "projects:#{@project.name}" do
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
465
|
+
namespace :software do
|
466
|
+
fetcher = Fetcher.for(self)
|
467
|
+
|
468
|
+
#
|
469
|
+
# set up inter-project dependencies
|
470
|
+
#
|
471
|
+
(@dependencies - [@name]).uniq.each do |dep|
|
472
|
+
task @name => dep
|
473
|
+
file manifest_file => manifest_file_from_name(dep)
|
474
|
+
end
|
384
475
|
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
476
|
+
directory source_dir
|
477
|
+
directory cache_dir
|
478
|
+
directory build_dir
|
479
|
+
directory project_dir
|
480
|
+
namespace @name do
|
481
|
+
task fetch: [build_dir, source_dir, cache_dir, project_dir] do
|
482
|
+
if !File.exists?(fetch_file) || fetcher.fetch_required?
|
483
|
+
# force build to run if we need to do an updated fetch
|
484
|
+
fetcher.fetch
|
485
|
+
touch fetch_file
|
486
|
+
end
|
395
487
|
end
|
396
|
-
end
|
397
488
|
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
489
|
+
task build: :fetch do
|
490
|
+
if !always_build? && uptodate?(manifest_file, [fetch_file])
|
491
|
+
# if any direct deps have been built for any reason, we will need to
|
492
|
+
# clean/build ourselves
|
493
|
+
(@dependencies - [@name]).uniq.each do |dep|
|
494
|
+
unless uptodate?(manifest_file, [manifest_file_from_name(dep)])
|
495
|
+
execute_build(fetcher)
|
496
|
+
break
|
497
|
+
end
|
406
498
|
end
|
407
|
-
end
|
408
499
|
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
500
|
+
else
|
501
|
+
# if fetch has occurred, or the component is configured to
|
502
|
+
# always build, do a clean and build.
|
503
|
+
execute_build(fetcher)
|
504
|
+
end
|
413
505
|
end
|
414
506
|
end
|
415
|
-
end
|
416
507
|
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
508
|
+
#
|
509
|
+
# make the manifest file dependent on the latest file in the
|
510
|
+
# source tree in order to shrink the multi-thousand-node
|
511
|
+
# dependency graph that Rake was generating
|
512
|
+
#
|
513
|
+
latest_file = FileList["#{project_dir}/**/*"].sort do |a, b|
|
514
|
+
File.mtime(a) <=> File.mtime(b)
|
515
|
+
end.last
|
425
516
|
|
426
|
-
|
517
|
+
file manifest_file => (file latest_file)
|
427
518
|
|
428
|
-
|
429
|
-
|
519
|
+
file fetch_file => "#{name}:fetch"
|
520
|
+
file manifest_file => "#{name}:build"
|
430
521
|
|
431
|
-
|
432
|
-
|
522
|
+
file fetch_file => (file @source_config)
|
523
|
+
file manifest_file => (file fetch_file)
|
433
524
|
|
434
|
-
|
435
|
-
|
436
|
-
|
525
|
+
desc "fetch and build #{@name} for #{@project.name}"
|
526
|
+
task @name => manifest_file
|
527
|
+
end
|
437
528
|
end
|
438
529
|
end
|
439
|
-
|
440
530
|
end
|
441
531
|
end
|
data/lib/omnibus/util.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
|
-
# Author:: Seth Chisamore (<schisamo@
|
3
|
-
# Copyright:: Copyright (c) 2013
|
2
|
+
# Author:: Seth Chisamore (<schisamo@getchef.com>)
|
3
|
+
# Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -20,26 +20,38 @@ require 'mixlib/shellout'
|
|
20
20
|
|
21
21
|
module Omnibus
|
22
22
|
#
|
23
|
-
# @author Seth Chisamore (<schisamo@
|
23
|
+
# @author Seth Chisamore (<schisamo@getchef.com>)
|
24
24
|
#
|
25
25
|
module Util
|
26
26
|
# Shells out and runs +command+.
|
27
27
|
#
|
28
|
-
# @
|
29
|
-
#
|
30
|
-
#
|
28
|
+
# @overload shellout(command, opts={})
|
29
|
+
# @param command [String]
|
30
|
+
# @param opts [Hash] the options passed to the initializer of the
|
31
|
+
# +Mixlib::ShellOut+ instance.
|
32
|
+
# @overload shellout(command_fragments, opts={})
|
33
|
+
# @param command [Array<String>] command argv as individual strings
|
34
|
+
# @param opts [Hash] the options passed to the initializer of the
|
35
|
+
# +Mixlib::ShellOut+ instance.
|
31
36
|
# @return [Mixlib::ShellOut] the underlying +Mixlib::ShellOut+ instance
|
32
37
|
# which which has +stdout+, +stderr+, +status+, and +exitstatus+
|
33
38
|
# populated with results of the command.
|
34
39
|
#
|
35
|
-
def shellout(
|
40
|
+
def shellout(*command_fragments)
|
36
41
|
STDOUT.sync = true
|
42
|
+
|
43
|
+
opts = if command_fragments.last.kind_of?(Hash)
|
44
|
+
command_fragments.pop
|
45
|
+
else
|
46
|
+
{}
|
47
|
+
end
|
48
|
+
|
37
49
|
default_options = {
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
50
|
+
live_stream: STDOUT,
|
51
|
+
timeout: 7200, # 2 hours
|
52
|
+
environment: {},
|
41
53
|
}
|
42
|
-
cmd = Mixlib::ShellOut.new(
|
54
|
+
cmd = Mixlib::ShellOut.new(*command_fragments, default_options.merge(opts))
|
43
55
|
cmd.run_command
|
44
56
|
cmd
|
45
57
|
end
|
@@ -52,8 +64,8 @@ module Omnibus
|
|
52
64
|
# @raise [Mixlib::ShellOut::ShellCommandFailed] if +exitstatus+ is not in
|
53
65
|
# the list of +valid_exit_codes+.
|
54
66
|
#
|
55
|
-
def shellout!(
|
56
|
-
cmd = shellout(
|
67
|
+
def shellout!(*command_fragments)
|
68
|
+
cmd = shellout(*command_fragments)
|
57
69
|
cmd.error!
|
58
70
|
cmd
|
59
71
|
end
|
data/lib/omnibus/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright:: Copyright (c) 2012
|
2
|
+
# Copyright:: Copyright (c) 2012-2014 Chef Software, Inc.
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -16,5 +16,5 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
module Omnibus
|
19
|
-
VERSION =
|
19
|
+
VERSION = '2.0.0.rc1'
|
20
20
|
end
|