autoproj 2.7.1 → 2.8.0

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.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +31 -1
  3. data/autoproj.gemspec +2 -0
  4. data/bin/alocate +3 -5
  5. data/bin/alog +3 -3
  6. data/bin/amake +3 -4
  7. data/bin/aup +4 -3
  8. data/bin/autoproj +1 -6
  9. data/bin/autoproj_bootstrap +153 -47
  10. data/bin/autoproj_install +153 -47
  11. data/lib/autoproj/autobuild_extensions/dsl.rb +5 -0
  12. data/lib/autoproj/bash_completion.rb +26 -0
  13. data/lib/autoproj/cli/base.rb +4 -4
  14. data/lib/autoproj/cli/build.rb +2 -3
  15. data/lib/autoproj/cli/main.rb +52 -2
  16. data/lib/autoproj/cli/main_global.rb +39 -0
  17. data/lib/autoproj/cli/osdeps.rb +2 -1
  18. data/lib/autoproj/cli/update.rb +13 -1
  19. data/lib/autoproj/configuration.rb +14 -2
  20. data/lib/autoproj/environment.rb +48 -31
  21. data/lib/autoproj/ops/install.rb +153 -47
  22. data/lib/autoproj/shell_completion.rb +164 -0
  23. data/lib/autoproj/templates/helpers.bash.erb +79 -0
  24. data/lib/autoproj/templates/helpers.zsh.erb +38 -0
  25. data/lib/autoproj/templates/main.bash.erb +35 -0
  26. data/lib/autoproj/templates/main.zsh.erb +9 -0
  27. data/lib/autoproj/templates/subcommand.bash.erb +50 -0
  28. data/lib/autoproj/templates/subcommand.zsh.erb +51 -0
  29. data/lib/autoproj/version.rb +1 -1
  30. data/lib/autoproj/workspace.rb +97 -19
  31. data/lib/autoproj/zsh_completion.rb +43 -0
  32. data/shell/autoproj_bash +67 -0
  33. data/shell/autoproj_zsh +26 -0
  34. data/shell/completion/alocate_bash +68 -0
  35. data/shell/completion/alocate_zsh +22 -0
  36. data/shell/completion/alog_bash +61 -0
  37. data/shell/completion/alog_zsh +20 -0
  38. data/shell/completion/amake_bash +77 -0
  39. data/shell/completion/amake_zsh +27 -0
  40. data/shell/completion/aup_bash +89 -0
  41. data/shell/completion/aup_zsh +34 -0
  42. data/shell/completion/autoproj_bash +1556 -0
  43. data/shell/completion/autoproj_zsh +1005 -0
  44. metadata +51 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0c27ad7f0094558f228fb7c604412b04280f3cbf
4
- data.tar.gz: f31f5167a74df916cd5e2c5a63c8f7ef4edcfdef
2
+ SHA256:
3
+ metadata.gz: 74382a8f78adb1bf83f20565bccc8c76972780b497bdd047559d520ed5486b09
4
+ data.tar.gz: 55bcf45cd3caa0fa840ef9b70dc8679b476669f27362b2181a5cb424005d0b63
5
5
  SHA512:
6
- metadata.gz: 42ac6f5fb9ca6986d9e9989089815028daee6c291ddc2cec8b7504a5c4e8f968966642c24df6923c0d887c807399cd7af09ff3e941c83860e97cf0578bd40f47
7
- data.tar.gz: 627c706ec1acb216ea5ce9ba700ef87662a62391963816ea504bf68b74f86edea46adf2272a5ac034f8de55164ad3b485bd4d0c251cbd39f4475c3858fad3a62
6
+ metadata.gz: d407340e19a489609da4e291bcb09f271db61e917ff345d94160e4546c10222cbaf67158f6c59ed0b2c093520011f7c156acbcaaf7c059e52cc89c7100a5b0cb
7
+ data.tar.gz: 68975b05b8470110377ac2b3519759351fc8c03d6df8c088e9712da35beca5a5305b699134189a83cf844ed94664d9b9825bb6b5195598a1efdbcb41b8dd4400
data/Rakefile CHANGED
@@ -25,5 +25,35 @@ task 'bootstrap' do
25
25
  end
26
26
  end
27
27
  end
28
- file 'bin/autoproj_bootstrap' => 'bootstrap'
29
28
 
29
+ require 'autoproj/bash_completion'
30
+ require 'autoproj/zsh_completion'
31
+
32
+ shells = [['bash', Autoproj::BashCompletion], ['zsh', Autoproj::ZshCompletion]]
33
+ clis = [%w[alocate locate], %w[alog log], %w[amake build], %w[aup update],
34
+ ['autoproj', nil]]
35
+
36
+ shell_dir = File.join(Dir.pwd, 'shell')
37
+ completion_dir = File.join(shell_dir, 'completion')
38
+
39
+ desc 'generate the shell helpers scripts'
40
+ task 'helpers' do
41
+ require 'erb'
42
+ templates_dir = File.join(Dir.pwd, 'lib', 'autoproj', 'templates')
43
+ FileUtils.mkdir_p(completion_dir)
44
+
45
+ shells.each do |shell|
46
+ clis.each do |cli|
47
+ completion = shell[1].new(cli[0], command: cli[1])
48
+ completion_file = File.join(completion_dir, "#{cli[0]}_#{shell[0]}")
49
+
50
+ IO.write(completion_file, completion.generate)
51
+ end
52
+ erb = File.read(File.join(templates_dir, "helpers.#{shell[0]}.erb"))
53
+ helper_file = File.join(shell_dir, "autoproj_#{shell[0]}")
54
+
55
+ IO.write(helper_file, ::ERB.new(erb, nil, '-').result(binding))
56
+ end
57
+ end
58
+
59
+ file 'bin/autoproj_bootstrap' => 'bootstrap'
@@ -34,9 +34,11 @@ Gem::Specification.new do |s|
34
34
  s.add_runtime_dependency 'tty-prompt', '~> 0.15.0'
35
35
  s.add_runtime_dependency 'tty-spinner', '~> 0.8.0'
36
36
  s.add_runtime_dependency 'rb-inotify' if RbConfig::CONFIG['target_os'] =~ /linux/
37
+ s.add_runtime_dependency 'xdg'
37
38
  s.add_development_dependency "flexmock", '~> 2.0', ">= 2.0.0"
38
39
  s.add_development_dependency "minitest", "~> 5.0", ">= 5.0"
39
40
  s.add_development_dependency "simplecov"
40
41
  s.add_development_dependency "aruba"
42
+ s.add_development_dependency "tty-cursor"
41
43
  end
42
44
 
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
3
  require 'autoproj/cli/main'
4
- Autoproj::CLI.basic_setup
4
+ argv = Autoproj::CLI.basic_setup
5
5
 
6
6
  class Alocate < Autoproj::CLI::Main
7
7
  def self.banner(*)
@@ -10,13 +10,11 @@ class Alocate < Autoproj::CLI::Main
10
10
  end
11
11
 
12
12
  begin
13
- if ARGV.include?('--help') || ARGV.include?('help')
13
+ if argv.include?('--help') || argv.include?('help')
14
14
  Alocate.start(['help', 'locate'])
15
15
  else
16
- Alocate.start(['locate', *ARGV])
16
+ Alocate.start(['locate', *argv])
17
17
  end
18
18
  rescue Interrupt
19
19
  # Already notified in the reporting infrastructure
20
20
  end
21
-
22
-
data/bin/alog CHANGED
@@ -3,7 +3,8 @@
3
3
  require 'autoproj/cli/main'
4
4
  require 'autoproj/cli/locate'
5
5
 
6
- if ARGV.include?('--help') || ARGV.include?('help')
6
+ argv = Autoproj::CLI.basic_setup
7
+ if argv.include?('--help') || argv.include?('help')
7
8
  puts "Usage:"
8
9
  puts " alog [package]"
9
10
  puts
@@ -11,11 +12,10 @@ if ARGV.include?('--help') || ARGV.include?('help')
11
12
  exit 0
12
13
  end
13
14
 
14
- Autoproj::CLI.basic_setup
15
15
  Autoproj.report(silent: true) do
16
16
  cli = Autoproj::CLI::Locate.new
17
17
 
18
- arg = ARGV.first || Dir.pwd
18
+ arg = argv.first || Dir.pwd
19
19
  if File.directory?(arg)
20
20
  arg = "#{File.expand_path(arg)}/"
21
21
  end
data/bin/amake CHANGED
@@ -1,8 +1,8 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
3
  require 'autoproj/cli/main'
4
- Autoproj::CLI.basic_setup
5
4
 
5
+ argv = Autoproj::CLI.basic_setup
6
6
  class Amake < Autoproj::CLI::Main
7
7
  def self.banner(*)
8
8
  "amake [options]"
@@ -10,12 +10,11 @@ class Amake < Autoproj::CLI::Main
10
10
  end
11
11
 
12
12
  begin
13
- if ARGV.include?('--help') || ARGV.include?('help')
13
+ if argv.include?('--help') || argv.include?('help')
14
14
  Amake.start(['help', 'build'])
15
15
  else
16
- Amake.start(['build', '--amake', *ARGV])
16
+ Amake.start(['build', '--amake', *argv])
17
17
  end
18
18
  rescue Interrupt
19
19
  # Already notified in the reporting infrastructure
20
20
  end
21
-
data/bin/aup CHANGED
@@ -1,7 +1,8 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
3
  require 'autoproj/cli/main'
4
- Autoproj::CLI.basic_setup
4
+
5
+ argv = Autoproj::CLI.basic_setup
5
6
 
6
7
  class Aup < Autoproj::CLI::Main
7
8
  def self.banner(*)
@@ -10,10 +11,10 @@ class Aup < Autoproj::CLI::Main
10
11
  end
11
12
 
12
13
  begin
13
- if ARGV.include?('--help') || ARGV.include?('help')
14
+ if argv.include?('--help') || argv.include?('help')
14
15
  Aup.start(['help', 'update'])
15
16
  else
16
- Aup.start(['update', *ARGV, '--aup'])
17
+ Aup.start(['update', *argv, '--aup'])
17
18
  end
18
19
  rescue Interrupt
19
20
  # Already notified in the reporting infrastructure
@@ -2,15 +2,10 @@
2
2
 
3
3
  require 'autoproj/cli'
4
4
  require 'autoproj/cli/main'
5
- Autoproj::CLI.basic_setup
5
+ argv = Autoproj::CLI.basic_setup
6
6
 
7
- argv = ARGV.find_all { |arg| arg != "--no-plugins" }
8
- if argv.size == ARGV.size
9
- Autoproj::CLI.load_plugins
10
- end
11
7
  begin
12
8
  Autoproj::CLI::Main.start(argv)
13
9
  rescue Interrupt
14
10
  # Already notified in the reporting infrastructure
15
11
  end
16
-
@@ -57,13 +57,15 @@ module Autoproj
57
57
 
58
58
  load_config
59
59
  if config['ruby_executable'] != Gem.ruby
60
- raise "this autoproj installation was already bootstrapped using #{config['ruby_executable']}, but you are currently running under #{Gem.ruby}. Changing the ruby interpreter in a given workspace is not supported, you need to do a clean bootstrap"
60
+ raise "this autoproj installation was already bootstrapped using "\
61
+ "#{config['ruby_executable']}, but you are currently running "\
62
+ "under #{Gem.ruby}. Changing the ruby interpreter in a given "\
63
+ "workspace is not supported, you need to do a clean bootstrap"
61
64
  end
62
65
  @ruby_executable = config['ruby_executable']
63
66
  @local = false
64
67
 
65
- default_gem_path = File.join(Dir.home, '.autoproj', 'gems')
66
- @gems_install_path = default_gem_path
68
+ install_gems_in_gem_user_dir
67
69
  end
68
70
 
69
71
  def env_for_child
@@ -142,13 +144,15 @@ module Autoproj
142
144
  #
143
145
  # They are installed in a versioned subdirectory of this path, e.g.
144
146
  # {#gem_path_suffix}.
145
- #
147
+ #
146
148
  # @return [String]
147
149
  attr_reader :gems_install_path
148
150
  # The GEM_HOME under which the workspace's gems should be installed
149
- #
151
+ #
150
152
  # @return [String]
151
- def gems_gem_home; File.join(gems_install_path, gem_path_suffix) end
153
+ def gems_gem_home
154
+ File.join(gems_install_path, gem_path_suffix)
155
+ end
152
156
  # Sets where the workspace's gems should be installed
153
157
  #
154
158
  # @param [String] path the absolute path that should be given to
@@ -157,17 +161,41 @@ module Autoproj
157
161
  def gems_install_path=(path)
158
162
  @gems_install_path = path
159
163
  end
164
+
165
+ private def xdg_var(varname, default)
166
+ if (env = ENV[varname]) && !env.empty?
167
+ env
168
+ else
169
+ default
170
+ end
171
+ end
172
+
160
173
  # Install autoproj in Gem's default user dir
161
174
  def install_gems_in_gem_user_dir
162
- @gems_install_path = File.join(Gem.user_home, '.gem')
175
+ xdg_default_gem_path = xdg_var('XDG_DATA_HOME',
176
+ File.join(Dir.home, '.local', 'share', 'autoproj', 'gems'))
177
+ default_gem_path = File.join(
178
+ Dir.home, '.autoproj', 'gems')
179
+ @gems_install_path =
180
+ if File.directory?(xdg_default_gem_path)
181
+ xdg_default_gem_path
182
+ elsif File.directory?(default_gem_path)
183
+ default_gem_path
184
+ else
185
+ xdg_default_gem_path
186
+ end
163
187
  end
164
188
 
165
189
  # Whether autoproj should prefer OS-independent packages over their
166
190
  # OS-packaged equivalents (e.g. the thor gem vs. the ruby-thor
167
191
  # Debian package)
168
- def prefer_indep_over_os_packages?; @prefer_indep_over_os_packages end
192
+ def prefer_indep_over_os_packages?
193
+ @prefer_indep_over_os_packages
194
+ end
169
195
  # (see #prefer_index_over_os_packages?)
170
- def prefer_indep_over_os_packages=(flag); @prefer_indep_over_os_packages = !!flag end
196
+ def prefer_indep_over_os_packages=(flag)
197
+ @prefer_indep_over_os_packages = !!flag
198
+ end
171
199
 
172
200
  def self.guess_gem_program
173
201
  ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
@@ -175,7 +203,7 @@ module Autoproj
175
203
 
176
204
  candidates = ['gem']
177
205
  if ruby_bin =~ /^ruby(.+)$/
178
- candidates.unshift "gem#{$1}"
206
+ candidates.unshift "gem#{$1}"
179
207
  end
180
208
 
181
209
  candidates.each do |gem_name|
@@ -183,7 +211,8 @@ module Autoproj
183
211
  return gem_full_path
184
212
  end
185
213
  end
186
- raise ArgumentError, "cannot find a gem program (tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
214
+ raise ArgumentError, "cannot find a gem program "\
215
+ "(tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
187
216
  end
188
217
 
189
218
  # The content of the default {#gemfile}
@@ -207,39 +236,48 @@ module Autoproj
207
236
  opt.on '--skip-stage2', 'do not run the stage2 install' do
208
237
  @skip_stage2 = true
209
238
  end
210
- opt.on '--gem-source=URL', String, "use this source for RubyGems instead of rubygems.org" do |url|
239
+ opt.on '--gem-source=URL', String, "use this source for RubyGems "\
240
+ "instead of rubygems.org" do |url|
211
241
  @gem_source = url
212
242
  end
213
- opt.on '--gems-path=PATH', "install gems under this path instead of ~/.autoproj/gems" do |path|
243
+ opt.on '--gems-path=PATH', "install gems under this path instead "\
244
+ "of ~/.autoproj/gems" do |path|
214
245
  self.gems_install_path = path
215
246
  end
216
247
  opt.on '--public-gems', "install gems in the default gem location" do
217
248
  self.install_gems_in_gem_user_dir
218
249
  end
219
- opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided string as a version constraint for autoproj' do |version|
250
+ opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided "\
251
+ "string as a version constraint for autoproj' do |version|
220
252
  if @gemfile
221
253
  raise "cannot give both --version and --gemfile"
222
254
  end
223
255
  @gemfile = default_gemfile_contents(version)
224
256
  end
225
- opt.on '--gemfile=PATH', String, 'use the given Gemfile to install autoproj instead of the default' do |path|
257
+ opt.on '--gemfile=PATH', String, 'use the given Gemfile to install "\
258
+ "autoproj instead of the default' do |path|
226
259
  if @gemfile
227
260
  raise "cannot give both --version and --gemfile"
228
261
  end
229
262
  @gemfile = File.read(path)
230
263
  end
231
- opt.on '--seed-config=PATH', String, 'path to a seed file that should be used to initialize the configuration' do |path|
264
+ opt.on '--seed-config=PATH', String, 'path to a seed file that "\
265
+ "should be used to initialize the configuration' do |path|
232
266
  @config.merge!(YAML.load(File.read(path)))
233
267
  end
234
- 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
268
+ opt.on '--prefer-os-independent-packages', 'prefer OS-independent "\
269
+ "packages (such as a RubyGem) over their OS-packaged equivalent "\
270
+ "(e.g. the thor gem vs. the ruby-thor debian package)' do
235
271
  @prefer_indep_over_os_packages = true
236
272
  end
237
- opt.on '--[no-]color', 'do not use colored output (enabled by default if the terminal supports it)' do |color|
273
+ opt.on '--[no-]color', 'do not use colored output (enabled by "\
274
+ "default if the terminal supports it)' do |color|
238
275
  if color then autoproj_options << "--color"
239
276
  else autoproj_options << '--no-color'
240
277
  end
241
278
  end
242
- opt.on '--[no-]progress', 'do not use progress output (enabled by default if the terminal supports it)' do |color|
279
+ opt.on '--[no-]progress', 'do not use progress output (enabled by "\
280
+ "default if the terminal supports it)' do |color|
243
281
  if color then autoproj_options << "--progress"
244
282
  else autoproj_options << '--no-progress'
245
283
  end
@@ -272,9 +310,11 @@ module Autoproj
272
310
 
273
311
  result = system(
274
312
  env_for_child.merge('GEM_HOME' => gems_gem_home),
275
- Gem.ruby, gem_program, 'install', '--env-shebang', '--no-document', '--no-format-executable', '--clear-sources', '--source', gem_source,
276
- *local,
277
- "--bindir=#{File.join(gems_gem_home, 'bin')}", 'bundler', **redirection)
313
+ Gem.ruby, gem_program, 'install',
314
+ '--env-shebang', '--no-document', '--no-format-executable',
315
+ '--clear-sources', '--source', gem_source,
316
+ *local, "--bindir=#{File.join(gems_gem_home, 'bin')}",
317
+ 'bundler', **redirection)
278
318
 
279
319
  if !result
280
320
  STDERR.puts "FATAL: failed to install bundler in #{gems_gem_home}"
@@ -285,14 +325,15 @@ module Autoproj
285
325
  if File.exist?(bundler_path)
286
326
  bundler_path
287
327
  else
288
- STDERR.puts "gem install bundler returned successfully, but still cannot find bundler in #{bundler_path}"
328
+ STDERR.puts "gem install bundler returned successfully, but still "\
329
+ "cannot find bundler in #{bundler_path}"
289
330
  nil
290
331
  end
291
332
  end
292
333
 
293
334
  def install_autoproj(bundler)
294
- # Force bundler to update. If the user does not want this, let him specify a
295
- # Gemfile with tighter version constraints
335
+ # Force bundler to update. If the user does not want this, let
336
+ # him specify a Gemfile with tighter version constraints
296
337
  lockfile = File.join(dot_autoproj, 'Gemfile.lock')
297
338
  if File.exist?(lockfile)
298
339
  FileUtils.rm lockfile
@@ -304,6 +345,7 @@ module Autoproj
304
345
  opts << '--local' if local?
305
346
  opts << "--path=#{gems_install_path}"
306
347
  shims_path = File.join(dot_autoproj, 'bin')
348
+
307
349
  result = system(clean_env,
308
350
  Gem.ruby, bundler, 'install',
309
351
  "--gemfile=#{autoproj_gemfile_path}",
@@ -316,12 +358,14 @@ module Autoproj
316
358
  exit 1
317
359
  end
318
360
  ensure
319
- self.class.rewrite_shims(shims_path, ruby_executable, root_dir, autoproj_gemfile_path, gems_gem_home)
361
+ self.class.rewrite_shims(shims_path, ruby_executable,
362
+ root_dir, autoproj_gemfile_path, gems_gem_home)
320
363
  end
321
364
 
322
365
  EXCLUDED_FROM_SHIMS = %w{rake thor}
323
366
 
324
- def self.rewrite_shims(shim_path, ruby_executable, root_dir, autoproj_gemfile_path, gems_gem_home)
367
+ def self.rewrite_shims(shim_path, ruby_executable,
368
+ root_dir, autoproj_gemfile_path, gems_gem_home)
325
369
  FileUtils.mkdir_p shim_path
326
370
  File.open(File.join(shim_path, 'ruby'), 'w') do |io|
327
371
  io.puts "#! /bin/sh"
@@ -329,10 +373,9 @@ module Autoproj
329
373
  end
330
374
  FileUtils.chmod 0755, File.join(shim_path, 'ruby')
331
375
 
332
- FileUtils.touch File.join(shim_path, 'bundler')
333
- FileUtils.touch File.join(shim_path, 'bundle')
334
376
  Dir.glob(File.join(shim_path, '*')) do |bin_script|
335
- next if !File.file?(bin_script)
377
+ next unless File.file?(bin_script)
378
+
336
379
  bin_name = File.basename(bin_script)
337
380
  if EXCLUDED_FROM_SHIMS.include?(bin_name)
338
381
  FileUtils.rm_f bin_script
@@ -342,19 +385,46 @@ module Autoproj
342
385
 
343
386
  bin_shim = File.join(shim_path, bin_name)
344
387
  bin_script_lines = File.readlines(bin_script)
388
+ next if has_autoproj_preamble?(bin_script_lines)
389
+
345
390
  File.open(bin_shim, 'w') do |io|
346
391
  if bin_name == 'bundler' || bin_name == 'bundle'
347
- io.puts shim_bundler(ruby_executable, autoproj_gemfile_path, gems_gem_home)
392
+ io.puts shim_bundler(bin_script_lines, ruby_executable,
393
+ autoproj_gemfile_path, gems_gem_home)
348
394
  else
349
- load_line = bin_script_lines.grep(/load Gem.bin_path/).first
350
- io.puts shim_script(ruby_executable, root_dir, autoproj_gemfile_path, gems_gem_home, load_line)
395
+ io.puts shim_script(bin_script_lines, ruby_executable, root_dir,
396
+ autoproj_gemfile_path, gems_gem_home)
351
397
  end
352
398
  end
353
399
  FileUtils.chmod 0755, bin_shim
354
400
  end
355
401
  end
356
402
 
357
- def self.shim_bundler(ruby_executable, autoproj_gemfile_path, gems_gem_home)
403
+ def self.new_style_bundler_binstub?(script_lines)
404
+ script_lines.any? { |l| l =~ /This file was generated by Bundler/ }
405
+ end
406
+
407
+ def self.has_autoproj_preamble?(script_lines)
408
+ script_lines.any? { |l| l =~ /Autoproj generated preamble/ }
409
+ end
410
+
411
+ def self.shim_bundler(script_lines, ruby_executable, autoproj_gemfile_path, gems_gem_home)
412
+ return shim_bundler_old(ruby_executable, autoproj_gemfile_path, gems_gem_home) \
413
+ unless new_style_bundler_binstub?(script_lines)
414
+
415
+ script_lines.insert(1, <<-RESTART_BUNDLER)
416
+ # Autoproj generated preamble
417
+ if defined?(Bundler)
418
+ Bundler.with_clean_env do
419
+ exec($0, *ARGV)
420
+ end
421
+ end
422
+ ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
423
+ RESTART_BUNDLER
424
+ script_lines.join
425
+ end
426
+
427
+ def self.shim_bundler_old(ruby_executable, autoproj_gemfile_path, gems_gem_home)
358
428
  "#! #{ruby_executable}
359
429
 
360
430
  if defined?(Bundler)
@@ -370,8 +440,35 @@ Gem.paths = Hash['GEM_HOME' => '#{gems_gem_home}', 'GEM_PATH' => '']
370
440
 
371
441
  load Gem.bin_path('bundler', 'bundler')"
372
442
  end
373
-
374
- def self.shim_script(ruby_executable, root_dir, autoproj_gemfile_path, gems_gem_home, load_line)
443
+
444
+ def self.shim_script(script_lines, ruby_executable, root_dir,
445
+ autoproj_gemfile_path, gems_gem_home)
446
+ new_style = !script_lines.empty? && script_lines.any? do |l|
447
+ l =~ /This file was generated by Bundler/
448
+ end
449
+ load_line = script_lines.grep(/load Gem.bin_path/).first
450
+ return shim_script_old(ruby_executable, root_dir,
451
+ autoproj_gemfile_path, gems_gem_home, load_line) \
452
+ unless new_style
453
+
454
+ script_lines.insert(1, <<-AUTOPROJ_PREAMBLE)
455
+ # Autoproj generated preamble, v1
456
+ if defined?(Bundler)
457
+ Bundler.with_clean_env do
458
+ exec(Hash['RUBYLIB' => nil], $0, *ARGV)
459
+ end
460
+ elsif ENV['RUBYLIB']
461
+ exec(Hash['RUBYLIB' => nil], $0, *ARGV)
462
+ end
463
+
464
+ ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
465
+ ENV['AUTOPROJ_CURRENT_ROOT'] = '#{root_dir}'
466
+ AUTOPROJ_PREAMBLE
467
+ return script_lines.join
468
+ end
469
+
470
+ def self.shim_script_old(ruby_executable, root_dir, autoproj_gemfile_path,
471
+ gems_gem_home, load_line)
375
472
  "#! #{ruby_executable}
376
473
 
377
474
  if defined?(Bundler)
@@ -433,9 +530,10 @@ require 'bundler/setup'
433
530
  "if File.file?(config_path)",
434
531
  " require 'yaml'",
435
532
  " config = YAML.load(File.read(config_path)) || Hash.new",
436
- " (config['plugins'] || Hash.new).each do |plugin_name, (version, options)|",
437
- " gem plugin_name, version, **options",
438
- " end",
533
+ " (config['plugins'] || Hash.new).",
534
+ " each do |plugin_name, (version, options)|",
535
+ " gem plugin_name, version, **options",
536
+ " end",
439
537
  "end"
440
538
  ].join("\n")
441
539
 
@@ -449,7 +547,8 @@ require 'bundler/setup'
449
547
 
450
548
 
451
549
  def find_in_clean_path(command, *additional_paths)
452
- clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR) + additional_paths
550
+ clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR) +
551
+ additional_paths
453
552
  clean_path.each do |p|
454
553
  full_path = File.join(p, command)
455
554
  if File.file?(full_path)
@@ -473,7 +572,8 @@ require 'bundler/setup'
473
572
  #
474
573
  # So, we're calling 'gem' as a subcommand to discovery the
475
574
  # actual bindir
476
- bindir = IO.popen(env_for_child, [Gem.ruby, '-e', 'puts "#{Gem.user_dir}/bin"']).read
575
+ bindir = IO.popen(env_for_child,
576
+ [Gem.ruby, '-e', 'puts "#{Gem.user_dir}/bin"']).read
477
577
  if bindir
478
578
  @gem_bindir = bindir.chomp
479
579
  else
@@ -483,7 +583,9 @@ require 'bundler/setup'
483
583
 
484
584
  def install
485
585
  if ENV['BUNDLER_GEMFILE']
486
- raise "cannot run autoproj_install or autoproj_bootstrap while under a 'bundler exec' subcommand or having loaded an env.sh. Open a new console and try again"
586
+ raise "cannot run autoproj_install or autoproj_bootstrap while "\
587
+ "under a 'bundler exec' subcommand or having loaded an env.sh. "\
588
+ "Open a new console and try again"
487
589
  end
488
590
 
489
591
  gem_program = self.class.guess_gem_program
@@ -513,7 +615,7 @@ require 'bundler/setup'
513
615
 
514
616
  def load_config
515
617
  v1_config_path = File.join(root_dir, 'autoproj', 'config.yml')
516
-
618
+
517
619
  config = Hash.new
518
620
  if File.file?(v1_config_path)
519
621
  config.merge!(YAML.load(File.read(v1_config_path)) || Hash.new)
@@ -527,7 +629,10 @@ require 'bundler/setup'
527
629
  ruby_executable = File.join(ruby_bindir, ruby)
528
630
  if current = config['ruby_executable'] # When upgrading or reinstalling
529
631
  if current != ruby_executable
530
- 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"
632
+ raise "this workspace has already been initialized using "\
633
+ "#{current}, you cannot run autoproj install with "\
634
+ "#{ruby_executable}. If you know what you're doing, "\
635
+ "delete the ruby_executable line in config.yml and try again"
531
636
  end
532
637
  else
533
638
  config['ruby_executable'] = ruby_executable
@@ -586,14 +691,16 @@ require 'bundler/setup'
586
691
  save_env_sh(*vars)
587
692
  puts "running 'autoproj envsh' to generate a proper env.sh"
588
693
  if !system(Gem.ruby, autoproj_path, 'envsh', *autoproj_options)
589
- STDERR.puts "failed to run autoproj envsh on the newly installed autoproj (#{autoproj_path})"
694
+ STDERR.puts "failed to run autoproj envsh on the newly installed "\
695
+ "autoproj (#{autoproj_path})"
590
696
  exit 1
591
697
  end
592
698
  # This is really needed on an existing install to install the
593
699
  # gems that were present in the v1 layout
594
700
  puts "running 'autoproj osdeps' to re-install missing gems"
595
701
  if !system(Gem.ruby, autoproj_path, 'osdeps')
596
- STDERR.puts "failed to run autoproj osdeps on the newly installed autoproj (#{autoproj_path})"
702
+ STDERR.puts "failed to run autoproj osdeps on the newly installed "\
703
+ "autoproj (#{autoproj_path})"
597
704
  exit 1
598
705
  end
599
706
  end
@@ -602,7 +709,6 @@ require 'bundler/setup'
602
709
  end
603
710
 
604
711
 
605
-
606
712
  ENV.delete('BUNDLE_GEMFILE')
607
713
  ENV.delete('RUBYLIB')
608
714
  ops = Autoproj::Ops::Install.new(Dir.pwd)