autoproj 2.0.0.rc5 → 2.0.0.rc6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: df06bafc27ce59e3c5ad6c46590c44045755f496
4
- data.tar.gz: 340b8871ba997370ed1b8b6fc526a7388c30de18
3
+ metadata.gz: 41b7b5cc8969f1630e17120dd32b47332d17c005
4
+ data.tar.gz: 8f58b3e604cd28f113130babad1734142022f7c5
5
5
  SHA512:
6
- metadata.gz: 44b11ccb7dacb6e6dac7f3fad212c5755e5fd00fb2416ef303744333b7c26afa09894af22a755a3ef69dbdc04a4d05f87a556e104ebb87e7fc35c8e67cac1e3b
7
- data.tar.gz: e65540e5a2a77faf9e10e0a425e5f723ae25737f76575ed0e31b2050e66e6072c2210c0431f90da82e9fa237ef642b5e153c45ff3e62afe032a00afb0960c71f
6
+ metadata.gz: e6804b7d07665ef3d29456b01c267c27f59f7c5244a7af3cf4466b8c0a8e55e61604eedf6a1af723b24c4804ec988679f3732d9a799d2a963550245636aa01a9
7
+ data.tar.gz: a81c7bb354134172817c912e2031400b89d687e54d3d9c9c9bc4e76b6329150d84ccf5d9f81e3d58ed085d892660c1a8f701a1bacbcae8cd80bcd172dd13c97f
@@ -26,6 +26,8 @@ module Autoproj
26
26
  attr_accessor :gemfile
27
27
  # The environment that is passed to the bundler installs
28
28
  attr_reader :env
29
+ # The configuration hash
30
+ attr_reader :config
29
31
 
30
32
  def initialize(root_dir)
31
33
  @root_dir = root_dir
@@ -35,9 +37,7 @@ module Autoproj
35
37
  @gemfile = default_gemfile_contents
36
38
  end
37
39
 
38
- @private_bundler = false
39
- @private_autoproj = false
40
- @private_gems = false
40
+ load_config
41
41
  @local = false
42
42
  @env = self.class.clean_env
43
43
  end
@@ -49,7 +49,7 @@ module Autoproj
49
49
  %w{PATH GEM_HOME}.each do |name|
50
50
  env[name] = sanitize_env(ENV[name] || "")
51
51
  end
52
- env['BUNDLE_GEMFILE'] = nil
52
+ env['BUNDLE_GEMFILE'] = []
53
53
  env
54
54
  end
55
55
 
@@ -60,6 +60,16 @@ module Autoproj
60
60
  end
61
61
  end
62
62
 
63
+ def apply_env(env)
64
+ env.each do |k, v|
65
+ if v
66
+ ENV[k] = v
67
+ else
68
+ ENV.delete(k)
69
+ end
70
+ end
71
+ end
72
+
63
73
  def self.sanitize_env(value)
64
74
  value.split(File::PATH_SEPARATOR).
65
75
  find_all { |p| !in_workspace?(p) }
@@ -78,7 +88,6 @@ module Autoproj
78
88
 
79
89
 
80
90
  def dot_autoproj; File.join(root_dir, '.autoproj') end
81
- def bin_dir; File.join(dot_autoproj, 'bin') end
82
91
  def bundler_install_dir; File.join(dot_autoproj, 'bundler') end
83
92
  def autoproj_install_dir; File.join(dot_autoproj, 'autoproj') end
84
93
  # The path to the gemfile used to install autoproj
@@ -93,16 +102,22 @@ module Autoproj
93
102
  # Whether bundler should be installed locally in {#dot_autoproj}
94
103
  def private_bundler?; @private_bundler end
95
104
  # (see #private_bundler?)
96
- def private_bundler=(flag); @private_bundler = flag end
105
+ def private_bundler=(flag); @private_bundler = !!flag end
97
106
  # Whether autoproj should be installed locally in {#dot_autoproj}
98
107
  def private_autoproj?; @private_autoproj end
99
108
  # (see #private_autoproj?)
100
- def private_autoproj=(flag); @private_autoproj = flag end
109
+ def private_autoproj=(flag); @private_autoproj = !!flag end
101
110
  # Whether bundler should be installed locally in the workspace
102
111
  # prefix directory
103
112
  def private_gems?; @private_gems end
104
113
  # (see #private_gems?)
105
- def private_gems=(flag); @private_gems = flag end
114
+ def private_gems=(flag); @private_gems = !!flag end
115
+ # Whether autoproj should prefer OS-independent packages over their
116
+ # OS-packaged equivalents (e.g. the thor gem vs. the ruby-thor
117
+ # Debian package)
118
+ def prefer_indep_over_os_packages?; @prefer_indep_over_os_packages end
119
+ # (see #private_gems?)
120
+ def prefer_indep_over_os_packages=(flag); @prefer_indep_over_os_packages = !!flag end
106
121
 
107
122
  def guess_gem_program
108
123
  ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
@@ -158,6 +173,9 @@ module Autoproj
158
173
  opt.on '--gemfile=PATH', String, 'use the given Gemfile to install autoproj instead of the default' do |path|
159
174
  @gemfile = File.read(path)
160
175
  end
176
+ opt.on '--prefer-os-independent-packages', 'prefer OS-independent packages (such as a RubyGem) over their OS-packaged equivalent (e.g. the thor gem vs. the ruby-thor debian package)' do
177
+ @prefer_indep_over_os_packages = true
178
+ end
161
179
  end
162
180
  options.parse(ARGV)
163
181
  end
@@ -178,77 +196,72 @@ module Autoproj
178
196
  STDERR.puts "FATAL: failed to install bundler in #{dot_autoproj}"
179
197
  exit 1
180
198
  end
181
- env['GEM_PATH'] << bundler_install_dir
182
- env['PATH'] << File.join(bundler_install_dir, 'bin')
183
- File.join(bin_dir, 'bundler')
199
+ env['PATH'].unshift File.join(bundler_install_dir, 'bin')
200
+ File.join(bundler_install_dir, 'bin', 'bundler')
184
201
  end
185
202
 
186
- def save_env_sh
187
- env = Autobuild::Environment.new
188
- env.prepare
203
+ def find_bundler
204
+ self.env['PATH'].unshift gem_bindir
205
+ clean_env = env_for_child
206
+ Gem.paths = Hash[
207
+ 'GEM_HOME' => clean_env['GEM_HOME'] || Gem.default_dir,
208
+ 'GEM_PATH' => clean_env['GEM_PATH'] || nil
209
+ ]
189
210
 
190
- %w{GEM_HOME GEM_PATH}.each do |name|
191
- value = self.env[name]
192
- if value.empty?
193
- env.unset name
194
- else
195
- env.set name, *value
211
+ bundler = find_in_clean_path('bundler')
212
+ if !bundler
213
+ clean_path = env_for_child['PATH']
214
+ STDERR.puts "cannot find 'bundler' in PATH=#{clean_path}"
215
+ STDERR.puts "installing it now ..."
216
+ result = system(clean_env, Gem.ruby, '-S', 'gem', 'install', 'bundler')
217
+ if !result
218
+ if ENV['PATH'] != clean_path
219
+ STDERR.puts " it appears that you already have some autoproj-generated env.sh loaded"
220
+ STDERR.puts " - if you are running 'autoproj upgrade', please contact the autoproj author at https://github.com/rock-core/autoproj/issues/new"
221
+ STDERR.puts " - if you are running an install, try again in a console where the env.sh is not loaded"
222
+ exit 1
223
+ else
224
+ STDERR.puts " the recommended action is to install it manually first by running 'gem install bundler'"
225
+ STDERR.puts " or call this command again with --private-bundler to have it installed in the workspace"
226
+ exit 1
227
+ end
196
228
  end
197
- end
198
- env.push_path 'PATH', File.join(autoproj_install_dir, 'bin')
199
-
200
- if private_autoproj?
201
- env.push_path 'GEM_PATH', autoproj_install_dir
202
- end
203
-
204
- # Generate environment files right now, we can at least use bundler
205
- File.open(File.join(dot_autoproj, 'env.sh'), 'w') do |io|
206
- env.export_env_sh(io)
207
- end
208
229
 
209
- File.open(File.join(root_dir, 'env.sh'), 'w') do |io|
210
- io.write <<-EOSHELL
211
- source "#{File.join(dot_autoproj, 'env.sh')}"
212
- export AUTOPROJ_CURRENT_ROOT=#{root_dir}
213
- EOSHELL
230
+ bundler = find_in_clean_path('bundler')
231
+ if !bundler
232
+ STDERR.puts "FATAL: gem install bundler returned successfully, but still cannot find bundler"
233
+ STDERR.puts "FATAL: in #{clean_path}"
234
+ end
214
235
  end
215
- end
216
236
 
217
- def save_gemfile
218
- FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
219
- File.open(autoproj_gemfile_path, 'w') do |io|
220
- io.write gemfile
221
- end
237
+ bundler
222
238
  end
223
239
 
224
- ENV_BUNDLE_GEMFILE_RX = /^(\s*ENV\[['"]BUNDLE_GEMFILE['"]\]\s*)(?:\|\|)?=/
225
-
226
240
  def install_autoproj(bundler)
227
241
  # Force bundler to update. If the user does not want this, let him specify a
228
242
  # Gemfile with tighter version constraints
229
- lockfile = File.join(File.dirname(autoproj_gemfile_path), 'Gemfile.lock')
243
+ lockfile = File.join(File.dirname(autoproj_install_dir), 'Gemfile.lock')
230
244
  if File.exist?(lockfile)
231
245
  FileUtils.rm lockfile
232
246
  end
233
247
 
234
248
  opts = Array.new
235
- opts << '--local' if local?
249
+ clean_env = env_for_child.merge('BUNDLE_GEMFILE' => nil)
236
250
 
237
- env = env_for_child
251
+ opts << '--local' if local?
238
252
  if private_autoproj?
239
- env = env.merge(
240
- 'GEM_PATH' => bundler_install_dir,
241
- 'GEM_HOME' => nil)
253
+ clean_env['GEM_PATH'] = (bundler_install_dir if private_bundler?)
254
+ clean_env['GEM_HOME'] = nil
242
255
  opts << "--clean" << "--path=#{autoproj_install_dir}"
243
256
  end
244
-
245
257
  binstubs_path = File.join(autoproj_install_dir, 'bin')
246
-
247
- result = system(env,
258
+ result = system(clean_env,
248
259
  Gem.ruby, bundler, 'install',
249
260
  "--gemfile=#{autoproj_gemfile_path}",
261
+ "--shebang=#{Gem.ruby}",
250
262
  "--binstubs=#{binstubs_path}",
251
- *opts)
263
+ *opts, chdir: autoproj_install_dir)
264
+
252
265
  if !result
253
266
  STDERR.puts "FATAL: failed to install autoproj in #{dot_autoproj}"
254
267
  exit 1
@@ -259,10 +272,6 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
259
272
  # environment by default
260
273
  Dir.glob(File.join(binstubs_path, '*')) do |path|
261
274
  next if !File.file?(path)
262
- # Do NOT do that for bundler, otherwise it will fail with an
263
- # "already loaded gemfile" message once we e.g. try to do
264
- # 'bundler install --gemfile=NEW_GEMFILE'
265
- next if File.basename(path) == 'bundler'
266
275
 
267
276
  lines = File.readlines(path)
268
277
  matched = false
@@ -278,26 +287,53 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
278
287
  end
279
288
  end
280
289
 
281
- env['PATH'] << File.join(autoproj_install_dir, 'bin')
290
+ env['PATH'].unshift File.join(autoproj_install_dir, 'bin')
282
291
  if private_autoproj?
283
- env['GEM_PATH'] << autoproj_install_dir
292
+ env['GEM_PATH'].unshift autoproj_install_dir
293
+ end
294
+ ensure
295
+ if binstubs_path
296
+ FileUtils.rm_f File.join(binstubs_path, 'bundler')
284
297
  end
285
298
  end
286
299
 
287
- def update_configuration
288
- if File.exist?(autoproj_config_path)
289
- config = YAML.load(File.read(autoproj_config_path)) || Hash.new
290
- else
291
- config = Hash.new
300
+ def save_env_sh(*vars)
301
+ env = Autobuild::Environment.new
302
+ env.prepare
303
+ vars.each do |kv|
304
+ k, *v = kv.split("=")
305
+ v = v.join("=")
306
+
307
+ if v.empty?
308
+ env.unset k
309
+ else
310
+ env.set k, *v.split(File::PATH_SEPARATOR)
311
+ end
292
312
  end
293
- config['private_bundler'] = private_bundler?
294
- config['private_autoproj'] = private_autoproj?
295
- config['private_gems'] = private_gems?
296
- File.open(autoproj_config_path, 'w') do |io|
297
- YAML.dump(config, io)
313
+ # Generate environment files right now, we can at least use bundler
314
+ File.open(File.join(dot_autoproj, 'env.sh'), 'w') do |io|
315
+ env.export_env_sh(io)
316
+ end
317
+
318
+ # And now the root envsh
319
+ env = Autobuild::Environment.new
320
+ env.source_before File.join(dot_autoproj, 'env.sh')
321
+ env.set('AUTOPROJ_CURRENT_ROOT', root_dir)
322
+ File.open(File.join(root_dir, 'env.sh'), 'w') do |io|
323
+ env.export_env_sh(io)
298
324
  end
299
325
  end
300
326
 
327
+ def save_gemfile
328
+ FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
329
+ File.open(autoproj_gemfile_path, 'w') do |io|
330
+ io.write gemfile
331
+ end
332
+ end
333
+
334
+ ENV_BUNDLE_GEMFILE_RX = /^(\s*ENV\[['"]BUNDLE_GEMFILE['"]\]\s*)(?:\|\|)?=/
335
+
336
+
301
337
  def find_in_clean_path(command)
302
338
  clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR)
303
339
  clean_path.each do |p|
@@ -309,12 +345,10 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
309
345
  nil
310
346
  end
311
347
 
312
- def find_bundler
313
- clean_env = env_for_child
314
- Gem.paths = Hash[
315
- 'GEM_HOME' => clean_env['GEM_HOME'] || Gem.default_dir,
316
- 'GEM_PATH' => clean_env['GEM_PATH'] || nil
317
- ]
348
+ # The path of the bin/ folder for installed gems
349
+ def gem_bindir
350
+ return @gem_bindir if @gem_bindir
351
+
318
352
  # Here, we're getting into the esotheric
319
353
  #
320
354
  # The problem is that e.g. Ubuntu and Debian install an
@@ -325,30 +359,12 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
325
359
  #
326
360
  # So, we're calling 'gem' as a subcommand to discovery the
327
361
  # actual bindir
328
- bindir = IO.popen(clean_env, [Gem.ruby, '-e', 'puts Gem.bindir']).read
362
+ bindir = IO.popen(env_for_child, [Gem.ruby, '-e', 'puts Gem.bindir']).read
329
363
  if bindir
330
- env['PATH'].unshift bindir.chomp
364
+ @gem_bindir = bindir.chomp
331
365
  else
332
- STDERR.puts "FATAL: cannot run #{Gem.ruby} -e 'puts Gem.bindir'"
333
- exit 1
366
+ raise "FATAL: cannot run #{Gem.ruby} -e 'puts Gem.bindir'"
334
367
  end
335
-
336
- bundler = find_in_clean_path('bundler')
337
- if !bundler
338
- clean_path = env_for_child['PATH']
339
- STDERR.puts "FATAL: cannot find 'bundler' in PATH=#{clean_path}"
340
- if ENV['PATH'] != clean_path
341
- STDERR.puts " it appears that you already have some autoproj-generated env.sh loaded"
342
- STDERR.puts " - if you are running 'autoproj upgrade', please contact the autoproj author at https://github.com/rock-core/autoproj/issues/new"
343
- STDERR.puts " - if you are running an install, try again in a console where the env.sh is not loaded"
344
- exit 1
345
- else
346
- STDERR.puts " the recommended action is to install it manually first by running 'gem install bundler'"
347
- STDERR.puts " or call this command again with --private-bundler to have it installed in the workspace"
348
- exit 1
349
- end
350
- end
351
- bundler
352
368
  end
353
369
 
354
370
  def install
@@ -364,27 +380,54 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
364
380
  install_autoproj(bundler)
365
381
  end
366
382
 
367
- # Actually perform the install
368
- def run(stage2: false)
369
- if stage2
370
- require 'autobuild'
371
- save_env_sh
372
- else
373
- install
383
+ def load_config
384
+ v1_config_path = File.join(root_dir, 'autoproj', 'config.yml')
385
+
386
+ config = Hash.new
387
+ if File.file?(v1_config_path)
388
+ config.merge!(YAML.load(File.read(v1_config_path)))
389
+ end
390
+ if File.file?(autoproj_config_path)
391
+ config.merge!(YAML.load(File.read(autoproj_config_path)))
392
+ end
374
393
 
375
- env_for_child.each do |k, v|
376
- if v
377
- ENV[k] = v
378
- else
379
- ENV.delete(k)
380
- end
381
- end
382
- ENV['BUNDLE_GEMFILE'] = autoproj_gemfile_path
383
- update_configuration
384
- exec Gem.ruby, File.join(autoproj_install_dir, 'bin', 'autoproj'),
385
- 'install-stage2', root_dir
394
+ @config = config
395
+ %w{private_bundler private_gems private_autoproj prefer_indep_over_os_packages}.each do |flag|
396
+ instance_variable_set "@#{flag}", config.fetch(flag, false)
386
397
  end
387
398
  end
399
+
400
+ def save_config
401
+ config['private_bundler'] = private_bundler?
402
+ config['private_autoproj'] = private_autoproj?
403
+ config['private_gems'] = private_gems?
404
+ config['prefer_indep_over_os_packages'] = prefer_indep_over_os_packages?
405
+ File.open(autoproj_config_path, 'w') { |io| YAML.dump(config, io) }
406
+ end
407
+
408
+ def stage1
409
+ FileUtils.mkdir_p dot_autoproj
410
+ save_config
411
+ install
412
+
413
+ clean_env = env_for_child
414
+ stage2_vars = clean_env.map { |k, v| "#{k}=#{v}" }
415
+ puts "starting the newly installed autoproj for stage2 install"
416
+ puts [clean_env.merge('BUNDLE_GEMFILE' => autoproj_gemfile_path),
417
+ Gem.ruby, File.join(autoproj_install_dir, 'bin', 'autoproj'),
418
+ 'install-stage2', root_dir, *stage2_vars].inspect
419
+ exec clean_env.merge('BUNDLE_GEMFILE' => autoproj_gemfile_path),
420
+ Gem.ruby, File.join(autoproj_install_dir, 'bin', 'autoproj'),
421
+ 'install-stage2', root_dir, *stage2_vars
422
+ end
423
+
424
+ def stage2(*vars)
425
+ require 'autobuild'
426
+ puts "saving env.sh and .autoproj/env.sh"
427
+ save_env_sh(*vars)
428
+ puts "calling autoproj envsh"
429
+ system(Gem.ruby, $0, 'envsh')
430
+ end
388
431
  end
389
432
  end
390
433
  end
data/bin/autoproj_install CHANGED
@@ -26,6 +26,8 @@ module Autoproj
26
26
  attr_accessor :gemfile
27
27
  # The environment that is passed to the bundler installs
28
28
  attr_reader :env
29
+ # The configuration hash
30
+ attr_reader :config
29
31
 
30
32
  def initialize(root_dir)
31
33
  @root_dir = root_dir
@@ -35,9 +37,7 @@ module Autoproj
35
37
  @gemfile = default_gemfile_contents
36
38
  end
37
39
 
38
- @private_bundler = false
39
- @private_autoproj = false
40
- @private_gems = false
40
+ load_config
41
41
  @local = false
42
42
  @env = self.class.clean_env
43
43
  end
@@ -49,7 +49,7 @@ module Autoproj
49
49
  %w{PATH GEM_HOME}.each do |name|
50
50
  env[name] = sanitize_env(ENV[name] || "")
51
51
  end
52
- env['BUNDLE_GEMFILE'] = nil
52
+ env['BUNDLE_GEMFILE'] = []
53
53
  env
54
54
  end
55
55
 
@@ -60,6 +60,16 @@ module Autoproj
60
60
  end
61
61
  end
62
62
 
63
+ def apply_env(env)
64
+ env.each do |k, v|
65
+ if v
66
+ ENV[k] = v
67
+ else
68
+ ENV.delete(k)
69
+ end
70
+ end
71
+ end
72
+
63
73
  def self.sanitize_env(value)
64
74
  value.split(File::PATH_SEPARATOR).
65
75
  find_all { |p| !in_workspace?(p) }
@@ -78,7 +88,6 @@ module Autoproj
78
88
 
79
89
 
80
90
  def dot_autoproj; File.join(root_dir, '.autoproj') end
81
- def bin_dir; File.join(dot_autoproj, 'bin') end
82
91
  def bundler_install_dir; File.join(dot_autoproj, 'bundler') end
83
92
  def autoproj_install_dir; File.join(dot_autoproj, 'autoproj') end
84
93
  # The path to the gemfile used to install autoproj
@@ -93,16 +102,22 @@ module Autoproj
93
102
  # Whether bundler should be installed locally in {#dot_autoproj}
94
103
  def private_bundler?; @private_bundler end
95
104
  # (see #private_bundler?)
96
- def private_bundler=(flag); @private_bundler = flag end
105
+ def private_bundler=(flag); @private_bundler = !!flag end
97
106
  # Whether autoproj should be installed locally in {#dot_autoproj}
98
107
  def private_autoproj?; @private_autoproj end
99
108
  # (see #private_autoproj?)
100
- def private_autoproj=(flag); @private_autoproj = flag end
109
+ def private_autoproj=(flag); @private_autoproj = !!flag end
101
110
  # Whether bundler should be installed locally in the workspace
102
111
  # prefix directory
103
112
  def private_gems?; @private_gems end
104
113
  # (see #private_gems?)
105
- def private_gems=(flag); @private_gems = flag end
114
+ def private_gems=(flag); @private_gems = !!flag end
115
+ # Whether autoproj should prefer OS-independent packages over their
116
+ # OS-packaged equivalents (e.g. the thor gem vs. the ruby-thor
117
+ # Debian package)
118
+ def prefer_indep_over_os_packages?; @prefer_indep_over_os_packages end
119
+ # (see #private_gems?)
120
+ def prefer_indep_over_os_packages=(flag); @prefer_indep_over_os_packages = !!flag end
106
121
 
107
122
  def guess_gem_program
108
123
  ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
@@ -158,6 +173,9 @@ module Autoproj
158
173
  opt.on '--gemfile=PATH', String, 'use the given Gemfile to install autoproj instead of the default' do |path|
159
174
  @gemfile = File.read(path)
160
175
  end
176
+ opt.on '--prefer-os-independent-packages', 'prefer OS-independent packages (such as a RubyGem) over their OS-packaged equivalent (e.g. the thor gem vs. the ruby-thor debian package)' do
177
+ @prefer_indep_over_os_packages = true
178
+ end
161
179
  end
162
180
  options.parse(ARGV)
163
181
  end
@@ -178,77 +196,72 @@ module Autoproj
178
196
  STDERR.puts "FATAL: failed to install bundler in #{dot_autoproj}"
179
197
  exit 1
180
198
  end
181
- env['GEM_PATH'] << bundler_install_dir
182
- env['PATH'] << File.join(bundler_install_dir, 'bin')
183
- File.join(bin_dir, 'bundler')
199
+ env['PATH'].unshift File.join(bundler_install_dir, 'bin')
200
+ File.join(bundler_install_dir, 'bin', 'bundler')
184
201
  end
185
202
 
186
- def save_env_sh
187
- env = Autobuild::Environment.new
188
- env.prepare
203
+ def find_bundler
204
+ self.env['PATH'].unshift gem_bindir
205
+ clean_env = env_for_child
206
+ Gem.paths = Hash[
207
+ 'GEM_HOME' => clean_env['GEM_HOME'] || Gem.default_dir,
208
+ 'GEM_PATH' => clean_env['GEM_PATH'] || nil
209
+ ]
189
210
 
190
- %w{GEM_HOME GEM_PATH}.each do |name|
191
- value = self.env[name]
192
- if value.empty?
193
- env.unset name
194
- else
195
- env.set name, *value
211
+ bundler = find_in_clean_path('bundler')
212
+ if !bundler
213
+ clean_path = env_for_child['PATH']
214
+ STDERR.puts "cannot find 'bundler' in PATH=#{clean_path}"
215
+ STDERR.puts "installing it now ..."
216
+ result = system(clean_env, Gem.ruby, '-S', 'gem', 'install', 'bundler')
217
+ if !result
218
+ if ENV['PATH'] != clean_path
219
+ STDERR.puts " it appears that you already have some autoproj-generated env.sh loaded"
220
+ STDERR.puts " - if you are running 'autoproj upgrade', please contact the autoproj author at https://github.com/rock-core/autoproj/issues/new"
221
+ STDERR.puts " - if you are running an install, try again in a console where the env.sh is not loaded"
222
+ exit 1
223
+ else
224
+ STDERR.puts " the recommended action is to install it manually first by running 'gem install bundler'"
225
+ STDERR.puts " or call this command again with --private-bundler to have it installed in the workspace"
226
+ exit 1
227
+ end
196
228
  end
197
- end
198
- env.push_path 'PATH', File.join(autoproj_install_dir, 'bin')
199
-
200
- if private_autoproj?
201
- env.push_path 'GEM_PATH', autoproj_install_dir
202
- end
203
-
204
- # Generate environment files right now, we can at least use bundler
205
- File.open(File.join(dot_autoproj, 'env.sh'), 'w') do |io|
206
- env.export_env_sh(io)
207
- end
208
229
 
209
- File.open(File.join(root_dir, 'env.sh'), 'w') do |io|
210
- io.write <<-EOSHELL
211
- source "#{File.join(dot_autoproj, 'env.sh')}"
212
- export AUTOPROJ_CURRENT_ROOT=#{root_dir}
213
- EOSHELL
230
+ bundler = find_in_clean_path('bundler')
231
+ if !bundler
232
+ STDERR.puts "FATAL: gem install bundler returned successfully, but still cannot find bundler"
233
+ STDERR.puts "FATAL: in #{clean_path}"
234
+ end
214
235
  end
215
- end
216
236
 
217
- def save_gemfile
218
- FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
219
- File.open(autoproj_gemfile_path, 'w') do |io|
220
- io.write gemfile
221
- end
237
+ bundler
222
238
  end
223
239
 
224
- ENV_BUNDLE_GEMFILE_RX = /^(\s*ENV\[['"]BUNDLE_GEMFILE['"]\]\s*)(?:\|\|)?=/
225
-
226
240
  def install_autoproj(bundler)
227
241
  # Force bundler to update. If the user does not want this, let him specify a
228
242
  # Gemfile with tighter version constraints
229
- lockfile = File.join(File.dirname(autoproj_gemfile_path), 'Gemfile.lock')
243
+ lockfile = File.join(File.dirname(autoproj_install_dir), 'Gemfile.lock')
230
244
  if File.exist?(lockfile)
231
245
  FileUtils.rm lockfile
232
246
  end
233
247
 
234
248
  opts = Array.new
235
- opts << '--local' if local?
249
+ clean_env = env_for_child.merge('BUNDLE_GEMFILE' => nil)
236
250
 
237
- env = env_for_child
251
+ opts << '--local' if local?
238
252
  if private_autoproj?
239
- env = env.merge(
240
- 'GEM_PATH' => bundler_install_dir,
241
- 'GEM_HOME' => nil)
253
+ clean_env['GEM_PATH'] = (bundler_install_dir if private_bundler?)
254
+ clean_env['GEM_HOME'] = nil
242
255
  opts << "--clean" << "--path=#{autoproj_install_dir}"
243
256
  end
244
-
245
257
  binstubs_path = File.join(autoproj_install_dir, 'bin')
246
-
247
- result = system(env,
258
+ result = system(clean_env,
248
259
  Gem.ruby, bundler, 'install',
249
260
  "--gemfile=#{autoproj_gemfile_path}",
261
+ "--shebang=#{Gem.ruby}",
250
262
  "--binstubs=#{binstubs_path}",
251
- *opts)
263
+ *opts, chdir: autoproj_install_dir)
264
+
252
265
  if !result
253
266
  STDERR.puts "FATAL: failed to install autoproj in #{dot_autoproj}"
254
267
  exit 1
@@ -259,10 +272,6 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
259
272
  # environment by default
260
273
  Dir.glob(File.join(binstubs_path, '*')) do |path|
261
274
  next if !File.file?(path)
262
- # Do NOT do that for bundler, otherwise it will fail with an
263
- # "already loaded gemfile" message once we e.g. try to do
264
- # 'bundler install --gemfile=NEW_GEMFILE'
265
- next if File.basename(path) == 'bundler'
266
275
 
267
276
  lines = File.readlines(path)
268
277
  matched = false
@@ -278,26 +287,53 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
278
287
  end
279
288
  end
280
289
 
281
- env['PATH'] << File.join(autoproj_install_dir, 'bin')
290
+ env['PATH'].unshift File.join(autoproj_install_dir, 'bin')
282
291
  if private_autoproj?
283
- env['GEM_PATH'] << autoproj_install_dir
292
+ env['GEM_PATH'].unshift autoproj_install_dir
293
+ end
294
+ ensure
295
+ if binstubs_path
296
+ FileUtils.rm_f File.join(binstubs_path, 'bundler')
284
297
  end
285
298
  end
286
299
 
287
- def update_configuration
288
- if File.exist?(autoproj_config_path)
289
- config = YAML.load(File.read(autoproj_config_path)) || Hash.new
290
- else
291
- config = Hash.new
300
+ def save_env_sh(*vars)
301
+ env = Autobuild::Environment.new
302
+ env.prepare
303
+ vars.each do |kv|
304
+ k, *v = kv.split("=")
305
+ v = v.join("=")
306
+
307
+ if v.empty?
308
+ env.unset k
309
+ else
310
+ env.set k, *v.split(File::PATH_SEPARATOR)
311
+ end
292
312
  end
293
- config['private_bundler'] = private_bundler?
294
- config['private_autoproj'] = private_autoproj?
295
- config['private_gems'] = private_gems?
296
- File.open(autoproj_config_path, 'w') do |io|
297
- YAML.dump(config, io)
313
+ # Generate environment files right now, we can at least use bundler
314
+ File.open(File.join(dot_autoproj, 'env.sh'), 'w') do |io|
315
+ env.export_env_sh(io)
316
+ end
317
+
318
+ # And now the root envsh
319
+ env = Autobuild::Environment.new
320
+ env.source_before File.join(dot_autoproj, 'env.sh')
321
+ env.set('AUTOPROJ_CURRENT_ROOT', root_dir)
322
+ File.open(File.join(root_dir, 'env.sh'), 'w') do |io|
323
+ env.export_env_sh(io)
298
324
  end
299
325
  end
300
326
 
327
+ def save_gemfile
328
+ FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
329
+ File.open(autoproj_gemfile_path, 'w') do |io|
330
+ io.write gemfile
331
+ end
332
+ end
333
+
334
+ ENV_BUNDLE_GEMFILE_RX = /^(\s*ENV\[['"]BUNDLE_GEMFILE['"]\]\s*)(?:\|\|)?=/
335
+
336
+
301
337
  def find_in_clean_path(command)
302
338
  clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR)
303
339
  clean_path.each do |p|
@@ -309,12 +345,10 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
309
345
  nil
310
346
  end
311
347
 
312
- def find_bundler
313
- clean_env = env_for_child
314
- Gem.paths = Hash[
315
- 'GEM_HOME' => clean_env['GEM_HOME'] || Gem.default_dir,
316
- 'GEM_PATH' => clean_env['GEM_PATH'] || nil
317
- ]
348
+ # The path of the bin/ folder for installed gems
349
+ def gem_bindir
350
+ return @gem_bindir if @gem_bindir
351
+
318
352
  # Here, we're getting into the esotheric
319
353
  #
320
354
  # The problem is that e.g. Ubuntu and Debian install an
@@ -325,30 +359,12 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
325
359
  #
326
360
  # So, we're calling 'gem' as a subcommand to discovery the
327
361
  # actual bindir
328
- bindir = IO.popen(clean_env, [Gem.ruby, '-e', 'puts Gem.bindir']).read
362
+ bindir = IO.popen(env_for_child, [Gem.ruby, '-e', 'puts Gem.bindir']).read
329
363
  if bindir
330
- env['PATH'].unshift bindir.chomp
364
+ @gem_bindir = bindir.chomp
331
365
  else
332
- STDERR.puts "FATAL: cannot run #{Gem.ruby} -e 'puts Gem.bindir'"
333
- exit 1
366
+ raise "FATAL: cannot run #{Gem.ruby} -e 'puts Gem.bindir'"
334
367
  end
335
-
336
- bundler = find_in_clean_path('bundler')
337
- if !bundler
338
- clean_path = env_for_child['PATH']
339
- STDERR.puts "FATAL: cannot find 'bundler' in PATH=#{clean_path}"
340
- if ENV['PATH'] != clean_path
341
- STDERR.puts " it appears that you already have some autoproj-generated env.sh loaded"
342
- STDERR.puts " - if you are running 'autoproj upgrade', please contact the autoproj author at https://github.com/rock-core/autoproj/issues/new"
343
- STDERR.puts " - if you are running an install, try again in a console where the env.sh is not loaded"
344
- exit 1
345
- else
346
- STDERR.puts " the recommended action is to install it manually first by running 'gem install bundler'"
347
- STDERR.puts " or call this command again with --private-bundler to have it installed in the workspace"
348
- exit 1
349
- end
350
- end
351
- bundler
352
368
  end
353
369
 
354
370
  def install
@@ -364,27 +380,54 @@ export AUTOPROJ_CURRENT_ROOT=#{root_dir}
364
380
  install_autoproj(bundler)
365
381
  end
366
382
 
367
- # Actually perform the install
368
- def run(stage2: false)
369
- if stage2
370
- require 'autobuild'
371
- save_env_sh
372
- else
373
- install
383
+ def load_config
384
+ v1_config_path = File.join(root_dir, 'autoproj', 'config.yml')
385
+
386
+ config = Hash.new
387
+ if File.file?(v1_config_path)
388
+ config.merge!(YAML.load(File.read(v1_config_path)))
389
+ end
390
+ if File.file?(autoproj_config_path)
391
+ config.merge!(YAML.load(File.read(autoproj_config_path)))
392
+ end
374
393
 
375
- env_for_child.each do |k, v|
376
- if v
377
- ENV[k] = v
378
- else
379
- ENV.delete(k)
380
- end
381
- end
382
- ENV['BUNDLE_GEMFILE'] = autoproj_gemfile_path
383
- update_configuration
384
- exec Gem.ruby, File.join(autoproj_install_dir, 'bin', 'autoproj'),
385
- 'install-stage2', root_dir
394
+ @config = config
395
+ %w{private_bundler private_gems private_autoproj prefer_indep_over_os_packages}.each do |flag|
396
+ instance_variable_set "@#{flag}", config.fetch(flag, false)
386
397
  end
387
398
  end
399
+
400
+ def save_config
401
+ config['private_bundler'] = private_bundler?
402
+ config['private_autoproj'] = private_autoproj?
403
+ config['private_gems'] = private_gems?
404
+ config['prefer_indep_over_os_packages'] = prefer_indep_over_os_packages?
405
+ File.open(autoproj_config_path, 'w') { |io| YAML.dump(config, io) }
406
+ end
407
+
408
+ def stage1
409
+ FileUtils.mkdir_p dot_autoproj
410
+ save_config
411
+ install
412
+
413
+ clean_env = env_for_child
414
+ stage2_vars = clean_env.map { |k, v| "#{k}=#{v}" }
415
+ puts "starting the newly installed autoproj for stage2 install"
416
+ puts [clean_env.merge('BUNDLE_GEMFILE' => autoproj_gemfile_path),
417
+ Gem.ruby, File.join(autoproj_install_dir, 'bin', 'autoproj'),
418
+ 'install-stage2', root_dir, *stage2_vars].inspect
419
+ exec clean_env.merge('BUNDLE_GEMFILE' => autoproj_gemfile_path),
420
+ Gem.ruby, File.join(autoproj_install_dir, 'bin', 'autoproj'),
421
+ 'install-stage2', root_dir, *stage2_vars
422
+ end
423
+
424
+ def stage2(*vars)
425
+ require 'autobuild'
426
+ puts "saving env.sh and .autoproj/env.sh"
427
+ save_env_sh(*vars)
428
+ puts "calling autoproj envsh"
429
+ system(Gem.ruby, $0, 'envsh')
430
+ end
388
431
  end
389
432
  end
390
433
  end
@@ -395,4 +438,4 @@ ENV.delete('BUNDLE_GEMFILE')
395
438
  ENV.delete('RUBYLIB')
396
439
  ops = Autoproj::Ops::Install.new(Dir.pwd)
397
440
  ops.parse_options(ARGV)
398
- ops.run
441
+ ops.stage1