autoproj 2.10.2 → 2.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/autoproj.gemspec +2 -1
- data/bin/autoproj_bootstrap +19 -19
- data/bin/autoproj_install +19 -19
- data/lib/autoproj/aruba_minitest.rb +15 -0
- data/lib/autoproj/autobuild_extensions/dsl.rb +34 -15
- data/lib/autoproj/base.rb +17 -6
- data/lib/autoproj/cli/build.rb +1 -0
- data/lib/autoproj/cli/doc.rb +4 -18
- data/lib/autoproj/cli/main.rb +8 -9
- data/lib/autoproj/cli/main_doc.rb +86 -0
- data/lib/autoproj/cli/main_plugin.rb +3 -0
- data/lib/autoproj/cli/main_test.rb +15 -0
- data/lib/autoproj/cli/test.rb +13 -84
- data/lib/autoproj/cli/update.rb +7 -4
- data/lib/autoproj/cli/utility.rb +139 -0
- data/lib/autoproj/configuration.rb +13 -0
- data/lib/autoproj/default.osdeps +7 -0
- data/lib/autoproj/manifest.rb +6 -15
- data/lib/autoproj/ops/build.rb +8 -14
- data/lib/autoproj/ops/import.rb +125 -78
- data/lib/autoproj/ops/install.rb +19 -19
- data/lib/autoproj/package_definition.rb +29 -10
- data/lib/autoproj/package_managers/bundler_manager.rb +167 -79
- data/lib/autoproj/package_manifest.rb +8 -5
- data/lib/autoproj/test.rb +3 -0
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +16 -0
- metadata +20 -4
data/lib/autoproj/ops/install.rb
CHANGED
@@ -232,54 +232,54 @@ def parse_options(args = ARGV)
|
|
232
232
|
opt.on '--debug', 'Run in debug mode' do
|
233
233
|
@autoproj_options << '--debug'
|
234
234
|
end
|
235
|
-
opt.on '--gem-source=URL', String,
|
236
|
-
|
235
|
+
opt.on '--gem-source=URL', String, 'use this source for RubyGems '\
|
236
|
+
'instead of rubygems.org' do |url|
|
237
237
|
@gem_source = url
|
238
238
|
end
|
239
|
-
opt.on '--gems-path=PATH',
|
240
|
-
|
239
|
+
opt.on '--gems-path=PATH', 'install gems under this path instead '\
|
240
|
+
'of ~/.autoproj/gems' do |path|
|
241
241
|
self.gems_install_path = path
|
242
242
|
end
|
243
243
|
opt.on '--public-gems', "install gems in the default gem location" do
|
244
244
|
self.install_gems_in_gem_user_dir
|
245
245
|
end
|
246
|
-
opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided
|
247
|
-
|
246
|
+
opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided '\
|
247
|
+
'string as a version constraint for autoproj' do |version|
|
248
248
|
if @gemfile
|
249
249
|
raise "cannot give both --version and --gemfile"
|
250
250
|
end
|
251
251
|
@gemfile = default_gemfile_contents(version)
|
252
252
|
end
|
253
|
-
opt.on '--gemfile=PATH', String, 'use the given Gemfile to install
|
254
|
-
|
253
|
+
opt.on '--gemfile=PATH', String, 'use the given Gemfile to install '\
|
254
|
+
'autoproj instead of the default' do |path|
|
255
255
|
if @gemfile
|
256
256
|
raise "cannot give both --version and --gemfile"
|
257
257
|
end
|
258
258
|
@gemfile = File.read(path)
|
259
259
|
end
|
260
|
-
opt.on '--seed-config=PATH', String, 'path to a seed file that
|
261
|
-
|
260
|
+
opt.on '--seed-config=PATH', String, 'path to a seed file that '\
|
261
|
+
'should be used to initialize the configuration' do |path|
|
262
262
|
@config.merge!(YAML.load(File.read(path)))
|
263
263
|
end
|
264
|
-
opt.on '--prefer-os-independent-packages', 'prefer OS-independent
|
265
|
-
|
266
|
-
|
264
|
+
opt.on '--prefer-os-independent-packages', 'prefer OS-independent '\
|
265
|
+
'packages (such as a RubyGem) over their OS-packaged equivalent '\
|
266
|
+
'(e.g. the thor gem vs. the ruby-thor debian package)' do
|
267
267
|
@prefer_indep_over_os_packages = true
|
268
268
|
end
|
269
|
-
opt.on '--[no-]color', 'do not use colored output (enabled by
|
270
|
-
|
269
|
+
opt.on '--[no-]color', 'do not use colored output (enabled by '\
|
270
|
+
'default if the terminal supports it)' do |color|
|
271
271
|
if color then @autoproj_options << "--color"
|
272
272
|
else @autoproj_options << '--no-color'
|
273
273
|
end
|
274
274
|
end
|
275
|
-
opt.on '--[no-]progress', 'do not use progress output (enabled by
|
276
|
-
|
275
|
+
opt.on '--[no-]progress', 'do not use progress output (enabled by '\
|
276
|
+
'default if the terminal supports it)' do |progress|
|
277
277
|
if progress then @autoproj_options << "--progress"
|
278
278
|
else @autoproj_options << '--no-progress'
|
279
279
|
end
|
280
280
|
end
|
281
|
-
opt.on '--[no-]interactive', 'if non-interactive, use default
|
282
|
-
|
281
|
+
opt.on '--[no-]interactive', 'if non-interactive, use default '\
|
282
|
+
'answer for questions' do |flag|
|
283
283
|
if flag then @autoproj_options << "--interactive"
|
284
284
|
else @autoproj_options << "--no-interactive"
|
285
285
|
end
|
@@ -19,7 +19,9 @@ class PackageDefinition
|
|
19
19
|
#
|
20
20
|
# If the package is set up, its importer as well as all target
|
21
21
|
# directories are properly set, and all {user_blocks} have been called.
|
22
|
-
def setup
|
22
|
+
def setup?
|
23
|
+
@setup
|
24
|
+
end
|
23
25
|
|
24
26
|
# Sets the {setup?} flag
|
25
27
|
attr_writer :setup
|
@@ -29,10 +31,11 @@ def setup?; !!@setup end
|
|
29
31
|
attr_accessor :vcs
|
30
32
|
|
31
33
|
def initialize(autobuild, package_set, file)
|
32
|
-
@autobuild
|
33
|
-
|
34
|
+
@autobuild = autobuild
|
35
|
+
@package_set = package_set
|
36
|
+
@file = file
|
34
37
|
@user_blocks = []
|
35
|
-
@modes = [
|
38
|
+
@modes = %w[import build]
|
36
39
|
@setup = false
|
37
40
|
@vcs = VCSDefinition.none
|
38
41
|
end
|
@@ -44,9 +47,8 @@ def initialize(autobuild, package_set, file)
|
|
44
47
|
#
|
45
48
|
# @return [Array<String>]
|
46
49
|
def modes
|
47
|
-
@modes + autobuild.utilities
|
48
|
-
|
49
|
-
map(&:name)
|
50
|
+
@modes + autobuild.utilities
|
51
|
+
.values.find_all(&:enabled?).map(&:name)
|
50
52
|
end
|
51
53
|
|
52
54
|
# The package name
|
@@ -65,9 +67,7 @@ def name
|
|
65
67
|
# @see {user_blocks}
|
66
68
|
def add_setup_block(block)
|
67
69
|
user_blocks << block
|
68
|
-
if setup?
|
69
|
-
block.call(autobuild)
|
70
|
-
end
|
70
|
+
block.call(autobuild) if setup?
|
71
71
|
end
|
72
72
|
|
73
73
|
# Whether this package is already checked out
|
@@ -79,5 +79,24 @@ def checked_out?
|
|
79
79
|
def depends_on(pkg)
|
80
80
|
autobuild.depends_on(pkg.autobuild)
|
81
81
|
end
|
82
|
+
|
83
|
+
def apply_dependencies_from_manifest
|
84
|
+
manifest = autobuild.description
|
85
|
+
manifest.each_dependency(modes) do |name, is_optional|
|
86
|
+
begin
|
87
|
+
if is_optional
|
88
|
+
autobuild.optional_dependency name
|
89
|
+
else
|
90
|
+
autobuild.depends_on name
|
91
|
+
end
|
92
|
+
rescue ConfigError => e
|
93
|
+
raise ConfigError.new(manifest.path),
|
94
|
+
"manifest #{manifest.path} of #{self.name} from "\
|
95
|
+
"#{package_set.name} lists '#{name}' as dependency, "\
|
96
|
+
'but it is neither a normal package nor an osdeps '\
|
97
|
+
"package. osdeps reports: #{e.message}", e.backtrace
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
82
101
|
end
|
83
102
|
end
|
@@ -47,12 +47,12 @@ def initialize_environment
|
|
47
47
|
env.clear 'GEM_PATH'
|
48
48
|
|
49
49
|
gemfile_path = File.join(ws.prefix_dir, 'gems', 'Gemfile')
|
50
|
-
if File.file?(gemfile_path)
|
51
|
-
env.set('BUNDLE_GEMFILE', gemfile_path)
|
52
|
-
end
|
50
|
+
env.set('BUNDLE_GEMFILE', gemfile_path) if File.file?(gemfile_path)
|
53
51
|
|
54
|
-
Autobuild.programs['bundler'] = File.join(ws.dot_autoproj_dir,
|
55
|
-
|
52
|
+
Autobuild.programs['bundler'] = File.join(ws.dot_autoproj_dir,
|
53
|
+
'bin', 'bundle')
|
54
|
+
Autobuild.programs['bundle'] = File.join(ws.dot_autoproj_dir,
|
55
|
+
'bin', 'bundle')
|
56
56
|
|
57
57
|
env.init_from_env 'RUBYLIB'
|
58
58
|
env.inherit 'RUBYLIB'
|
@@ -61,17 +61,19 @@ def initialize_environment
|
|
61
61
|
original_rubylib =
|
62
62
|
(env['RUBYLIB'] || "").split(File::PATH_SEPARATOR).find_all do |p|
|
63
63
|
!p.start_with?(Bundler.rubygems.gem_dir) &&
|
64
|
-
|
64
|
+
Bundler.rubygems.gem_path
|
65
|
+
.none? { |gem_p| p.start_with?(gem_p) }
|
65
66
|
end
|
66
67
|
# And discover the system's rubylib
|
67
|
-
if system_rubylib = discover_rubylib
|
68
|
+
if (system_rubylib = discover_rubylib)
|
68
69
|
# Do not explicitely add the system rubylib to the
|
69
70
|
# environment, the interpreter will do it for us.
|
70
71
|
#
|
71
72
|
# This allows to use a binstub generated for one of ruby
|
72
73
|
# interpreter version on our workspace
|
73
74
|
env.system_env['RUBYLIB'] = []
|
74
|
-
env.original_env['RUBYLIB'] = (original_rubylib - system_rubylib)
|
75
|
+
env.original_env['RUBYLIB'] = (original_rubylib - system_rubylib)
|
76
|
+
.join(File::PATH_SEPARATOR)
|
75
77
|
end
|
76
78
|
|
77
79
|
ws.config.each_reused_autoproj_installation do |p|
|
@@ -82,17 +84,98 @@ def initialize_environment
|
|
82
84
|
prefix_gems = File.join(ws.prefix_dir, "gems")
|
83
85
|
FileUtils.mkdir_p prefix_gems
|
84
86
|
gemfile = File.join(prefix_gems, 'Gemfile')
|
85
|
-
|
87
|
+
unless File.exist?(gemfile)
|
86
88
|
Ops.atomic_write(gemfile) do |io|
|
87
|
-
|
89
|
+
dot_autoproj_gemfile = File.join(ws.dot_autoproj_dir, 'Gemfile')
|
90
|
+
io.puts "eval_gemfile \"#{dot_autoproj_gemfile}\""
|
88
91
|
end
|
89
92
|
end
|
90
93
|
|
91
|
-
if bundle_rubylib = discover_bundle_rubylib(silent_errors: true)
|
94
|
+
if (bundle_rubylib = discover_bundle_rubylib(silent_errors: true))
|
92
95
|
update_env_rubylib(bundle_rubylib, system_rubylib)
|
93
96
|
end
|
94
97
|
end
|
95
98
|
|
99
|
+
# Enumerate the per-gem build configurations
|
100
|
+
def self.per_gem_build_config(ws)
|
101
|
+
ws.config.get('bundler.build', {})
|
102
|
+
end
|
103
|
+
|
104
|
+
# Add new build configuration arguments for a given gem
|
105
|
+
#
|
106
|
+
# This is meant to be used from the Autoproj configuration files,
|
107
|
+
# e.g. overrides.rb or package configuration
|
108
|
+
def self.add_build_configuration_for(gem_name, build_config, ws: Autoproj.workspace)
|
109
|
+
c = ws.config.get('bundler.build', {})
|
110
|
+
c[gem_name] = [c[gem_name], build_config].compact.join(" ")
|
111
|
+
ws.config.set('bundler.build', c)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Set the build configuration for the given gem
|
115
|
+
#
|
116
|
+
# This is meant to be used from the Autoproj configuration files,
|
117
|
+
# e.g. overrides.rb or package configuration
|
118
|
+
def self.configure_build_for(gem_name, build_config, ws: Autoproj.workspace)
|
119
|
+
c = ws.config.get('bundler.build', {})
|
120
|
+
c[gem_name] = build_config
|
121
|
+
ws.config.set('bundler.build', c)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Removes build configuration flags for the given gem
|
125
|
+
#
|
126
|
+
# This is meant to be used from the Autoproj configuration files,
|
127
|
+
# e.g. overrides.rb or package configuration
|
128
|
+
def self.remove_build_configuration_for(gem_name, ws: Autoproj.workspace)
|
129
|
+
c = ws.config.get('bundler.build', {})
|
130
|
+
c.delete(gem_name)
|
131
|
+
ws.config.set('bundler.build', c)
|
132
|
+
end
|
133
|
+
|
134
|
+
# @api private
|
135
|
+
#
|
136
|
+
# Apply configured per-gem build configuration options
|
137
|
+
#
|
138
|
+
# @param [Workspace] ws the workspace whose bundler configuration
|
139
|
+
# should be updated
|
140
|
+
# @return [void]
|
141
|
+
def self.apply_build_config(ws)
|
142
|
+
root_dir = File.join(ws.prefix_dir, 'gems')
|
143
|
+
current_config_path = File.join(root_dir, ".bundle", "config")
|
144
|
+
current_config =
|
145
|
+
if File.file?(current_config_path)
|
146
|
+
File.readlines(current_config_path)
|
147
|
+
else
|
148
|
+
[]
|
149
|
+
end
|
150
|
+
|
151
|
+
build_config = {}
|
152
|
+
per_gem_build_config(ws).each do |name, conf|
|
153
|
+
build_config[name.upcase] = conf
|
154
|
+
end
|
155
|
+
|
156
|
+
new_config = current_config.map do |line|
|
157
|
+
next(line) unless (m = line.match(/BUNDLE_BUILD__(.*): "(.*)"$/))
|
158
|
+
next unless (desired_config = build_config.delete(m[1]))
|
159
|
+
|
160
|
+
if m[2] != desired_config
|
161
|
+
"BUNDLE_BUILD__#{m[1]}: \"#{desired_config}\""
|
162
|
+
else
|
163
|
+
line
|
164
|
+
end
|
165
|
+
end.compact
|
166
|
+
|
167
|
+
build_config.each do |name, config|
|
168
|
+
new_config << "BUNDLE_BUILD__#{name}: \"#{config}\""
|
169
|
+
end
|
170
|
+
|
171
|
+
if new_config != current_config
|
172
|
+
FileUtils.mkdir_p File.dirname(current_config_path)
|
173
|
+
File.open(current_config_path, 'w') do |io|
|
174
|
+
io.write new_config.join
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
96
179
|
# @api private
|
97
180
|
#
|
98
181
|
# Update RUBYLIB to add the gems that are part of the bundler
|
@@ -103,7 +186,8 @@ def initialize_environment
|
|
103
186
|
# @param [Array<String>] system_rubylib the rubylib entries that are
|
104
187
|
# set by the underlying ruby interpreter itself
|
105
188
|
def update_env_rubylib(bundle_rubylib, system_rubylib = discover_rubylib)
|
106
|
-
current = (ws.env.resolved_env['RUBYLIB'] || '')
|
189
|
+
current = (ws.env.resolved_env['RUBYLIB'] || '')
|
190
|
+
.split(File::PATH_SEPARATOR) + system_rubylib
|
107
191
|
(bundle_rubylib - current).each do |p|
|
108
192
|
ws.env.add_path('RUBYLIB', p)
|
109
193
|
end
|
@@ -128,7 +212,7 @@ def parse_package_entry(entry)
|
|
128
212
|
end
|
129
213
|
|
130
214
|
class NotCleanState < RuntimeError; end
|
131
|
-
|
215
|
+
|
132
216
|
# @api private
|
133
217
|
#
|
134
218
|
# Create backup files matching a certain file mapping
|
@@ -138,9 +222,7 @@ class NotCleanState < RuntimeError; end
|
|
138
222
|
# file might not exist.
|
139
223
|
def backup_files(mapping)
|
140
224
|
mapping.each do |file, backup_file|
|
141
|
-
if File.file?(file)
|
142
|
-
FileUtils.cp file, backup_file
|
143
|
-
end
|
225
|
+
FileUtils.cp file, backup_file if File.file?(file)
|
144
226
|
end
|
145
227
|
end
|
146
228
|
|
@@ -151,9 +233,7 @@ def backup_files(mapping)
|
|
151
233
|
# @param (see #backup_file)
|
152
234
|
def backup_restore(mapping)
|
153
235
|
mapping.each do |file, backup_file|
|
154
|
-
if File.file?(backup_file)
|
155
|
-
FileUtils.cp backup_file, file
|
156
|
-
end
|
236
|
+
FileUtils.cp backup_file, file if File.file?(backup_file)
|
157
237
|
end
|
158
238
|
end
|
159
239
|
|
@@ -163,34 +243,32 @@ def backup_restore(mapping)
|
|
163
243
|
#
|
164
244
|
# @param (see #backup_file)
|
165
245
|
def backup_clean(mapping)
|
166
|
-
mapping.each do |
|
167
|
-
if File.file?(backup_file)
|
168
|
-
FileUtils.rm backup_file
|
169
|
-
end
|
246
|
+
mapping.each do |_file, backup_file|
|
247
|
+
FileUtils.rm backup_file if File.file?(backup_file)
|
170
248
|
end
|
171
249
|
end
|
172
250
|
|
173
|
-
def self.run_bundler_install(ws, gemfile, *options,
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
end
|
251
|
+
def self.run_bundler_install(ws, gemfile, *options,
|
252
|
+
update: true, binstubs: nil,
|
253
|
+
gem_home: ws.config.gems_gem_home,
|
254
|
+
gem_path: ws.config.gems_install_path)
|
255
|
+
FileUtils.rm "#{gemfile}.lock" if update && File.file?("#{gemfile}.lock")
|
179
256
|
|
180
257
|
options << '--path' << gem_path
|
181
258
|
options << "--shebang" << Gem.ruby
|
182
|
-
if binstubs
|
183
|
-
|
184
|
-
|
259
|
+
options << "--binstubs" << binstubs if binstubs
|
260
|
+
|
261
|
+
apply_build_config(ws)
|
185
262
|
|
186
263
|
connections = Set.new
|
187
|
-
run_bundler(ws, 'install', *options,
|
264
|
+
run_bundler(ws, 'install', *options,
|
265
|
+
gem_home: gem_home, gemfile: gemfile) do |line|
|
188
266
|
case line
|
189
267
|
when /Installing (.*)/
|
190
268
|
Autobuild.message " bundler: installing #{$1}"
|
191
269
|
when /Fetching.*from (.*)/
|
192
270
|
host = $1.gsub(/\.+$/, '')
|
193
|
-
|
271
|
+
unless connections.include?(host)
|
194
272
|
Autobuild.message " bundler: connected to #{host}"
|
195
273
|
connections << host
|
196
274
|
end
|
@@ -200,13 +278,20 @@ def self.run_bundler_install(ws, gemfile, *options, update: true, binstubs: nil,
|
|
200
278
|
|
201
279
|
def self.bundle_gem_path(ws, gem_name, gem_home: nil, gemfile: nil)
|
202
280
|
path = String.new
|
203
|
-
PackageManagers::BundlerManager.run_bundler(
|
204
|
-
|
205
|
-
|
281
|
+
PackageManagers::BundlerManager.run_bundler(
|
282
|
+
ws, 'show', gem_name,
|
283
|
+
gem_home: gem_home,
|
284
|
+
gemfile: gemfile) { |line| path << line }
|
206
285
|
path.chomp
|
207
286
|
end
|
208
287
|
|
288
|
+
def self.default_bundler(ws)
|
289
|
+
File.join(ws.dot_autoproj_dir, 'bin', 'bundle')
|
290
|
+
end
|
291
|
+
|
209
292
|
def self.run_bundler(ws, *commandline, gem_home: nil, gemfile: nil)
|
293
|
+
bundle = Autobuild.programs['bundle'] || default_bundler(ws)
|
294
|
+
|
210
295
|
Bundler.with_clean_env do
|
211
296
|
target_env = Hash[
|
212
297
|
'GEM_HOME' => gem_home,
|
@@ -215,15 +300,14 @@ def self.run_bundler(ws, *commandline, gem_home: nil, gemfile: nil)
|
|
215
300
|
'RUBYOPT' => nil,
|
216
301
|
'RUBYLIB' => rubylib_for_bundler
|
217
302
|
]
|
218
|
-
ws.run
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
end
|
303
|
+
ws.run('autoproj', 'osdeps',
|
304
|
+
bundle, *commandline,
|
305
|
+
working_directory: File.dirname(gemfile),
|
306
|
+
env: target_env) { |line| yield(line) if block_given? }
|
223
307
|
end
|
224
308
|
end
|
225
309
|
|
226
|
-
# Parse the contents of a gemfile into a set of
|
310
|
+
# Parse the contents of a gemfile into a set of
|
227
311
|
def merge_gemfiles(*path, unlock: [])
|
228
312
|
gems_remotes = Set.new
|
229
313
|
dependencies = Hash.new do |h, k|
|
@@ -237,9 +321,11 @@ def merge_gemfiles(*path, unlock: [])
|
|
237
321
|
bundler_def =
|
238
322
|
begin Bundler::Dsl.evaluate(gemfile, nil, [])
|
239
323
|
rescue Exception => e
|
240
|
-
cleaned_message = e
|
241
|
-
|
242
|
-
gsub(
|
324
|
+
cleaned_message = e
|
325
|
+
.message
|
326
|
+
.gsub(/There was an error parsing([^:]+)/,
|
327
|
+
"Error in gem definitions")
|
328
|
+
.gsub(/# from.*/, '')
|
243
329
|
raise ConfigError, cleaned_message
|
244
330
|
end
|
245
331
|
gems_remotes |= bundler_def.send(:sources).rubygems_remotes.to_set
|
@@ -259,17 +345,17 @@ def merge_gemfiles(*path, unlock: [])
|
|
259
345
|
contents = []
|
260
346
|
gems_remotes.each do |g|
|
261
347
|
g = g.to_s
|
262
|
-
if g.end_with?('/')
|
263
|
-
|
264
|
-
end
|
265
|
-
contents << "source '#{g.to_s}'"
|
348
|
+
g = g[0..-2] if g.end_with?('/')
|
349
|
+
contents << "source '#{g}'"
|
266
350
|
end
|
267
|
-
valid_keys = %w
|
351
|
+
valid_keys = %w[group groups git path glob name branch ref tag
|
352
|
+
require submodules platform platforms type
|
353
|
+
source install_if]
|
268
354
|
dependencies.each do |group_name, by_platform|
|
269
355
|
contents << "group :#{group_name} do"
|
270
356
|
by_platform.each do |platform_name, deps|
|
271
357
|
deps = deps.values.sort_by(&:name)
|
272
|
-
|
358
|
+
unless platform_name.empty?
|
273
359
|
contents << " platform :#{platform_name} do"
|
274
360
|
platform_indent = " "
|
275
361
|
end
|
@@ -279,13 +365,12 @@ def merge_gemfiles(*path, unlock: [])
|
|
279
365
|
options.delete_if { |k, _| !valid_keys.include?(k) }
|
280
366
|
options = options.map { |k, v| "#{k}: \"#{v}\"" }
|
281
367
|
end
|
282
|
-
contents << [" #{platform_indent}gem \"#{d.name}\",
|
283
|
-
|
284
|
-
if !platform_name.empty?
|
285
|
-
contents << " end"
|
368
|
+
contents << [" #{platform_indent}gem \"#{d.name}\",
|
369
|
+
\"#{d.requirement}\"", *options].join(', ')
|
286
370
|
end
|
371
|
+
contents << ' end' unless platform_name.empty?
|
287
372
|
end
|
288
|
-
contents <<
|
373
|
+
contents << 'end'
|
289
374
|
end
|
290
375
|
contents.join("\n")
|
291
376
|
end
|
@@ -293,13 +378,14 @@ def merge_gemfiles(*path, unlock: [])
|
|
293
378
|
def workspace_configuration_gemfiles
|
294
379
|
gemfiles = []
|
295
380
|
ws.manifest.each_package_set do |source|
|
296
|
-
|
381
|
+
pkg_set_gemfile = File.join(source.local_dir, 'Gemfile')
|
382
|
+
if source.local_dir && File.file?(pkg_set_gemfile)
|
297
383
|
gemfiles << pkg_set_gemfile
|
298
384
|
end
|
299
385
|
end
|
300
386
|
# In addition, look into overrides.d
|
301
|
-
Dir.glob(File.join(ws.overrides_dir, "*.gemfile")) do |
|
302
|
-
gemfiles <<
|
387
|
+
Dir.glob(File.join(ws.overrides_dir, "*.gemfile")) do |overrides_gemfile|
|
388
|
+
gemfiles << overrides_gemfile
|
303
389
|
end
|
304
390
|
gemfiles
|
305
391
|
end
|
@@ -316,9 +402,10 @@ def install(gems, filter_uptodate_packages: false, install_only: false)
|
|
316
402
|
# Back up the existing gemfile, we'll restore it if something is
|
317
403
|
# wrong to avoid leaving bundler in an inconsistent state
|
318
404
|
backup_files(backups)
|
319
|
-
|
405
|
+
unless File.file?("#{gemfile_path}.orig")
|
320
406
|
Ops.atomic_write("#{gemfile_path}.orig") do |io|
|
321
|
-
|
407
|
+
dot_autoproj_gemfile = File.join(ws.dot_autoproj_dir, 'Gemfile')
|
408
|
+
io.puts "eval_gemfile \"#{dot_autoproj_gemfile}\""
|
322
409
|
end
|
323
410
|
end
|
324
411
|
|
@@ -330,7 +417,7 @@ def install(gems, filter_uptodate_packages: false, install_only: false)
|
|
330
417
|
gemfile_contents = Tempfile.open 'autoproj-gemfile' do |io|
|
331
418
|
gems.sort.each do |name|
|
332
419
|
name, version = parse_package_entry(name)
|
333
|
-
io.puts "gem \"#{name}\", \"#{version ||
|
420
|
+
io.puts "gem \"#{name}\", \"#{version || '>= 0'}\""
|
334
421
|
end
|
335
422
|
io.flush
|
336
423
|
gemfiles.unshift io.path
|
@@ -340,7 +427,9 @@ def install(gems, filter_uptodate_packages: false, install_only: false)
|
|
340
427
|
end
|
341
428
|
|
342
429
|
FileUtils.mkdir_p root_dir
|
343
|
-
|
430
|
+
updated = (!File.exist?(gemfile_path) ||
|
431
|
+
File.read(gemfile_path) != gemfile_contents)
|
432
|
+
if updated
|
344
433
|
Ops.atomic_write(gemfile_path) do |io|
|
345
434
|
io.puts "ruby \"#{RUBY_VERSION}\" if respond_to?(:ruby)"
|
346
435
|
io.puts gemfile_contents
|
@@ -350,24 +439,25 @@ def install(gems, filter_uptodate_packages: false, install_only: false)
|
|
350
439
|
options = Array.new
|
351
440
|
binstubs_path = File.join(root_dir, 'bin')
|
352
441
|
if updated || !install_only || !File.file?("#{gemfile_path}.lock")
|
353
|
-
self.class.run_bundler_install
|
354
|
-
|
442
|
+
self.class.run_bundler_install(ws, gemfile_path, *options,
|
443
|
+
binstubs: binstubs_path)
|
355
444
|
end
|
356
445
|
|
357
|
-
if bundle_rubylib = discover_bundle_rubylib
|
446
|
+
if (bundle_rubylib = discover_bundle_rubylib)
|
358
447
|
update_env_rubylib(bundle_rubylib)
|
359
448
|
else
|
360
|
-
raise NotCleanState, "bundler executed successfully,
|
449
|
+
raise NotCleanState, "bundler executed successfully, "\
|
450
|
+
"but the result was not in a clean state"
|
361
451
|
end
|
362
|
-
|
363
452
|
rescue Exception
|
364
|
-
Autoproj.warn "saved the new Gemfile in #{gemfile_path}.FAILED
|
453
|
+
Autoproj.warn "saved the new Gemfile in #{gemfile_path}.FAILED "\
|
454
|
+
"and restored the last Gemfile version"
|
365
455
|
FileUtils.cp gemfile_path, "#{gemfile_path}.FAILED"
|
366
456
|
backup_restore(backups)
|
367
457
|
raise
|
368
458
|
ensure
|
369
459
|
if binstubs_path
|
370
|
-
FileUtils.rm_f File.join(binstubs_path, 'bundle')
|
460
|
+
FileUtils.rm_f File.join(binstubs_path, 'bundle')
|
371
461
|
FileUtils.rm_f File.join(binstubs_path, 'bundler')
|
372
462
|
end
|
373
463
|
backup_clean(backups)
|
@@ -383,7 +473,7 @@ def discover_rubylib
|
|
383
473
|
err: '/dev/null')
|
384
474
|
if result
|
385
475
|
io.rewind
|
386
|
-
io.readlines.map
|
476
|
+
io.readlines.map(&:chomp).find_all { |l| !l.empty? }
|
387
477
|
end
|
388
478
|
end
|
389
479
|
end
|
@@ -397,25 +487,23 @@ def discover_bundle_rubylib(silent_errors: false)
|
|
397
487
|
require 'bundler'
|
398
488
|
gemfile = File.join(ws.prefix_dir, 'gems', 'Gemfile')
|
399
489
|
silent_redirect = Hash.new
|
400
|
-
if silent_errors
|
401
|
-
silent_redirect[:err] = :close
|
402
|
-
end
|
490
|
+
silent_redirect[:err] = :close if silent_errors
|
403
491
|
env = ws.env.resolved_env
|
404
492
|
Tempfile.open 'autoproj-rubylib' do |io|
|
405
493
|
result = Bundler.clean_system(
|
406
494
|
Hash['GEM_HOME' => env['GEM_HOME'], 'GEM_PATH' => env['GEM_PATH'],
|
407
495
|
'BUNDLE_GEMFILE' => gemfile, 'RUBYOPT' => nil,
|
408
496
|
'RUBYLIB' => self.class.rubylib_for_bundler],
|
409
|
-
Autobuild.tool('ruby'), '-rbundler/setup',
|
497
|
+
Autobuild.tool('ruby'), '-rbundler/setup',
|
498
|
+
'-e', 'puts $LOAD_PATH',
|
410
499
|
out: io, **silent_redirect)
|
411
|
-
|
500
|
+
|
412
501
|
if result
|
413
502
|
io.rewind
|
414
|
-
io.readlines.map
|
503
|
+
io.readlines.map(&:chomp).find_all { |l| !l.empty? }
|
415
504
|
end
|
416
505
|
end
|
417
506
|
end
|
418
507
|
end
|
419
508
|
end
|
420
509
|
end
|
421
|
-
|