autoproj 2.0.0.rc9 → 2.0.0.rc10
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 +4 -4
- data/Gemfile +1 -3
- data/bin/autoproj_bootstrap +137 -97
- data/bin/autoproj_bootstrap.in +2 -5
- data/bin/autoproj_install +136 -92
- data/bin/autoproj_install.in +1 -0
- data/lib/autoproj/autobuild.rb +4 -8
- data/lib/autoproj/cli/bootstrap.rb +1 -1
- data/lib/autoproj/cli/locate.rb +1 -1
- data/lib/autoproj/cli/main.rb +8 -2
- data/lib/autoproj/cli/status.rb +13 -6
- data/lib/autoproj/cli/update.rb +2 -2
- data/lib/autoproj/cli/versions.rb +2 -3
- data/lib/autoproj/configuration.rb +29 -7
- data/lib/autoproj/default.osdeps +1 -0
- data/lib/autoproj/ops/configuration.rb +28 -7
- data/lib/autoproj/ops/install.rb +135 -92
- data/lib/autoproj/ops/snapshot.rb +4 -4
- data/lib/autoproj/package_managers/bundler_manager.rb +84 -58
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +35 -15
- metadata +2 -2
data/bin/autoproj_install.in
CHANGED
data/lib/autoproj/autobuild.rb
CHANGED
@@ -549,15 +549,11 @@ class Autobuild::Git
|
|
549
549
|
# only override the branch
|
550
550
|
# @return [Hash] the snapshot information, in a format that can be used by
|
551
551
|
# {#relocate}
|
552
|
-
def snapshot(package, target_dir = nil,
|
553
|
-
|
554
|
-
|
555
|
-
exact_state: true
|
556
|
-
|
557
|
-
if options[:local]
|
558
|
-
snapshot_local(package, exact_state: options[:exact_state])
|
552
|
+
def snapshot(package, target_dir = nil, only_local: true, exact_state: true)
|
553
|
+
if only_local
|
554
|
+
snapshot_local(package, exact_state: exact_state)
|
559
555
|
else
|
560
|
-
snapshot_against_remote(package, exact_state:
|
556
|
+
snapshot_against_remote(package, exact_state: exact_state)
|
561
557
|
end
|
562
558
|
end
|
563
559
|
|
data/lib/autoproj/cli/locate.rb
CHANGED
@@ -59,7 +59,7 @@ def run(selection, options = Hash.new)
|
|
59
59
|
if name == selection || pkg.srcdir == selection
|
60
60
|
puts result_value(pkg, options)
|
61
61
|
return
|
62
|
-
elsif name =~ selection_rx || selection.start_with?(pkg.srcdir)
|
62
|
+
elsif name =~ selection_rx || selection.start_with?(pkg.srcdir) || (selection.start_with?(pkg.builddir) if pkg.builddir)
|
63
63
|
candidates << pkg
|
64
64
|
end
|
65
65
|
end
|
data/lib/autoproj/cli/main.rb
CHANGED
@@ -26,8 +26,14 @@ class Main < Thor
|
|
26
26
|
def run_autoproj_cli(filename, classname, report_options, *args)
|
27
27
|
require "autoproj/cli/#{filename}"
|
28
28
|
Autoproj.report(Hash[silent: !options[:debug], debug: options[:debug]].merge(report_options)) do
|
29
|
+
options = self.options.dup
|
30
|
+
# We use --local on the CLI but the APIs are expecting
|
31
|
+
# only_local
|
32
|
+
if options.has_key?('local')
|
33
|
+
options[:only_local] = options.delete('local')
|
34
|
+
end
|
29
35
|
cli = CLI.const_get(classname).new
|
30
|
-
run_args = cli.validate_options(args,
|
36
|
+
run_args = cli.validate_options(args, options)
|
31
37
|
cli.run(*run_args)
|
32
38
|
end
|
33
39
|
end
|
@@ -57,7 +63,7 @@ def envsh
|
|
57
63
|
end
|
58
64
|
|
59
65
|
desc 'status [PACKAGES]', 'displays synchronization status between this workspace and the package(s) source'
|
60
|
-
option :
|
66
|
+
option :local, type: :boolean, default: false,
|
61
67
|
desc: 'only use locally available information (mainly for distributed version control systems such as git)'
|
62
68
|
option :mainline, type: :string,
|
63
69
|
desc: "compare to the given baseline. if 'true', the comparison will ignore any override, otherwise it will take into account overrides only up to the given package set"
|
data/lib/autoproj/cli/status.rb
CHANGED
@@ -27,6 +27,10 @@ def run(user_selection, options = Hash.new)
|
|
27
27
|
return
|
28
28
|
end
|
29
29
|
|
30
|
+
if !options.has_key?(:parallel) && options[:only_local]
|
31
|
+
options[:parallel] = 1
|
32
|
+
end
|
33
|
+
|
30
34
|
if options[:config]
|
31
35
|
pkg_sets = ws.manifest.each_package_set.to_a
|
32
36
|
if !pkg_sets.empty?
|
@@ -40,7 +44,7 @@ def run(user_selection, options = Hash.new)
|
|
40
44
|
packages = packages.sort.map do |pkg_name|
|
41
45
|
ws.manifest.find_package(pkg_name)
|
42
46
|
end
|
43
|
-
display_status(packages, snapshot: options[:snapshot], only_local: options[:only_local])
|
47
|
+
display_status(packages, parallel: options[:parallel], snapshot: options[:snapshot], only_local: options[:only_local])
|
44
48
|
end
|
45
49
|
|
46
50
|
def snapshot_overrides_vcs?(importer, vcs, snapshot)
|
@@ -53,7 +57,7 @@ def snapshot_overrides_vcs?(importer, vcs, snapshot)
|
|
53
57
|
end
|
54
58
|
|
55
59
|
PackageStatus = Struct.new :msg, :sync, :uncommitted, :local, :remote
|
56
|
-
def status_of_package(package_description,
|
60
|
+
def status_of_package(package_description, only_local: false, snapshot: false)
|
57
61
|
pkg = package_description.autobuild
|
58
62
|
importer = pkg.importer
|
59
63
|
package_status = PackageStatus.new(Array.new, false, false, false, false)
|
@@ -66,7 +70,7 @@ def status_of_package(package_description, options = Hash.new)
|
|
66
70
|
else
|
67
71
|
if importer.respond_to?(:snapshot)
|
68
72
|
snapshot =
|
69
|
-
begin importer.snapshot(pkg, nil, exact_state: false,
|
73
|
+
begin importer.snapshot(pkg, nil, exact_state: false, only_local: only_local)
|
70
74
|
rescue Autobuild::PackageException
|
71
75
|
Hash.new
|
72
76
|
end
|
@@ -74,13 +78,13 @@ def status_of_package(package_description, options = Hash.new)
|
|
74
78
|
non_nil_values = snapshot.delete_if { |k, v| !v }
|
75
79
|
package_status.msg << Autoproj.color(" found configuration that contains all local changes: #{non_nil_values.sort_by(&:first).map { |k, v| "#{k}: #{v}" }.join(", ")}", :bright_green)
|
76
80
|
package_status.msg << Autoproj.color(" consider adding this to your overrides, or use autoproj versions to do it for you", :bright_green)
|
77
|
-
if
|
81
|
+
if snapshot
|
78
82
|
importer.relocate(importer.repository, snapshot)
|
79
83
|
end
|
80
84
|
end
|
81
85
|
end
|
82
86
|
|
83
|
-
begin status = importer.status(pkg,
|
87
|
+
begin status = importer.status(pkg, only_local)
|
84
88
|
rescue Interrupt
|
85
89
|
raise
|
86
90
|
rescue Exception => e
|
@@ -139,7 +143,10 @@ def display_status(packages, options = Hash.new)
|
|
139
143
|
pkg.autobuild.importer && pkg.autobuild.importer.interactive?
|
140
144
|
end
|
141
145
|
noninteractive = noninteractive.map do |pkg|
|
142
|
-
|
146
|
+
future = Concurrent::Future.execute(executor: executor) do
|
147
|
+
status_of_package(pkg, snapshot: options[:snapshot], only_local: options[:only_local])
|
148
|
+
end
|
149
|
+
[pkg, future]
|
143
150
|
end
|
144
151
|
|
145
152
|
sync_packages = ""
|
data/lib/autoproj/cli/update.rb
CHANGED
@@ -57,7 +57,7 @@ def run(selected_packages, options)
|
|
57
57
|
|
58
58
|
ws.load_package_sets(
|
59
59
|
mainline: options[:mainline],
|
60
|
-
only_local: options[:
|
60
|
+
only_local: options[:only_local],
|
61
61
|
checkout_only: !options[:config] || options[:checkout_only],
|
62
62
|
reset: options[:reset],
|
63
63
|
ignore_errors: options[:keep_going],
|
@@ -112,7 +112,7 @@ def run(selected_packages, options)
|
|
112
112
|
source_packages, osdep_packages =
|
113
113
|
ops.import_packages(selected_packages,
|
114
114
|
checkout_only: options[:checkout_only],
|
115
|
-
only_local: options[:
|
115
|
+
only_local: options[:only_local],
|
116
116
|
reset: options[:reset],
|
117
117
|
recursive: options[:deps],
|
118
118
|
ignore_errors: options[:keep_going],
|
@@ -33,16 +33,15 @@ def run(user_selection, options)
|
|
33
33
|
finalize_setup(user_selection,
|
34
34
|
recursive: options[:deps],
|
35
35
|
ignore_non_imported_packages: true)
|
36
|
-
|
37
36
|
|
38
37
|
ops = Ops::Snapshot.new(ws.manifest, ignore_errors: options[:keep_going])
|
39
38
|
|
40
39
|
versions = Array.new
|
41
40
|
if (config_selected && options[:config] != false) || user_selection.empty?
|
42
|
-
versions += ops.snapshot_package_sets(nil,
|
41
|
+
versions += ops.snapshot_package_sets(nil, only_local: options[:only_local])
|
43
42
|
end
|
44
43
|
if (!config_selected && !options[:config]) || !user_selection.empty?
|
45
|
-
versions += ops.snapshot_packages(packages, nil,
|
44
|
+
versions += ops.snapshot_packages(packages, nil, only_local: options[:only_local])
|
46
45
|
end
|
47
46
|
|
48
47
|
if output_file = options[:save]
|
@@ -207,15 +207,36 @@ def parallel_import_level=(level)
|
|
207
207
|
end
|
208
208
|
|
209
209
|
def private_bundler?
|
210
|
-
get('private_bundler', false)
|
210
|
+
!!get('private_bundler', false)
|
211
|
+
end
|
212
|
+
|
213
|
+
def bundler_gem_home
|
214
|
+
get('private_bundler', Gem.user_dir)
|
211
215
|
end
|
212
216
|
|
213
217
|
def private_autoproj?
|
214
|
-
get('private_autoproj', false)
|
218
|
+
!!get('private_autoproj', false)
|
219
|
+
end
|
220
|
+
|
221
|
+
def autoproj_gem_home
|
222
|
+
get('private_autoproj', Gem.user_dir)
|
215
223
|
end
|
216
224
|
|
217
225
|
def private_gems?
|
218
|
-
get('private_gems', false)
|
226
|
+
!!get('private_gems', false)
|
227
|
+
end
|
228
|
+
|
229
|
+
def gems_gem_home
|
230
|
+
value = get('private_gems', false)
|
231
|
+
if value.respond_to?(:to_str)
|
232
|
+
return value
|
233
|
+
elsif value
|
234
|
+
default = File.join(ws.prefix_dir, 'gems')
|
235
|
+
set('private_gems', default)
|
236
|
+
default
|
237
|
+
else
|
238
|
+
Gem.user_dir
|
239
|
+
end
|
219
240
|
end
|
220
241
|
|
221
242
|
def ruby_executable
|
@@ -229,13 +250,15 @@ def ruby_executable
|
|
229
250
|
end
|
230
251
|
|
231
252
|
def validate_ruby_executable
|
253
|
+
actual = OSPackageResolver.autodetect_ruby_program
|
232
254
|
if has_value_for?('ruby_executable')
|
233
255
|
expected = get('ruby_executable')
|
234
|
-
if expected !=
|
235
|
-
raise ConfigError.new, "this autoproj installation was bootstrapped using #{expected}, but you are currently running under #{
|
256
|
+
if expected != actual
|
257
|
+
raise ConfigError.new, "this autoproj installation was bootstrapped using #{expected}, but you are currently running under #{actual}. This is usually caused by manually calling a wrong gem program (for instance, gem2.1 instead of gem2.0)"
|
236
258
|
end
|
259
|
+
else
|
260
|
+
set('ruby_executable', actual, true)
|
237
261
|
end
|
238
|
-
set('ruby_executable', ruby_executable, true)
|
239
262
|
end
|
240
263
|
|
241
264
|
def use_prerelease?
|
@@ -441,4 +464,3 @@ def prefer_indep_over_os_packages?
|
|
441
464
|
end
|
442
465
|
end
|
443
466
|
end
|
444
|
-
|
data/lib/autoproj/default.osdeps
CHANGED
@@ -225,6 +225,9 @@ def load_and_update_package_sets(root_pkg_set, options = Hash.new)
|
|
225
225
|
by_repository_id = Hash.new
|
226
226
|
by_name = Hash.new
|
227
227
|
|
228
|
+
required_remotes_dirs = Array.new
|
229
|
+
required_user_dirs = Array.new
|
230
|
+
|
228
231
|
queue = queue_auto_imports_if_needed(Array.new, root_pkg_set, root_pkg_set)
|
229
232
|
while !queue.empty?
|
230
233
|
vcs, import_options, imported_from = queue.shift
|
@@ -243,17 +246,30 @@ def load_and_update_package_sets(root_pkg_set, options = Hash.new)
|
|
243
246
|
end
|
244
247
|
by_repository_id[repository_id] = [vcs, imported_from]
|
245
248
|
|
249
|
+
# Make sure the package set has been already checked out to
|
250
|
+
# retrieve the actual name of the package set
|
246
251
|
if !vcs.local?
|
247
252
|
update_remote_package_set(vcs, options)
|
248
253
|
create_remote_set_user_dir(vcs)
|
254
|
+
raw_local_dir = PackageSet.raw_local_dir_of(vcs)
|
255
|
+
required_remotes_dirs << raw_local_dir
|
249
256
|
end
|
250
257
|
|
251
258
|
name = PackageSet.name_of(ws.manifest, vcs)
|
259
|
+
|
260
|
+
required_user_dirs = by_name.collect { |k,v| k }
|
261
|
+
Autoproj.debug "Trying to load package_set: #{name} from definition #{repository_id}"
|
262
|
+
Autoproj.debug "Already loaded package_sets are: #{required_user_dirs}"
|
263
|
+
|
252
264
|
if already_loaded = by_name[name]
|
253
265
|
already_loaded_pkg_set, already_loaded_vcs = *already_loaded
|
254
266
|
if already_loaded_vcs != vcs
|
255
267
|
if imported_from
|
256
|
-
Autoproj.warn "
|
268
|
+
Autoproj.warn "redundant auto-import by #{imported_from.name} for package set '#{name}'."
|
269
|
+
Autoproj.warn " A package set with the same name (#{name}) has already been imported from"
|
270
|
+
Autoproj.warn " #{already_loaded_vcs}"
|
271
|
+
Autoproj.warn " Skipping the following one: "
|
272
|
+
Autoproj.warn " #{vcs}"
|
257
273
|
else
|
258
274
|
Autoproj.warn "the manifest refers to a package set from #{vcs}, but a package set with the same name (#{name}) has already been imported from #{already_loaded_vcs}, I am skipping this one"
|
259
275
|
end
|
@@ -264,6 +280,8 @@ def load_and_update_package_sets(root_pkg_set, options = Hash.new)
|
|
264
280
|
imported_from.imports << already_loaded_pkg_set
|
265
281
|
end
|
266
282
|
next
|
283
|
+
else
|
284
|
+
create_remote_set_user_dir(vcs)
|
267
285
|
end
|
268
286
|
|
269
287
|
pkg_set = load_package_set(vcs, import_options, imported_from)
|
@@ -276,18 +294,20 @@ def load_and_update_package_sets(root_pkg_set, options = Hash.new)
|
|
276
294
|
queue_auto_imports_if_needed(queue, pkg_set, root_pkg_set)
|
277
295
|
end
|
278
296
|
|
279
|
-
cleanup_remotes_dir(package_sets)
|
280
|
-
cleanup_remotes_user_dir(package_sets)
|
297
|
+
cleanup_remotes_dir(package_sets, required_remotes_dirs)
|
298
|
+
cleanup_remotes_user_dir(package_sets, required_user_dirs)
|
281
299
|
package_sets
|
282
300
|
end
|
283
301
|
|
284
302
|
# Removes from {remotes_dir} the directories that do not match a package
|
285
303
|
# set
|
286
|
-
def cleanup_remotes_dir(package_sets = ws.manifest.package_sets)
|
304
|
+
def cleanup_remotes_dir(package_sets = ws.manifest.package_sets, required_remotes_dirs = Array.new)
|
287
305
|
# Cleanup the .remotes and remotes_symlinks_dir directories
|
288
306
|
Dir.glob(File.join(remotes_dir, '*')).each do |dir|
|
289
307
|
dir = File.expand_path(dir)
|
290
|
-
|
308
|
+
# Once a package set has been checked out during the process,
|
309
|
+
# keep it -- so that it won't be checked out again
|
310
|
+
if File.directory?(dir) && !required_remotes_dirs.include?(dir)
|
291
311
|
FileUtils.rm_rf dir
|
292
312
|
end
|
293
313
|
end
|
@@ -295,10 +315,11 @@ def cleanup_remotes_dir(package_sets = ws.manifest.package_sets)
|
|
295
315
|
|
296
316
|
# Removes from {remotes_user_dir} the directories that do not match a
|
297
317
|
# package set
|
298
|
-
def cleanup_remotes_user_dir(package_sets = ws.manifest.package_sets)
|
318
|
+
def cleanup_remotes_user_dir(package_sets = ws.manifest.package_sets, required_user_dirs = Array.new)
|
299
319
|
Dir.glob(File.join(remotes_user_dir, '*')).each do |file|
|
300
320
|
file = File.expand_path(file)
|
301
|
-
|
321
|
+
user_dir = File.basename(file)
|
322
|
+
if File.symlink?(file) && !required_user_dirs.include?(user_dir)
|
302
323
|
FileUtils.rm_f file
|
303
324
|
end
|
304
325
|
end
|
data/lib/autoproj/ops/install.rb
CHANGED
@@ -30,20 +30,15 @@ def initialize(root_dir)
|
|
30
30
|
@gemfile = default_gemfile_contents
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
@local = false
|
35
|
-
@env = self.class.clean_env
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.clean_env
|
39
|
-
env = Hash.new
|
33
|
+
@env = Hash.new
|
40
34
|
env['RUBYLIB'] = []
|
41
35
|
env['GEM_PATH'] = []
|
42
|
-
|
43
|
-
|
44
|
-
end
|
36
|
+
env['GEM_HOME'] = []
|
37
|
+
env['PATH'] = self.class.sanitize_env(ENV['PATH'] || "")
|
45
38
|
env['BUNDLE_GEMFILE'] = []
|
46
|
-
|
39
|
+
|
40
|
+
load_config
|
41
|
+
@local = false
|
47
42
|
end
|
48
43
|
|
49
44
|
def env_for_child
|
@@ -81,7 +76,7 @@ def self.in_workspace?(base_dir)
|
|
81
76
|
|
82
77
|
|
83
78
|
def dot_autoproj; File.join(root_dir, '.autoproj') end
|
84
|
-
|
79
|
+
|
85
80
|
def autoproj_install_dir; File.join(dot_autoproj, 'autoproj') end
|
86
81
|
# The path to the gemfile used to install autoproj
|
87
82
|
def autoproj_gemfile_path; File.join(autoproj_install_dir, 'Gemfile') end
|
@@ -93,18 +88,47 @@ def local?; !!@local end
|
|
93
88
|
def local=(flag); @local = flag end
|
94
89
|
|
95
90
|
# Whether bundler should be installed locally in {#dot_autoproj}
|
96
|
-
def private_bundler?;
|
91
|
+
def private_bundler?; !!@private_bundler end
|
92
|
+
# The path to the directory into which the bundler gem should be
|
93
|
+
# installed
|
94
|
+
def bundler_gem_home; @private_bundler || gem_bindir end
|
97
95
|
# (see #private_bundler?)
|
98
|
-
def private_bundler=(flag)
|
96
|
+
def private_bundler=(flag)
|
97
|
+
@private_bundler =
|
98
|
+
if flag.respond_to?(:to_str) then File.expand_path(flag)
|
99
|
+
elsif flag
|
100
|
+
File.join(dot_autoproj, 'bundler')
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
99
104
|
# Whether autoproj should be installed locally in {#dot_autoproj}
|
100
|
-
def private_autoproj?;
|
105
|
+
def private_autoproj?; !!@private_autoproj end
|
106
|
+
# The path to the directory into which the autoproj gem should be
|
107
|
+
# installed
|
108
|
+
def autoproj_gem_home; @private_autoproj || gem_bindir end
|
101
109
|
# (see #private_autoproj?)
|
102
|
-
def private_autoproj=(flag)
|
103
|
-
|
104
|
-
|
105
|
-
|
110
|
+
def private_autoproj=(flag)
|
111
|
+
@private_autoproj =
|
112
|
+
if flag.respond_to?(:to_str) then File.expand_path(flag)
|
113
|
+
elsif flag
|
114
|
+
File.join(dot_autoproj, 'autoproj')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Whether autoproj should be installed locally in {#dot_autoproj}
|
119
|
+
#
|
120
|
+
# Unlike for {#private_autoproj?} and {#private_bundler?}, there is
|
121
|
+
# no default path to save the gems as we don't yet know the path to
|
122
|
+
# the prefix directory
|
123
|
+
def private_gems?; !!@private_gems end
|
106
124
|
# (see #private_gems?)
|
107
|
-
def private_gems=(
|
125
|
+
def private_gems=(value)
|
126
|
+
@private_gems =
|
127
|
+
if value.respond_to?(:to_str) then File.expand_path(value)
|
128
|
+
else value
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
108
132
|
# Whether autoproj should prefer OS-independent packages over their
|
109
133
|
# OS-packaged equivalents (e.g. the thor gem vs. the ruby-thor
|
110
134
|
# Debian package)
|
@@ -146,19 +170,19 @@ def parse_options(args = ARGV)
|
|
146
170
|
opt.on '--local', 'do not access the network (may fail)' do
|
147
171
|
@local = true
|
148
172
|
end
|
149
|
-
opt.on '--private-bundler', 'install bundler locally in the workspace' do
|
150
|
-
|
173
|
+
opt.on '--private-bundler[=PATH]', 'install bundler locally in the workspace' do |path|
|
174
|
+
self.private_bundler = path || true
|
151
175
|
end
|
152
|
-
opt.on '--private-autoproj', 'install autoproj locally in the workspace' do
|
153
|
-
|
176
|
+
opt.on '--private-autoproj[=PATH]', 'install autoproj locally in the workspace' do |path|
|
177
|
+
self.private_autoproj = path || true
|
154
178
|
end
|
155
|
-
opt.on '--private-gems', 'install gems locally in the prefix directory' do
|
156
|
-
|
179
|
+
opt.on '--private-gems[=PATH]', 'install gems locally in the prefix directory' do |path|
|
180
|
+
self.private_gems = path || true
|
157
181
|
end
|
158
|
-
opt.on '--private', 'whether bundler, autoproj and the workspace gems should be installed locally in the workspace' do
|
159
|
-
|
160
|
-
|
161
|
-
|
182
|
+
opt.on '--private[=PATH]', 'whether bundler, autoproj and the workspace gems should be installed locally in the workspace' do |path|
|
183
|
+
self.private_bundler = path || true
|
184
|
+
self.private_autoproj = path || true
|
185
|
+
self.private_gems = path || true
|
162
186
|
end
|
163
187
|
opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided string as a version constraint for autoproj' do |version|
|
164
188
|
@gemfile = default_gemfile_contents(version)
|
@@ -180,54 +204,51 @@ def install_bundler
|
|
180
204
|
local = ['--local'] if local?
|
181
205
|
|
182
206
|
result = system(
|
183
|
-
env_for_child.merge('GEM_PATH' =>
|
184
|
-
gem_program, 'install', '--no-document', '--no-
|
207
|
+
env_for_child.merge('GEM_PATH' => "", 'GEM_HOME' => bundler_gem_home),
|
208
|
+
gem_program, 'install', '--no-document', '--no-format-executable',
|
185
209
|
*local,
|
186
|
-
"--bindir=#{File.join(
|
210
|
+
"--bindir=#{File.join(bundler_gem_home, 'bin')}", 'bundler')
|
187
211
|
|
188
212
|
if !result
|
189
213
|
STDERR.puts "FATAL: failed to install bundler in #{dot_autoproj}"
|
190
214
|
exit 1
|
191
215
|
end
|
192
|
-
|
193
|
-
File.join(bundler_install_dir, 'bin', 'bundler')
|
216
|
+
File.join(bundler_gem_home, 'bin', 'bundler')
|
194
217
|
end
|
195
218
|
|
196
219
|
def find_bundler
|
197
|
-
self.env['PATH'].unshift gem_bindir
|
198
220
|
clean_env = env_for_child
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
result = system(clean_env, Gem.ruby, '-S', 'gem', 'install', 'bundler')
|
210
|
-
if !result
|
211
|
-
if ENV['PATH'] != clean_path
|
212
|
-
STDERR.puts " it appears that you already have some autoproj-generated env.sh loaded"
|
213
|
-
STDERR.puts " - if you are running 'autoproj upgrade', please contact the autoproj author at https://github.com/rock-core/autoproj/issues/new"
|
214
|
-
STDERR.puts " - if you are running an install, try again in a console where the env.sh is not loaded"
|
215
|
-
exit 1
|
216
|
-
else
|
217
|
-
STDERR.puts " the recommended action is to install it manually first by running 'gem install bundler'"
|
218
|
-
STDERR.puts " or call this command again with --private-bundler to have it installed in the workspace"
|
219
|
-
exit 1
|
220
|
-
end
|
221
|
-
end
|
221
|
+
if bundler = find_in_clean_path('bundler', gem_bindir)
|
222
|
+
return bundler
|
223
|
+
end
|
224
|
+
|
225
|
+
clean_path = env_for_child['PATH']
|
226
|
+
STDERR.puts "cannot find 'bundler' in PATH=#{clean_path}#{File::PATH_SEPARATOR}#{gem_bindir}"
|
227
|
+
STDERR.puts "installing it now ..."
|
228
|
+
result = system(
|
229
|
+
clean_env.merge('GEM_PATH' => "", 'GEM_HOME' => bundler_gem_path),
|
230
|
+
Gem.ruby, '-S', 'gem', 'install', 'bundler')
|
222
231
|
|
223
|
-
|
224
|
-
if
|
225
|
-
STDERR.puts "
|
226
|
-
STDERR.puts "
|
232
|
+
if !result
|
233
|
+
if ENV['PATH'] != clean_path
|
234
|
+
STDERR.puts " it appears that you already have some autoproj-generated env.sh loaded"
|
235
|
+
STDERR.puts " - if you are running 'autoproj upgrade', please contact the autoproj author at https://github.com/rock-core/autoproj/issues/new"
|
236
|
+
STDERR.puts " - if you are running an install, try again in a console where the env.sh is not loaded"
|
237
|
+
exit 1
|
238
|
+
else
|
239
|
+
STDERR.puts " the recommended action is to install it manually first by running 'gem install bundler'"
|
240
|
+
STDERR.puts " or call this command again with --private-bundler to have it installed in the workspace"
|
241
|
+
exit 1
|
227
242
|
end
|
228
243
|
end
|
229
244
|
|
230
|
-
bundler
|
245
|
+
bundler = File.join(bundler_gem_path, 'bin', 'bundler')
|
246
|
+
if File.exist?(bundler)
|
247
|
+
bundler
|
248
|
+
else
|
249
|
+
STDERR.puts "gem install bundler returned successfully, but still cannot find bundler in #{bundler}"
|
250
|
+
nil
|
251
|
+
end
|
231
252
|
end
|
232
253
|
|
233
254
|
def install_autoproj(bundler)
|
@@ -238,17 +259,17 @@ def install_autoproj(bundler)
|
|
238
259
|
FileUtils.rm lockfile
|
239
260
|
end
|
240
261
|
|
241
|
-
|
242
|
-
clean_env = env_for_child.merge('BUNDLE_GEMFILE' => nil)
|
262
|
+
clean_env = env_for_child.dup
|
243
263
|
|
264
|
+
opts = Array.new
|
244
265
|
opts << '--local' if local?
|
245
266
|
if private_autoproj?
|
246
|
-
clean_env['GEM_PATH'] =
|
267
|
+
clean_env['GEM_PATH'] = bundler_gem_home
|
247
268
|
clean_env['GEM_HOME'] = nil
|
248
|
-
opts << "--clean" << "--path=#{
|
269
|
+
opts << "--clean" << "--path=#{autoproj_gem_home}"
|
249
270
|
end
|
250
271
|
binstubs_path = File.join(autoproj_install_dir, 'bin')
|
251
|
-
result = system(clean_env,
|
272
|
+
result = system(clean_env.merge('GEM_HOME' => autoproj_gem_home),
|
252
273
|
Gem.ruby, bundler, 'install',
|
253
274
|
"--gemfile=#{autoproj_gemfile_path}",
|
254
275
|
"--shebang=#{Gem.ruby}",
|
@@ -259,6 +280,17 @@ def install_autoproj(bundler)
|
|
259
280
|
STDERR.puts "FATAL: failed to install autoproj in #{dot_autoproj}"
|
260
281
|
exit 1
|
261
282
|
end
|
283
|
+
ensure
|
284
|
+
self.class.clean_binstubs(binstubs_path)
|
285
|
+
end
|
286
|
+
|
287
|
+
def self.clean_binstubs(binstubs_path)
|
288
|
+
%w{bundler bundle}.each do |bundler_bin|
|
289
|
+
path = File.join(binstubs_path, bundler_bin)
|
290
|
+
if File.file?(path)
|
291
|
+
FileUtils.rm path
|
292
|
+
end
|
293
|
+
end
|
262
294
|
|
263
295
|
# Now tune the binstubs to force the usage of the autoproj
|
264
296
|
# gemfile. Otherwise, they get BUNDLE_GEMFILE from the
|
@@ -279,15 +311,6 @@ def install_autoproj(bundler)
|
|
279
311
|
io.write filtered.join("")
|
280
312
|
end
|
281
313
|
end
|
282
|
-
|
283
|
-
env['PATH'].unshift File.join(autoproj_install_dir, 'bin')
|
284
|
-
if private_autoproj?
|
285
|
-
env['GEM_PATH'].unshift autoproj_install_dir
|
286
|
-
end
|
287
|
-
ensure
|
288
|
-
if binstubs_path
|
289
|
-
FileUtils.rm_f File.join(binstubs_path, 'bundler')
|
290
|
-
end
|
291
314
|
end
|
292
315
|
|
293
316
|
def save_env_sh(*vars)
|
@@ -327,8 +350,8 @@ def save_gemfile
|
|
327
350
|
ENV_BUNDLE_GEMFILE_RX = /^(\s*ENV\[['"]BUNDLE_GEMFILE['"]\]\s*)(?:\|\|)?=/
|
328
351
|
|
329
352
|
|
330
|
-
def find_in_clean_path(command)
|
331
|
-
clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR)
|
353
|
+
def find_in_clean_path(command, *additional_paths)
|
354
|
+
clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR) + additional_paths
|
332
355
|
clean_path.each do |p|
|
333
356
|
full_path = File.join(p, command)
|
334
357
|
if File.file?(full_path)
|
@@ -352,7 +375,7 @@ def gem_bindir
|
|
352
375
|
#
|
353
376
|
# So, we're calling 'gem' as a subcommand to discovery the
|
354
377
|
# actual bindir
|
355
|
-
bindir = IO.popen(env_for_child, [Gem.ruby, '-e', 'puts Gem.
|
378
|
+
bindir = IO.popen(env_for_child, [Gem.ruby, '-e', 'puts "#{Gem.user_dir}/bin"']).read
|
356
379
|
if bindir
|
357
380
|
@gem_bindir = bindir.chomp
|
358
381
|
else
|
@@ -362,11 +385,12 @@ def gem_bindir
|
|
362
385
|
|
363
386
|
def install
|
364
387
|
if private_bundler?
|
365
|
-
puts "Installing bundler in #{
|
388
|
+
puts "Installing bundler in #{bundler_gem_home}"
|
366
389
|
bundler = install_bundler
|
367
|
-
|
368
|
-
bundler = find_bundler
|
390
|
+
elsif bundler = find_bundler
|
369
391
|
puts "Detected bundler at #{bundler}"
|
392
|
+
else
|
393
|
+
exit 1
|
370
394
|
end
|
371
395
|
save_gemfile
|
372
396
|
puts "Installing autoproj in #{dot_autoproj}"
|
@@ -384,6 +408,17 @@ def load_config
|
|
384
408
|
config.merge!(YAML.load(File.read(autoproj_config_path)))
|
385
409
|
end
|
386
410
|
|
411
|
+
ruby = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
412
|
+
ruby_bindir = RbConfig::CONFIG['bindir']
|
413
|
+
ruby_executable = File.join(ruby_bindir, ruby)
|
414
|
+
if current = config['ruby_executable'] # When upgrading or reinstalling
|
415
|
+
if current != ruby_executable
|
416
|
+
raise "this workspace has already been initialized using #{current}, you cannot run autoproj install with #{ruby_executable}. If you know what you're doing, delete the ruby_executable line in config.yml and try again"
|
417
|
+
end
|
418
|
+
else
|
419
|
+
config['ruby_executable'] = ruby_executable
|
420
|
+
end
|
421
|
+
|
387
422
|
@config = config
|
388
423
|
%w{private_bundler private_gems private_autoproj prefer_indep_over_os_packages}.each do |flag|
|
389
424
|
instance_variable_set "@#{flag}", config.fetch(flag, false)
|
@@ -391,25 +426,33 @@ def load_config
|
|
391
426
|
end
|
392
427
|
|
393
428
|
def save_config
|
394
|
-
config['private_bundler'] = private_bundler?
|
395
|
-
config['private_autoproj'] = private_autoproj?
|
396
|
-
config['private_gems']
|
429
|
+
config['private_bundler'] = (bundler_gem_home if private_bundler?)
|
430
|
+
config['private_autoproj'] = (autoproj_gem_home if private_autoproj?)
|
431
|
+
config['private_gems'] = @private_gems
|
397
432
|
config['prefer_indep_over_os_packages'] = prefer_indep_over_os_packages?
|
398
433
|
File.open(autoproj_config_path, 'w') { |io| YAML.dump(config, io) }
|
399
434
|
end
|
400
435
|
|
436
|
+
def autoproj_path
|
437
|
+
File.join(autoproj_install_dir, 'bin', 'autoproj')
|
438
|
+
end
|
439
|
+
|
440
|
+
def run_autoproj(*args)
|
441
|
+
system env_for_child.merge('BUNDLE_GEMFILE' => autoproj_gemfile_path),
|
442
|
+
Gem.ruby, autoproj_path, *args
|
443
|
+
end
|
444
|
+
|
401
445
|
def stage1
|
402
446
|
FileUtils.mkdir_p dot_autoproj
|
403
447
|
save_config
|
404
448
|
install
|
449
|
+
end
|
405
450
|
|
451
|
+
def call_stage2
|
406
452
|
clean_env = env_for_child
|
407
453
|
stage2_vars = clean_env.map { |k, v| "#{k}=#{v}" }
|
408
454
|
puts "starting the newly installed autoproj for stage2 install"
|
409
|
-
|
410
|
-
Gem.ruby, File.join(autoproj_install_dir, 'bin', 'autoproj'),
|
411
|
-
'install-stage2', root_dir, *stage2_vars
|
412
|
-
if !result
|
455
|
+
if !run_autoproj('install-stage2', root_dir, *stage2_vars)
|
413
456
|
raise "failed to execute autoproj install-stage2"
|
414
457
|
end
|
415
458
|
end
|
@@ -419,7 +462,7 @@ def stage2(*vars)
|
|
419
462
|
puts "saving env.sh and .autoproj/env.sh"
|
420
463
|
save_env_sh(*vars)
|
421
464
|
puts "calling autoproj envsh"
|
422
|
-
system(Gem.ruby,
|
465
|
+
system(Gem.ruby, autoproj_path, 'envsh')
|
423
466
|
end
|
424
467
|
end
|
425
468
|
end
|