autoproj 2.0.0.rc9 → 2.0.0.rc10
Sign up to get free protection for your applications and to get access to all the features.
- 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
|