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.
- checksums.yaml +5 -5
- data/Rakefile +31 -1
- data/autoproj.gemspec +2 -0
- data/bin/alocate +3 -5
- data/bin/alog +3 -3
- data/bin/amake +3 -4
- data/bin/aup +4 -3
- data/bin/autoproj +1 -6
- data/bin/autoproj_bootstrap +153 -47
- data/bin/autoproj_install +153 -47
- data/lib/autoproj/autobuild_extensions/dsl.rb +5 -0
- data/lib/autoproj/bash_completion.rb +26 -0
- data/lib/autoproj/cli/base.rb +4 -4
- data/lib/autoproj/cli/build.rb +2 -3
- data/lib/autoproj/cli/main.rb +52 -2
- data/lib/autoproj/cli/main_global.rb +39 -0
- data/lib/autoproj/cli/osdeps.rb +2 -1
- data/lib/autoproj/cli/update.rb +13 -1
- data/lib/autoproj/configuration.rb +14 -2
- data/lib/autoproj/environment.rb +48 -31
- data/lib/autoproj/ops/install.rb +153 -47
- data/lib/autoproj/shell_completion.rb +164 -0
- data/lib/autoproj/templates/helpers.bash.erb +79 -0
- data/lib/autoproj/templates/helpers.zsh.erb +38 -0
- data/lib/autoproj/templates/main.bash.erb +35 -0
- data/lib/autoproj/templates/main.zsh.erb +9 -0
- data/lib/autoproj/templates/subcommand.bash.erb +50 -0
- data/lib/autoproj/templates/subcommand.zsh.erb +51 -0
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +97 -19
- data/lib/autoproj/zsh_completion.rb +43 -0
- data/shell/autoproj_bash +67 -0
- data/shell/autoproj_zsh +26 -0
- data/shell/completion/alocate_bash +68 -0
- data/shell/completion/alocate_zsh +22 -0
- data/shell/completion/alog_bash +61 -0
- data/shell/completion/alog_zsh +20 -0
- data/shell/completion/amake_bash +77 -0
- data/shell/completion/amake_zsh +27 -0
- data/shell/completion/aup_bash +89 -0
- data/shell/completion/aup_zsh +34 -0
- data/shell/completion/autoproj_bash +1556 -0
- data/shell/completion/autoproj_zsh +1005 -0
- metadata +51 -3
data/lib/autoproj/cli/build.rb
CHANGED
@@ -13,7 +13,7 @@ def validate_options(selected_packages, options)
|
|
13
13
|
options[:deps] = false
|
14
14
|
end
|
15
15
|
if options[:deps].nil?
|
16
|
-
options[:deps] =
|
16
|
+
options[:deps] =
|
17
17
|
!(options[:rebuild] || options[:force])
|
18
18
|
end
|
19
19
|
return selected_packages, options
|
@@ -78,11 +78,10 @@ def run(selected_packages, options)
|
|
78
78
|
Autobuild.do_build = true
|
79
79
|
ops.build_packages(source_packages, parallel: parallel)
|
80
80
|
Autobuild.apply(source_packages, "autoproj-build", ['install'])
|
81
|
+
Main.run_post_command_hook(:build, ws, source_packages: source_packages)
|
81
82
|
ensure
|
82
83
|
export_env_sh
|
83
84
|
end
|
84
85
|
end
|
85
86
|
end
|
86
87
|
end
|
87
|
-
|
88
|
-
|
data/lib/autoproj/cli/main.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
require 'tty/color'
|
3
3
|
require 'autoproj/cli/main_test'
|
4
4
|
require 'autoproj/cli/main_plugin'
|
5
|
+
require 'autoproj/cli/main_global'
|
6
|
+
require 'autoproj/cli'
|
5
7
|
require 'autoproj/reporter'
|
6
8
|
|
7
9
|
module Autoproj
|
@@ -9,6 +11,12 @@ module CLI
|
|
9
11
|
def self.basic_setup
|
10
12
|
Encoding.default_internal = Encoding::UTF_8
|
11
13
|
Encoding.default_external = Encoding::UTF_8
|
14
|
+
|
15
|
+
argv = ARGV.find_all { |arg| arg != "--no-plugins" }
|
16
|
+
if argv.size == ARGV.size
|
17
|
+
Autoproj::CLI.load_plugins
|
18
|
+
end
|
19
|
+
argv
|
12
20
|
end
|
13
21
|
|
14
22
|
class Main < Thor
|
@@ -26,6 +34,44 @@ class Main < Thor
|
|
26
34
|
stop_on_unknown_option! :exec
|
27
35
|
check_unknown_options! except: :exec
|
28
36
|
|
37
|
+
# @api private
|
38
|
+
#
|
39
|
+
# Run hooks defined for a given hook name
|
40
|
+
def self.run_post_command_hook(hook_name, ws, **args)
|
41
|
+
@post_command_hooks[hook_name].each do |hook|
|
42
|
+
hook.call(ws, args)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Register a hook that should be called at a given event
|
47
|
+
#
|
48
|
+
# @overload register_post_command_hook(:update)
|
49
|
+
# @yieldparam [Workspace] ws
|
50
|
+
# @yieldparam [Hash] params
|
51
|
+
#
|
52
|
+
# Hook called after an update operation (from the CLI, either
|
53
|
+
# update or osdeps)
|
54
|
+
#
|
55
|
+
# The params contain :source_packages and :osdeps_packages,
|
56
|
+
# respectively the list of names of the source and osdeps packages
|
57
|
+
# selected for the update operation (NOT the list of packages
|
58
|
+
# actually updated)
|
59
|
+
#
|
60
|
+
# @overload register_post_command_hook(:build)
|
61
|
+
# @yieldparam [Workspace] ws
|
62
|
+
# @yieldparam [Hash] params
|
63
|
+
#
|
64
|
+
# Hook called after a build operation (from the CLI, build)
|
65
|
+
#
|
66
|
+
# The params contain :source_packages, the list of names of the
|
67
|
+
# source and osdeps packages selected for the update operation (NOT
|
68
|
+
# the list of packages actually updated)
|
69
|
+
def self.register_post_command_hook(hook_name, &block)
|
70
|
+
@post_command_hooks[hook_name.to_sym] << block
|
71
|
+
end
|
72
|
+
|
73
|
+
@post_command_hooks = Hash.new { |h, k| h[k] = Array.new }
|
74
|
+
|
29
75
|
no_commands do
|
30
76
|
def default_report_on_package_failures
|
31
77
|
if options[:debug]
|
@@ -79,7 +125,7 @@ def bootstrap(*args)
|
|
79
125
|
run_autoproj_cli(:bootstrap, :Bootstrap, Hash[], *args)
|
80
126
|
end
|
81
127
|
|
82
|
-
desc 'envsh', 'update the
|
128
|
+
desc 'envsh', 'update the environment files'
|
83
129
|
def envsh
|
84
130
|
run_autoproj_cli(:envsh, :Envsh, Hash[])
|
85
131
|
end
|
@@ -163,7 +209,7 @@ def update(*packages)
|
|
163
209
|
report_options[:on_package_failures] = :report
|
164
210
|
end
|
165
211
|
|
166
|
-
run_autoproj_cli(:update, :Update, report_options, *packages)
|
212
|
+
run_autoproj_cli(:update, :Update, report_options, *packages, run_hook: true)
|
167
213
|
end
|
168
214
|
|
169
215
|
desc 'build [PACKAGES]', 'build packages'
|
@@ -466,6 +512,9 @@ def install_stage2(root_dir, *vars)
|
|
466
512
|
desc 'plugin', 'interface to manage autoproj plugins'
|
467
513
|
subcommand 'plugin', MainPlugin
|
468
514
|
|
515
|
+
desc 'global', 'global management of the known workspaces'
|
516
|
+
subcommand 'global', MainGlobal
|
517
|
+
|
469
518
|
desc 'patch', 'applies patches necessary for the selected package',
|
470
519
|
hide: true
|
471
520
|
def patch(*packages)
|
@@ -518,3 +567,4 @@ def which(cmd)
|
|
518
567
|
end
|
519
568
|
end
|
520
569
|
end
|
570
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Autoproj
|
2
|
+
module CLI
|
3
|
+
class MainGlobal < Thor
|
4
|
+
namespace 'global'
|
5
|
+
|
6
|
+
desc 'register', 'register the current workspace'
|
7
|
+
def register
|
8
|
+
require 'autoproj'
|
9
|
+
ws = Workspace.default
|
10
|
+
ws.load_config
|
11
|
+
ws.register_workspace
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'status', 'display information about the known workspaces'
|
15
|
+
def status
|
16
|
+
require 'autoproj'
|
17
|
+
ws = Workspace.registered_workspaces
|
18
|
+
fields = Workspace::RegisteredWorkspace.members.map(&:to_s)
|
19
|
+
format_w = fields.map(&:length).max + 1
|
20
|
+
format = "%-#{format_w}s %s (%s)"
|
21
|
+
blocks = ws.map do |w|
|
22
|
+
%w[root_dir prefix_dir build_dir].map do |name|
|
23
|
+
dir = w.public_send(name)
|
24
|
+
if dir.start_with?('/')
|
25
|
+
status = if File.directory?(dir)
|
26
|
+
Autobuild.color('present', :green)
|
27
|
+
else
|
28
|
+
Autobuild.color('absent', :yellow)
|
29
|
+
end
|
30
|
+
|
31
|
+
format(format, "#{name}:", dir, status)
|
32
|
+
end
|
33
|
+
end.compact.join("\n")
|
34
|
+
end
|
35
|
+
puts blocks.join("---\n")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/autoproj/cli/osdeps.rb
CHANGED
@@ -29,8 +29,9 @@ def run(user_selection, update: true, **options)
|
|
29
29
|
run_package_managers_without_packages: true,
|
30
30
|
install_only: !update)
|
31
31
|
export_env_sh(shell_helpers: shell_helpers)
|
32
|
+
Main.run_post_command_hook(:update, ws, source_packages: [],
|
33
|
+
osdep_packages: osdep_packages)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
36
|
-
|
data/lib/autoproj/cli/update.rb
CHANGED
@@ -66,7 +66,7 @@ def validate_options(selection, options)
|
|
66
66
|
return selection, options
|
67
67
|
end
|
68
68
|
|
69
|
-
def run(selected_packages, options)
|
69
|
+
def run(selected_packages, run_hook: false, **options)
|
70
70
|
ws.manifest.accept_unavailable_osdeps = !options[:osdeps]
|
71
71
|
ws.setup
|
72
72
|
ws.autodetect_operating_system(force: true)
|
@@ -127,6 +127,18 @@ def run(selected_packages, options)
|
|
127
127
|
ws.install_os_packages(osdep_packages, **osdeps_options)
|
128
128
|
end
|
129
129
|
|
130
|
+
if run_hook
|
131
|
+
if options[:osdeps]
|
132
|
+
CLI::Main.run_post_command_hook(:update, ws,
|
133
|
+
source_packages: source_packages,
|
134
|
+
osdep_packages: osdep_packages)
|
135
|
+
else
|
136
|
+
CLI::Main.run_post_command_hook(:update, ws,
|
137
|
+
source_packages: source_packages,
|
138
|
+
osdep_packages: [])
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
130
142
|
export_env_sh
|
131
143
|
|
132
144
|
if !options[:auto_exclude]
|
@@ -344,7 +344,7 @@ def apply_autobuild_configuration
|
|
344
344
|
end
|
345
345
|
end
|
346
346
|
end
|
347
|
-
|
347
|
+
|
348
348
|
# A cache directory for autobuild's importers
|
349
349
|
def importer_cache_dir
|
350
350
|
get('importer_cache_dir', nil)
|
@@ -367,6 +367,18 @@ def prefix_dir
|
|
367
367
|
get('prefix', 'install')
|
368
368
|
end
|
369
369
|
|
370
|
+
# Sets the shells used in this workspace.
|
371
|
+
def user_shells=(shells)
|
372
|
+
set('user_shells', shells, true)
|
373
|
+
end
|
374
|
+
|
375
|
+
# The shells used in this workspace.
|
376
|
+
#
|
377
|
+
# @return [Array<String>]
|
378
|
+
def user_shells
|
379
|
+
get('user_shells', [])
|
380
|
+
end
|
381
|
+
|
370
382
|
# Defines the temporary area in which packages should put their build
|
371
383
|
# files
|
372
384
|
#
|
@@ -433,7 +445,7 @@ def randomize_layout=(value)
|
|
433
445
|
'test' => false]
|
434
446
|
|
435
447
|
# The configuration key that should be used to store the utility
|
436
|
-
# enable/disable information
|
448
|
+
# enable/disable information
|
437
449
|
#
|
438
450
|
# @param [String] the utility name
|
439
451
|
# @return [String] the config key
|
data/lib/autoproj/environment.rb
CHANGED
@@ -24,38 +24,55 @@ def export_env_sh(subdir = nil, options = Hash.new)
|
|
24
24
|
options = validate_options options,
|
25
25
|
shell_helpers: true
|
26
26
|
|
27
|
-
filename = if subdir
|
28
|
-
File.join(root_dir, subdir, ENV_FILENAME)
|
29
|
-
else
|
30
|
-
File.join(root_dir, ENV_FILENAME)
|
31
|
-
end
|
32
|
-
|
33
27
|
shell_dir = File.expand_path(File.join("..", "..", "shell"), File.dirname(__FILE__))
|
34
|
-
|
35
|
-
|
36
|
-
end
|
28
|
+
completion_dir = File.join(shell_dir, 'completion')
|
29
|
+
env_updated = false
|
37
30
|
|
38
|
-
|
39
|
-
|
40
|
-
|
31
|
+
(['sh'] + Autoproj.workspace.config.user_shells).to_set.each do |shell|
|
32
|
+
env_filename = if shell == 'sh'
|
33
|
+
ENV_FILENAME
|
34
|
+
else
|
35
|
+
(Pathname(ENV_FILENAME).sub_ext '').to_s.concat(".#{shell}")
|
36
|
+
end
|
37
|
+
|
38
|
+
filename = if subdir
|
39
|
+
File.join(root_dir, subdir, env_filename)
|
40
|
+
else
|
41
|
+
File.join(root_dir, env_filename)
|
41
42
|
end
|
42
43
|
|
43
|
-
|
44
|
-
if
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
EOF
|
44
|
+
helper = File.join(shell_dir, "autoproj_#{shell}")
|
45
|
+
if options[:shell_helpers]
|
46
|
+
source_after(helper, shell: shell) if File.file?(helper)
|
47
|
+
%w[alocate alog amake aup autoproj].each do |tool|
|
48
|
+
completion_file = File.join(completion_dir, "#{tool}_#{shell}")
|
49
|
+
source_after(completion_file, shell: shell) if File.file?(completion_file)
|
50
|
+
end
|
51
51
|
end
|
52
|
-
super(io)
|
53
|
-
end
|
54
52
|
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
existing_content =
|
54
|
+
begin File.read(filename)
|
55
|
+
rescue SystemCallError
|
56
|
+
end
|
57
|
+
|
58
|
+
StringIO.open(new_content = String.new, 'w') do |io|
|
59
|
+
if inherit?
|
60
|
+
io.write <<-EOF
|
61
|
+
if test -n "$AUTOPROJ_CURRENT_ROOT" && test "$AUTOPROJ_CURRENT_ROOT" != "#{root_dir}"; then
|
62
|
+
echo "the env.sh from $AUTOPROJ_CURRENT_ROOT is already loaded. Start a new shell before sourcing this one"
|
63
|
+
return
|
64
|
+
fi
|
65
|
+
EOF
|
66
|
+
end
|
67
|
+
super(io, shell: shell)
|
68
|
+
end
|
69
|
+
|
70
|
+
if new_content != existing_content
|
71
|
+
Ops.atomic_write(filename) { |io| io.write new_content }
|
72
|
+
env_updated = true
|
73
|
+
end
|
58
74
|
end
|
75
|
+
env_updated
|
59
76
|
end
|
60
77
|
end
|
61
78
|
|
@@ -76,16 +93,16 @@ def self.env_add_path(name, *value)
|
|
76
93
|
env.add_path(name, *value)
|
77
94
|
end
|
78
95
|
# @deprecated call Autoproj.env.source_after instead
|
79
|
-
def self.env_source_file(file)
|
80
|
-
env.source_after(file)
|
96
|
+
def self.env_source_file(file, shell: 'sh')
|
97
|
+
env.source_after(file, shell: shell)
|
81
98
|
end
|
82
99
|
# @deprecated call Autoproj.env.source_after instead
|
83
|
-
def self.env_source_after(file)
|
84
|
-
env.source_after(file)
|
100
|
+
def self.env_source_after(file, shell: 'sh')
|
101
|
+
env.source_after(file, shell: shell)
|
85
102
|
end
|
86
103
|
# @deprecated call Autoproj.env.source_before instead
|
87
|
-
def self.env_source_before(file)
|
88
|
-
env.source_before(file)
|
104
|
+
def self.env_source_before(file, shell: 'sh')
|
105
|
+
env.source_before(file, shell: shell)
|
89
106
|
end
|
90
107
|
# @deprecated call Autoproj.env.inherit instead
|
91
108
|
def self.env_inherit(*names)
|
data/lib/autoproj/ops/install.rb
CHANGED
@@ -47,13 +47,15 @@ def initialize(root_dir)
|
|
47
47
|
|
48
48
|
load_config
|
49
49
|
if config['ruby_executable'] != Gem.ruby
|
50
|
-
raise "this autoproj installation was already bootstrapped using
|
50
|
+
raise "this autoproj installation was already bootstrapped using "\
|
51
|
+
"#{config['ruby_executable']}, but you are currently running "\
|
52
|
+
"under #{Gem.ruby}. Changing the ruby interpreter in a given "\
|
53
|
+
"workspace is not supported, you need to do a clean bootstrap"
|
51
54
|
end
|
52
55
|
@ruby_executable = config['ruby_executable']
|
53
56
|
@local = false
|
54
57
|
|
55
|
-
|
56
|
-
@gems_install_path = default_gem_path
|
58
|
+
install_gems_in_gem_user_dir
|
57
59
|
end
|
58
60
|
|
59
61
|
def env_for_child
|
@@ -132,13 +134,15 @@ def gem_path_suffix
|
|
132
134
|
#
|
133
135
|
# They are installed in a versioned subdirectory of this path, e.g.
|
134
136
|
# {#gem_path_suffix}.
|
135
|
-
#
|
137
|
+
#
|
136
138
|
# @return [String]
|
137
139
|
attr_reader :gems_install_path
|
138
140
|
# The GEM_HOME under which the workspace's gems should be installed
|
139
|
-
#
|
141
|
+
#
|
140
142
|
# @return [String]
|
141
|
-
def gems_gem_home
|
143
|
+
def gems_gem_home
|
144
|
+
File.join(gems_install_path, gem_path_suffix)
|
145
|
+
end
|
142
146
|
# Sets where the workspace's gems should be installed
|
143
147
|
#
|
144
148
|
# @param [String] path the absolute path that should be given to
|
@@ -147,17 +151,41 @@ def gems_gem_home; File.join(gems_install_path, gem_path_suffix) end
|
|
147
151
|
def gems_install_path=(path)
|
148
152
|
@gems_install_path = path
|
149
153
|
end
|
154
|
+
|
155
|
+
private def xdg_var(varname, default)
|
156
|
+
if (env = ENV[varname]) && !env.empty?
|
157
|
+
env
|
158
|
+
else
|
159
|
+
default
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
150
163
|
# Install autoproj in Gem's default user dir
|
151
164
|
def install_gems_in_gem_user_dir
|
152
|
-
|
165
|
+
xdg_default_gem_path = xdg_var('XDG_DATA_HOME',
|
166
|
+
File.join(Dir.home, '.local', 'share', 'autoproj', 'gems'))
|
167
|
+
default_gem_path = File.join(
|
168
|
+
Dir.home, '.autoproj', 'gems')
|
169
|
+
@gems_install_path =
|
170
|
+
if File.directory?(xdg_default_gem_path)
|
171
|
+
xdg_default_gem_path
|
172
|
+
elsif File.directory?(default_gem_path)
|
173
|
+
default_gem_path
|
174
|
+
else
|
175
|
+
xdg_default_gem_path
|
176
|
+
end
|
153
177
|
end
|
154
178
|
|
155
179
|
# Whether autoproj should prefer OS-independent packages over their
|
156
180
|
# OS-packaged equivalents (e.g. the thor gem vs. the ruby-thor
|
157
181
|
# Debian package)
|
158
|
-
def prefer_indep_over_os_packages
|
182
|
+
def prefer_indep_over_os_packages?
|
183
|
+
@prefer_indep_over_os_packages
|
184
|
+
end
|
159
185
|
# (see #prefer_index_over_os_packages?)
|
160
|
-
def prefer_indep_over_os_packages=(flag)
|
186
|
+
def prefer_indep_over_os_packages=(flag)
|
187
|
+
@prefer_indep_over_os_packages = !!flag
|
188
|
+
end
|
161
189
|
|
162
190
|
def self.guess_gem_program
|
163
191
|
ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
@@ -165,7 +193,7 @@ def self.guess_gem_program
|
|
165
193
|
|
166
194
|
candidates = ['gem']
|
167
195
|
if ruby_bin =~ /^ruby(.+)$/
|
168
|
-
candidates.unshift "gem#{$1}"
|
196
|
+
candidates.unshift "gem#{$1}"
|
169
197
|
end
|
170
198
|
|
171
199
|
candidates.each do |gem_name|
|
@@ -173,7 +201,8 @@ def self.guess_gem_program
|
|
173
201
|
return gem_full_path
|
174
202
|
end
|
175
203
|
end
|
176
|
-
raise ArgumentError, "cannot find a gem program
|
204
|
+
raise ArgumentError, "cannot find a gem program "\
|
205
|
+
"(tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
|
177
206
|
end
|
178
207
|
|
179
208
|
# The content of the default {#gemfile}
|
@@ -197,39 +226,48 @@ def parse_options(args = ARGV)
|
|
197
226
|
opt.on '--skip-stage2', 'do not run the stage2 install' do
|
198
227
|
@skip_stage2 = true
|
199
228
|
end
|
200
|
-
opt.on '--gem-source=URL', String, "use this source for RubyGems
|
229
|
+
opt.on '--gem-source=URL', String, "use this source for RubyGems "\
|
230
|
+
"instead of rubygems.org" do |url|
|
201
231
|
@gem_source = url
|
202
232
|
end
|
203
|
-
opt.on '--gems-path=PATH', "install gems under this path instead
|
233
|
+
opt.on '--gems-path=PATH', "install gems under this path instead "\
|
234
|
+
"of ~/.autoproj/gems" do |path|
|
204
235
|
self.gems_install_path = path
|
205
236
|
end
|
206
237
|
opt.on '--public-gems', "install gems in the default gem location" do
|
207
238
|
self.install_gems_in_gem_user_dir
|
208
239
|
end
|
209
|
-
opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided
|
240
|
+
opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided "\
|
241
|
+
"string as a version constraint for autoproj' do |version|
|
210
242
|
if @gemfile
|
211
243
|
raise "cannot give both --version and --gemfile"
|
212
244
|
end
|
213
245
|
@gemfile = default_gemfile_contents(version)
|
214
246
|
end
|
215
|
-
opt.on '--gemfile=PATH', String, 'use the given Gemfile to install
|
247
|
+
opt.on '--gemfile=PATH', String, 'use the given Gemfile to install "\
|
248
|
+
"autoproj instead of the default' do |path|
|
216
249
|
if @gemfile
|
217
250
|
raise "cannot give both --version and --gemfile"
|
218
251
|
end
|
219
252
|
@gemfile = File.read(path)
|
220
253
|
end
|
221
|
-
opt.on '--seed-config=PATH', String, 'path to a seed file that
|
254
|
+
opt.on '--seed-config=PATH', String, 'path to a seed file that "\
|
255
|
+
"should be used to initialize the configuration' do |path|
|
222
256
|
@config.merge!(YAML.load(File.read(path)))
|
223
257
|
end
|
224
|
-
opt.on '--prefer-os-independent-packages', 'prefer OS-independent
|
258
|
+
opt.on '--prefer-os-independent-packages', 'prefer OS-independent "\
|
259
|
+
"packages (such as a RubyGem) over their OS-packaged equivalent "\
|
260
|
+
"(e.g. the thor gem vs. the ruby-thor debian package)' do
|
225
261
|
@prefer_indep_over_os_packages = true
|
226
262
|
end
|
227
|
-
opt.on '--[no-]color', 'do not use colored output (enabled by
|
263
|
+
opt.on '--[no-]color', 'do not use colored output (enabled by "\
|
264
|
+
"default if the terminal supports it)' do |color|
|
228
265
|
if color then autoproj_options << "--color"
|
229
266
|
else autoproj_options << '--no-color'
|
230
267
|
end
|
231
268
|
end
|
232
|
-
opt.on '--[no-]progress', 'do not use progress output (enabled by
|
269
|
+
opt.on '--[no-]progress', 'do not use progress output (enabled by "\
|
270
|
+
"default if the terminal supports it)' do |color|
|
233
271
|
if color then autoproj_options << "--progress"
|
234
272
|
else autoproj_options << '--no-progress'
|
235
273
|
end
|
@@ -262,9 +300,11 @@ def install_bundler(gem_program, silent: false)
|
|
262
300
|
|
263
301
|
result = system(
|
264
302
|
env_for_child.merge('GEM_HOME' => gems_gem_home),
|
265
|
-
Gem.ruby, gem_program, 'install',
|
266
|
-
|
267
|
-
|
303
|
+
Gem.ruby, gem_program, 'install',
|
304
|
+
'--env-shebang', '--no-document', '--no-format-executable',
|
305
|
+
'--clear-sources', '--source', gem_source,
|
306
|
+
*local, "--bindir=#{File.join(gems_gem_home, 'bin')}",
|
307
|
+
'bundler', **redirection)
|
268
308
|
|
269
309
|
if !result
|
270
310
|
STDERR.puts "FATAL: failed to install bundler in #{gems_gem_home}"
|
@@ -275,14 +315,15 @@ def install_bundler(gem_program, silent: false)
|
|
275
315
|
if File.exist?(bundler_path)
|
276
316
|
bundler_path
|
277
317
|
else
|
278
|
-
STDERR.puts "gem install bundler returned successfully, but still
|
318
|
+
STDERR.puts "gem install bundler returned successfully, but still "\
|
319
|
+
"cannot find bundler in #{bundler_path}"
|
279
320
|
nil
|
280
321
|
end
|
281
322
|
end
|
282
323
|
|
283
324
|
def install_autoproj(bundler)
|
284
|
-
# Force bundler to update. If the user does not want this, let
|
285
|
-
# Gemfile with tighter version constraints
|
325
|
+
# Force bundler to update. If the user does not want this, let
|
326
|
+
# him specify a Gemfile with tighter version constraints
|
286
327
|
lockfile = File.join(dot_autoproj, 'Gemfile.lock')
|
287
328
|
if File.exist?(lockfile)
|
288
329
|
FileUtils.rm lockfile
|
@@ -294,6 +335,7 @@ def install_autoproj(bundler)
|
|
294
335
|
opts << '--local' if local?
|
295
336
|
opts << "--path=#{gems_install_path}"
|
296
337
|
shims_path = File.join(dot_autoproj, 'bin')
|
338
|
+
|
297
339
|
result = system(clean_env,
|
298
340
|
Gem.ruby, bundler, 'install',
|
299
341
|
"--gemfile=#{autoproj_gemfile_path}",
|
@@ -306,12 +348,14 @@ def install_autoproj(bundler)
|
|
306
348
|
exit 1
|
307
349
|
end
|
308
350
|
ensure
|
309
|
-
self.class.rewrite_shims(shims_path, ruby_executable,
|
351
|
+
self.class.rewrite_shims(shims_path, ruby_executable,
|
352
|
+
root_dir, autoproj_gemfile_path, gems_gem_home)
|
310
353
|
end
|
311
354
|
|
312
355
|
EXCLUDED_FROM_SHIMS = %w{rake thor}
|
313
356
|
|
314
|
-
def self.rewrite_shims(shim_path, ruby_executable,
|
357
|
+
def self.rewrite_shims(shim_path, ruby_executable,
|
358
|
+
root_dir, autoproj_gemfile_path, gems_gem_home)
|
315
359
|
FileUtils.mkdir_p shim_path
|
316
360
|
File.open(File.join(shim_path, 'ruby'), 'w') do |io|
|
317
361
|
io.puts "#! /bin/sh"
|
@@ -319,10 +363,9 @@ def self.rewrite_shims(shim_path, ruby_executable, root_dir, autoproj_gemfile_pa
|
|
319
363
|
end
|
320
364
|
FileUtils.chmod 0755, File.join(shim_path, 'ruby')
|
321
365
|
|
322
|
-
FileUtils.touch File.join(shim_path, 'bundler')
|
323
|
-
FileUtils.touch File.join(shim_path, 'bundle')
|
324
366
|
Dir.glob(File.join(shim_path, '*')) do |bin_script|
|
325
|
-
next
|
367
|
+
next unless File.file?(bin_script)
|
368
|
+
|
326
369
|
bin_name = File.basename(bin_script)
|
327
370
|
if EXCLUDED_FROM_SHIMS.include?(bin_name)
|
328
371
|
FileUtils.rm_f bin_script
|
@@ -332,19 +375,46 @@ def self.rewrite_shims(shim_path, ruby_executable, root_dir, autoproj_gemfile_pa
|
|
332
375
|
|
333
376
|
bin_shim = File.join(shim_path, bin_name)
|
334
377
|
bin_script_lines = File.readlines(bin_script)
|
378
|
+
next if has_autoproj_preamble?(bin_script_lines)
|
379
|
+
|
335
380
|
File.open(bin_shim, 'w') do |io|
|
336
381
|
if bin_name == 'bundler' || bin_name == 'bundle'
|
337
|
-
io.puts shim_bundler(
|
382
|
+
io.puts shim_bundler(bin_script_lines, ruby_executable,
|
383
|
+
autoproj_gemfile_path, gems_gem_home)
|
338
384
|
else
|
339
|
-
|
340
|
-
|
385
|
+
io.puts shim_script(bin_script_lines, ruby_executable, root_dir,
|
386
|
+
autoproj_gemfile_path, gems_gem_home)
|
341
387
|
end
|
342
388
|
end
|
343
389
|
FileUtils.chmod 0755, bin_shim
|
344
390
|
end
|
345
391
|
end
|
346
392
|
|
347
|
-
def self.
|
393
|
+
def self.new_style_bundler_binstub?(script_lines)
|
394
|
+
script_lines.any? { |l| l =~ /This file was generated by Bundler/ }
|
395
|
+
end
|
396
|
+
|
397
|
+
def self.has_autoproj_preamble?(script_lines)
|
398
|
+
script_lines.any? { |l| l =~ /Autoproj generated preamble/ }
|
399
|
+
end
|
400
|
+
|
401
|
+
def self.shim_bundler(script_lines, ruby_executable, autoproj_gemfile_path, gems_gem_home)
|
402
|
+
return shim_bundler_old(ruby_executable, autoproj_gemfile_path, gems_gem_home) \
|
403
|
+
unless new_style_bundler_binstub?(script_lines)
|
404
|
+
|
405
|
+
script_lines.insert(1, <<-RESTART_BUNDLER)
|
406
|
+
# Autoproj generated preamble
|
407
|
+
if defined?(Bundler)
|
408
|
+
Bundler.with_clean_env do
|
409
|
+
exec($0, *ARGV)
|
410
|
+
end
|
411
|
+
end
|
412
|
+
ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
|
413
|
+
RESTART_BUNDLER
|
414
|
+
script_lines.join
|
415
|
+
end
|
416
|
+
|
417
|
+
def self.shim_bundler_old(ruby_executable, autoproj_gemfile_path, gems_gem_home)
|
348
418
|
"#! #{ruby_executable}
|
349
419
|
|
350
420
|
if defined?(Bundler)
|
@@ -360,8 +430,35 @@ def self.shim_bundler(ruby_executable, autoproj_gemfile_path, gems_gem_home)
|
|
360
430
|
|
361
431
|
load Gem.bin_path('bundler', 'bundler')"
|
362
432
|
end
|
363
|
-
|
364
|
-
def self.shim_script(ruby_executable, root_dir,
|
433
|
+
|
434
|
+
def self.shim_script(script_lines, ruby_executable, root_dir,
|
435
|
+
autoproj_gemfile_path, gems_gem_home)
|
436
|
+
new_style = !script_lines.empty? && script_lines.any? do |l|
|
437
|
+
l =~ /This file was generated by Bundler/
|
438
|
+
end
|
439
|
+
load_line = script_lines.grep(/load Gem.bin_path/).first
|
440
|
+
return shim_script_old(ruby_executable, root_dir,
|
441
|
+
autoproj_gemfile_path, gems_gem_home, load_line) \
|
442
|
+
unless new_style
|
443
|
+
|
444
|
+
script_lines.insert(1, <<-AUTOPROJ_PREAMBLE)
|
445
|
+
# Autoproj generated preamble, v1
|
446
|
+
if defined?(Bundler)
|
447
|
+
Bundler.with_clean_env do
|
448
|
+
exec(Hash['RUBYLIB' => nil], $0, *ARGV)
|
449
|
+
end
|
450
|
+
elsif ENV['RUBYLIB']
|
451
|
+
exec(Hash['RUBYLIB' => nil], $0, *ARGV)
|
452
|
+
end
|
453
|
+
|
454
|
+
ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
|
455
|
+
ENV['AUTOPROJ_CURRENT_ROOT'] = '#{root_dir}'
|
456
|
+
AUTOPROJ_PREAMBLE
|
457
|
+
return script_lines.join
|
458
|
+
end
|
459
|
+
|
460
|
+
def self.shim_script_old(ruby_executable, root_dir, autoproj_gemfile_path,
|
461
|
+
gems_gem_home, load_line)
|
365
462
|
"#! #{ruby_executable}
|
366
463
|
|
367
464
|
if defined?(Bundler)
|
@@ -423,9 +520,10 @@ def save_gemfile
|
|
423
520
|
"if File.file?(config_path)",
|
424
521
|
" require 'yaml'",
|
425
522
|
" config = YAML.load(File.read(config_path)) || Hash.new",
|
426
|
-
" (config['plugins'] || Hash.new).
|
427
|
-
"
|
428
|
-
"
|
523
|
+
" (config['plugins'] || Hash.new).",
|
524
|
+
" each do |plugin_name, (version, options)|",
|
525
|
+
" gem plugin_name, version, **options",
|
526
|
+
" end",
|
429
527
|
"end"
|
430
528
|
].join("\n")
|
431
529
|
|
@@ -439,7 +537,8 @@ def save_gemfile
|
|
439
537
|
|
440
538
|
|
441
539
|
def find_in_clean_path(command, *additional_paths)
|
442
|
-
clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR) +
|
540
|
+
clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR) +
|
541
|
+
additional_paths
|
443
542
|
clean_path.each do |p|
|
444
543
|
full_path = File.join(p, command)
|
445
544
|
if File.file?(full_path)
|
@@ -463,7 +562,8 @@ def gem_bindir
|
|
463
562
|
#
|
464
563
|
# So, we're calling 'gem' as a subcommand to discovery the
|
465
564
|
# actual bindir
|
466
|
-
bindir = IO.popen(env_for_child,
|
565
|
+
bindir = IO.popen(env_for_child,
|
566
|
+
[Gem.ruby, '-e', 'puts "#{Gem.user_dir}/bin"']).read
|
467
567
|
if bindir
|
468
568
|
@gem_bindir = bindir.chomp
|
469
569
|
else
|
@@ -473,7 +573,9 @@ def gem_bindir
|
|
473
573
|
|
474
574
|
def install
|
475
575
|
if ENV['BUNDLER_GEMFILE']
|
476
|
-
raise "cannot run autoproj_install or autoproj_bootstrap while
|
576
|
+
raise "cannot run autoproj_install or autoproj_bootstrap while "\
|
577
|
+
"under a 'bundler exec' subcommand or having loaded an env.sh. "\
|
578
|
+
"Open a new console and try again"
|
477
579
|
end
|
478
580
|
|
479
581
|
gem_program = self.class.guess_gem_program
|
@@ -503,7 +605,7 @@ def install
|
|
503
605
|
|
504
606
|
def load_config
|
505
607
|
v1_config_path = File.join(root_dir, 'autoproj', 'config.yml')
|
506
|
-
|
608
|
+
|
507
609
|
config = Hash.new
|
508
610
|
if File.file?(v1_config_path)
|
509
611
|
config.merge!(YAML.load(File.read(v1_config_path)) || Hash.new)
|
@@ -517,7 +619,10 @@ def load_config
|
|
517
619
|
ruby_executable = File.join(ruby_bindir, ruby)
|
518
620
|
if current = config['ruby_executable'] # When upgrading or reinstalling
|
519
621
|
if current != ruby_executable
|
520
|
-
raise "this workspace has already been initialized using
|
622
|
+
raise "this workspace has already been initialized using "\
|
623
|
+
"#{current}, you cannot run autoproj install with "\
|
624
|
+
"#{ruby_executable}. If you know what you're doing, "\
|
625
|
+
"delete the ruby_executable line in config.yml and try again"
|
521
626
|
end
|
522
627
|
else
|
523
628
|
config['ruby_executable'] = ruby_executable
|
@@ -576,18 +681,19 @@ def stage2(*vars)
|
|
576
681
|
save_env_sh(*vars)
|
577
682
|
puts "running 'autoproj envsh' to generate a proper env.sh"
|
578
683
|
if !system(Gem.ruby, autoproj_path, 'envsh', *autoproj_options)
|
579
|
-
STDERR.puts "failed to run autoproj envsh on the newly installed
|
684
|
+
STDERR.puts "failed to run autoproj envsh on the newly installed "\
|
685
|
+
"autoproj (#{autoproj_path})"
|
580
686
|
exit 1
|
581
687
|
end
|
582
688
|
# This is really needed on an existing install to install the
|
583
689
|
# gems that were present in the v1 layout
|
584
690
|
puts "running 'autoproj osdeps' to re-install missing gems"
|
585
691
|
if !system(Gem.ruby, autoproj_path, 'osdeps')
|
586
|
-
STDERR.puts "failed to run autoproj osdeps on the newly installed
|
692
|
+
STDERR.puts "failed to run autoproj osdeps on the newly installed "\
|
693
|
+
"autoproj (#{autoproj_path})"
|
587
694
|
exit 1
|
588
695
|
end
|
589
696
|
end
|
590
697
|
end
|
591
698
|
end
|
592
699
|
end
|
593
|
-
|