autoproj 2.0.0.rc3 → 2.0.0.rc4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +9 -29
- data/bin/autoproj_bootstrap +159 -3150
- data/bin/autoproj_bootstrap.in +4 -256
- data/bin/autoproj_install +225 -0
- data/bin/autoproj_install.in +14 -0
- data/lib/autoproj.rb +2 -1
- data/lib/autoproj/autobuild.rb +2 -2
- data/lib/autoproj/cli/bootstrap.rb +0 -39
- data/lib/autoproj/cli/build.rb +0 -3
- data/lib/autoproj/cli/main.rb +13 -1
- data/lib/autoproj/cli/osdeps.rb +1 -1
- data/lib/autoproj/cli/show.rb +1 -1
- data/lib/autoproj/cli/update.rb +4 -4
- data/lib/autoproj/cli/upgrade.rb +71 -0
- data/lib/autoproj/configuration.rb +18 -1
- data/lib/autoproj/exceptions.rb +7 -0
- data/lib/autoproj/installation_manifest.rb +23 -12
- data/lib/autoproj/manifest.rb +22 -48
- data/lib/autoproj/ops/build.rb +2 -2
- data/lib/autoproj/ops/configuration.rb +1 -1
- data/lib/autoproj/ops/import.rb +1 -1
- data/lib/autoproj/ops/install.rb +211 -0
- data/lib/autoproj/ops/main_config_switcher.rb +1 -5
- data/lib/autoproj/os_package_installer.rb +348 -0
- data/lib/autoproj/{osdeps.rb → os_package_resolver.rb} +56 -392
- data/lib/autoproj/package_managers/apt_dpkg_manager.rb +2 -2
- data/lib/autoproj/package_managers/bundler_manager.rb +179 -0
- data/lib/autoproj/package_managers/emerge_manager.rb +2 -2
- data/lib/autoproj/package_managers/gem_manager.rb +7 -6
- data/lib/autoproj/package_managers/homebrew_manager.rb +2 -2
- data/lib/autoproj/package_managers/manager.rb +5 -6
- data/lib/autoproj/package_managers/pacman_manager.rb +2 -2
- data/lib/autoproj/package_managers/pip_manager.rb +8 -8
- data/lib/autoproj/package_managers/pkg_manager.rb +2 -2
- data/lib/autoproj/package_managers/port_manager.rb +2 -2
- data/lib/autoproj/package_managers/shell_script_manager.rb +4 -4
- data/lib/autoproj/package_managers/unknown_os_manager.rb +2 -2
- data/lib/autoproj/package_managers/yum_manager.rb +2 -2
- data/lib/autoproj/package_managers/zypper_manager.rb +2 -2
- data/lib/autoproj/package_set.rb +10 -10
- data/lib/autoproj/reporter.rb +3 -2
- data/lib/autoproj/system.rb +1 -4
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +155 -32
- metadata +9 -3
data/lib/autoproj/ops/build.rb
CHANGED
@@ -19,10 +19,10 @@ def initialize(manifest)
|
|
19
19
|
# It rebuilds (i.e. does a clean + build) of all packages declared
|
20
20
|
# in the manifest's layout. It also performs a reinstall of all
|
21
21
|
# non-OS-specific managers that support it (e.g. RubyGems) if
|
22
|
-
# {
|
22
|
+
# {update_os_packages?} is set to true (the default)
|
23
23
|
def rebuild_all
|
24
24
|
packages = manifest.all_layout_packages
|
25
|
-
manifest.
|
25
|
+
manifest.pristine_os_packages(packages)
|
26
26
|
rebuild_packages(packages, packages)
|
27
27
|
end
|
28
28
|
|
@@ -140,7 +140,7 @@ def update_remote_package_set(vcs, options = Hash.new)
|
|
140
140
|
Autoproj.message("autoproj: updating remote definitions of package sets", :bold)
|
141
141
|
@remote_update_message_displayed = true
|
142
142
|
end
|
143
|
-
ws.
|
143
|
+
ws.install_os_packages([vcs.type])
|
144
144
|
update_configuration_repository(
|
145
145
|
vcs, name, raw_local_dir, options)
|
146
146
|
end
|
data/lib/autoproj/ops/import.rb
CHANGED
@@ -28,7 +28,7 @@ def mark_exclusion_along_revdeps(pkg_name, revdeps, chain = [], reason = nil)
|
|
28
28
|
end
|
29
29
|
|
30
30
|
VALID_OSDEP_AVAILABILITY =
|
31
|
-
[
|
31
|
+
[OSPackageResolver::AVAILABLE, OSPackageResolver::IGNORE]
|
32
32
|
|
33
33
|
def import_next_step(pkg, reverse_dependencies)
|
34
34
|
new_packages = []
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Autoproj
|
6
|
+
module Ops
|
7
|
+
# This class contains the functionality necessary to install autoproj in a
|
8
|
+
# clean root
|
9
|
+
#
|
10
|
+
# It can be required standalone (i.e. does not depend on anything else than
|
11
|
+
# ruby and the ruby standard library)
|
12
|
+
class Install
|
13
|
+
# The directory in which to install autoproj
|
14
|
+
attr_reader :root_dir
|
15
|
+
# Content of the Gemfile generated to install autoproj itself
|
16
|
+
attr_accessor :gemfile
|
17
|
+
|
18
|
+
def initialize(root_dir)
|
19
|
+
@root_dir = root_dir
|
20
|
+
@gemfile = default_gemfile_contents
|
21
|
+
@private_bundler = false
|
22
|
+
@private_autoproj = false
|
23
|
+
@private_gems = false
|
24
|
+
end
|
25
|
+
|
26
|
+
def dot_autoproj; File.join(root_dir, '.autoproj') end
|
27
|
+
def bin_dir; File.join(dot_autoproj, 'bin') end
|
28
|
+
def bundler_install_dir; File.join(dot_autoproj, 'bundler') end
|
29
|
+
def autoproj_install_dir; File.join(dot_autoproj, 'autoproj') end
|
30
|
+
# The path to the gemfile used to install autoproj
|
31
|
+
def autoproj_gemfile_path; File.join(autoproj_install_dir, 'Gemfile') end
|
32
|
+
def autoproj_config_path; File.join(dot_autoproj, 'config.yml') end
|
33
|
+
|
34
|
+
# Whether bundler should be installed locally in {#dot_autoproj}
|
35
|
+
def private_bundler?; @private_bundler end
|
36
|
+
# Whether autoproj should be installed locally in {#dot_autoproj}
|
37
|
+
def private_autoproj?; @private_autoproj end
|
38
|
+
# Whether bundler should be installed locally in the workspace
|
39
|
+
# prefix directory
|
40
|
+
def private_gems?; @private_gems end
|
41
|
+
|
42
|
+
def guess_gem_program
|
43
|
+
ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
44
|
+
ruby_bindir = RbConfig::CONFIG['bindir']
|
45
|
+
|
46
|
+
candidates = ['gem']
|
47
|
+
if ruby_bin =~ /^ruby(.+)$/
|
48
|
+
candidates << "gem#{$1}"
|
49
|
+
end
|
50
|
+
|
51
|
+
candidates.each do |gem_name|
|
52
|
+
if File.file?(gem_full_path = File.join(ruby_bindir, gem_name))
|
53
|
+
return gem_full_path
|
54
|
+
end
|
55
|
+
end
|
56
|
+
raise ArgumentError, "cannot find a gem program (tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
|
57
|
+
end
|
58
|
+
|
59
|
+
# The content of the default {#gemfile}
|
60
|
+
#
|
61
|
+
# @param [String] autoproj_version a constraint on the autoproj version
|
62
|
+
# that should be used
|
63
|
+
# @return [String]
|
64
|
+
def default_gemfile_contents(autoproj_version = ">= 0")
|
65
|
+
["source \"https://rubygems.org\"",
|
66
|
+
"gem \"autoproj\", \"#{autoproj_version}\""].join("\n")
|
67
|
+
end
|
68
|
+
|
69
|
+
# Parse the provided command line options and returns the non-options
|
70
|
+
def parse_options(args = ARGV)
|
71
|
+
options = OptionParser.new do |opt|
|
72
|
+
opt.on '--private-bundler', 'install bundler locally in the workspace' do
|
73
|
+
@private_bundler = true
|
74
|
+
end
|
75
|
+
opt.on '--private-autoproj', 'install autoproj locally in the workspace' do
|
76
|
+
@private_autoproj = true
|
77
|
+
end
|
78
|
+
opt.on '--private-gems', 'install gems locally in the prefix directory' do
|
79
|
+
@private_gems = true
|
80
|
+
end
|
81
|
+
opt.on '--private', 'whether bundler, autoproj and the workspace gems should be installed locally in the workspace' do
|
82
|
+
@private_bundler = true
|
83
|
+
@private_autoproj = true
|
84
|
+
@private_gems = true
|
85
|
+
end
|
86
|
+
opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided string as a version constraint for autoproj' do |version|
|
87
|
+
@gemfile = default_gemfile_contents(version)
|
88
|
+
end
|
89
|
+
opt.on '--gemfile=PATH', String, 'use the given Gemfile to install autoproj instead of the default' do |path|
|
90
|
+
@gemfile = File.read(path)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
options.parse(ARGV)
|
94
|
+
end
|
95
|
+
|
96
|
+
def install_bundler
|
97
|
+
gem_program = guess_gem_program
|
98
|
+
puts "Detected 'gem' to be #{gem_program}"
|
99
|
+
|
100
|
+
result = system(
|
101
|
+
Hash['GEM_PATH' => nil,
|
102
|
+
'GEM_HOME' => bundler_install_dir],
|
103
|
+
gem_program, 'install', '--no-document', '--no-user-install', '--no-format-executable',
|
104
|
+
"--bindir=#{File.join(bundler_install_dir, 'bin')}", 'bundler')
|
105
|
+
|
106
|
+
if !result
|
107
|
+
STDERR.puts "FATAL: failed to install bundler in #{dot_autoproj}"
|
108
|
+
exit 1
|
109
|
+
end
|
110
|
+
File.join(bin_dir, 'bundler')
|
111
|
+
end
|
112
|
+
|
113
|
+
def save_env_sh
|
114
|
+
env = Autobuild::Environment.new
|
115
|
+
path = []
|
116
|
+
if private_bundler?
|
117
|
+
env.push_path 'PATH', File.join(bundler_install_dir, 'bin')
|
118
|
+
env.push_path 'GEM_PATH', bundler_install_dir
|
119
|
+
end
|
120
|
+
env.push_path 'PATH', File.join(autoproj_install_dir, 'bin')
|
121
|
+
env.inherit 'PATH'
|
122
|
+
if private_autoproj?
|
123
|
+
env.push_path 'GEM_PATH', autoproj_install_dir
|
124
|
+
end
|
125
|
+
|
126
|
+
# Generate environment files right now, we can at least use bundler
|
127
|
+
File.open(File.join(dot_autoproj, 'env.sh'), 'w') do |io|
|
128
|
+
env.export_env_sh(io)
|
129
|
+
end
|
130
|
+
|
131
|
+
File.open(File.join(root_dir, 'env.sh'), 'w') do |io|
|
132
|
+
io.write <<-EOSHELL
|
133
|
+
source "#{File.join(dot_autoproj, 'env.sh')}"
|
134
|
+
export AUTOPROJ_CURRENT_ROOT=#{root_dir}
|
135
|
+
EOSHELL
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def save_gemfile
|
140
|
+
FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
|
141
|
+
File.open(autoproj_gemfile_path, 'w') do |io|
|
142
|
+
io.write gemfile
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def install_autoproj(bundler)
|
147
|
+
# Force bundler to update. If the user does not want this, let him specify a
|
148
|
+
# Gemfile with tighter version constraints
|
149
|
+
lockfile = File.join(File.dirname(autoproj_gemfile_path), 'Gemfile.lock')
|
150
|
+
if File.exist?(lockfile)
|
151
|
+
FileUtils.rm lockfile
|
152
|
+
end
|
153
|
+
|
154
|
+
env = Hash['BUNDLE_GEMFILE' => nil, 'RUBYLIB' => nil]
|
155
|
+
opts = Array.new
|
156
|
+
|
157
|
+
if private_autoproj?
|
158
|
+
env = Hash['GEM_PATH' => bundler_install_dir,
|
159
|
+
'GEM_HOME' => nil]
|
160
|
+
opts << "--clean" << "--path=#{autoproj_install_dir}"
|
161
|
+
end
|
162
|
+
|
163
|
+
result = system(env,
|
164
|
+
bundler, 'install',
|
165
|
+
"--gemfile=#{autoproj_gemfile_path}",
|
166
|
+
"--binstubs=#{File.join(autoproj_install_dir, 'bin')}",
|
167
|
+
*opts)
|
168
|
+
if !result
|
169
|
+
STDERR.puts "FATAL: failed to install autoproj in #{dot_autoproj}"
|
170
|
+
exit 1
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def update_configuration
|
175
|
+
if File.exist?(autoproj_config_path)
|
176
|
+
config = YAML.load(File.read(autoproj_config_path)) || Hash.new
|
177
|
+
else
|
178
|
+
config = Hash.new
|
179
|
+
end
|
180
|
+
config['private_bundler'] = private_bundler?
|
181
|
+
config['private_autoproj'] = private_autoproj?
|
182
|
+
config['private_gems'] = private_gems?
|
183
|
+
File.open(autoproj_config_path, 'w') do |io|
|
184
|
+
YAML.dump(config, io)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def install
|
189
|
+
if private_bundler?
|
190
|
+
puts "Installing bundler in #{bundler_install_dir}"
|
191
|
+
bundler = install_bundler
|
192
|
+
end
|
193
|
+
save_gemfile
|
194
|
+
puts "Installing autoproj in #{dot_autoproj}"
|
195
|
+
install_autoproj(bundler || 'bundler')
|
196
|
+
end
|
197
|
+
|
198
|
+
# Actually perform the install
|
199
|
+
def run
|
200
|
+
install
|
201
|
+
ENV['BUNDLE_GEMFILE'] = autoproj_gemfile_path
|
202
|
+
require 'bundler'
|
203
|
+
Bundler.setup
|
204
|
+
require 'autobuild'
|
205
|
+
save_env_sh
|
206
|
+
update_configuration
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
@@ -81,10 +81,6 @@ def bootstrap(buildconf_info, options = Hash.new)
|
|
81
81
|
validate_autoproj_current_root(options[:reuse])
|
82
82
|
|
83
83
|
ws.config.validate_ruby_executable
|
84
|
-
|
85
|
-
PackageManagers::GemManager.with_prerelease(ws.config.use_prerelease?) do
|
86
|
-
ws.osdeps.install(%w{autobuild autoproj})
|
87
|
-
end
|
88
84
|
ws.config.set 'reused_autoproj_installations', options[:reuse], true
|
89
85
|
ws.env.export_env_sh(nil, shell_helpers: ws.config.shell_helpers?)
|
90
86
|
|
@@ -174,7 +170,7 @@ def do_switch_config(delete_current, type, url, *options)
|
|
174
170
|
vcs = VCSDefinition.from_raw(vcs_def)
|
175
171
|
|
176
172
|
# Install the OS dependencies required for this VCS
|
177
|
-
ws.
|
173
|
+
ws.install_os_packages([vcs.type])
|
178
174
|
|
179
175
|
# Now check out the actual configuration
|
180
176
|
config_dir = File.join(ws.root_dir, "autoproj")
|
@@ -0,0 +1,348 @@
|
|
1
|
+
require 'autoproj/package_managers/manager'
|
2
|
+
require 'autoproj/package_managers/unknown_os_manager'
|
3
|
+
require 'autoproj/package_managers/shell_script_manager'
|
4
|
+
|
5
|
+
require 'autoproj/package_managers/apt_dpkg_manager'
|
6
|
+
require 'autoproj/package_managers/emerge_manager'
|
7
|
+
require 'autoproj/package_managers/homebrew_manager'
|
8
|
+
require 'autoproj/package_managers/pacman_manager'
|
9
|
+
require 'autoproj/package_managers/pkg_manager'
|
10
|
+
require 'autoproj/package_managers/port_manager'
|
11
|
+
require 'autoproj/package_managers/yum_manager'
|
12
|
+
require 'autoproj/package_managers/zypper_manager'
|
13
|
+
|
14
|
+
require 'autoproj/package_managers/bundler_manager'
|
15
|
+
require 'autoproj/package_managers/pip_manager'
|
16
|
+
|
17
|
+
module Autoproj
|
18
|
+
class OSPackageInstaller
|
19
|
+
attr_reader :ws
|
20
|
+
|
21
|
+
PACKAGE_MANAGERS = Hash[
|
22
|
+
'apt-dpkg' => PackageManagers::AptDpkgManager,
|
23
|
+
'gem' => PackageManagers::BundlerManager,
|
24
|
+
'emerge' => PackageManagers::EmergeManager,
|
25
|
+
'brew' => PackageManagers::PacmanManager,
|
26
|
+
'pacman' => PackageManagers::HomebrewManager,
|
27
|
+
'pip' => PackageManagers::YumManager,
|
28
|
+
'pkg' => PackageManagers::PortManager,
|
29
|
+
'macports' => PackageManagers::ZypperManager,
|
30
|
+
'yum' => PackageManagers::PipManager ,
|
31
|
+
'zypper' => PackageManagers::PkgManager
|
32
|
+
]
|
33
|
+
|
34
|
+
attr_reader :os_package_resolver
|
35
|
+
|
36
|
+
# The set of packages that have already been installed
|
37
|
+
attr_reader :installed_packages
|
38
|
+
|
39
|
+
attr_writer :silent
|
40
|
+
def silent?; @silent end
|
41
|
+
|
42
|
+
class << self
|
43
|
+
attr_accessor :force_osdeps
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(ws, os_package_resolver)
|
47
|
+
@ws = ws
|
48
|
+
@os_package_resolver = os_package_resolver
|
49
|
+
@installed_packages = Set.new
|
50
|
+
@silent = true
|
51
|
+
@filter_uptodate_packages = true
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns the package manager object for the current OS
|
55
|
+
def os_package_manager
|
56
|
+
if !@os_package_manager
|
57
|
+
name = os_package_resolver.os_package_manager
|
58
|
+
@os_package_manager = package_managers[name] ||
|
59
|
+
PackageManagers::UnknownOSManager.new(ws)
|
60
|
+
end
|
61
|
+
return @os_package_manager
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns the set of package managers
|
65
|
+
def package_managers
|
66
|
+
if !@package_managers
|
67
|
+
@package_managers = Hash.new
|
68
|
+
PACKAGE_MANAGERS.each do |name, klass|
|
69
|
+
@package_managers[name] = klass.new(ws)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
@package_managers
|
73
|
+
end
|
74
|
+
|
75
|
+
def each_manager(&block)
|
76
|
+
package_managers.each_value(&block)
|
77
|
+
end
|
78
|
+
|
79
|
+
HANDLE_ALL = 'all'
|
80
|
+
HANDLE_RUBY = 'ruby'
|
81
|
+
HANDLE_OS = 'os'
|
82
|
+
HANDLE_NONE = 'none'
|
83
|
+
|
84
|
+
def osdeps_mode_option_unsupported_os(config)
|
85
|
+
long_doc =<<-EOT
|
86
|
+
The software packages that autoproj will have to build may require other
|
87
|
+
prepackaged softwares (a.k.a. OS dependencies) to be installed (RubyGems
|
88
|
+
packages, packages from your operating system/distribution, ...). Autoproj is
|
89
|
+
usually able to install those automatically, but unfortunately your operating
|
90
|
+
system is not (yet) supported by autoproj's osdeps mechanism, it can only offer
|
91
|
+
you some limited support.
|
92
|
+
|
93
|
+
Some package handlers are cross-platform, and are therefore supported. However,
|
94
|
+
you will have to install the kind of OS dependencies (so-called OS packages)
|
95
|
+
|
96
|
+
This option is meant to allow you to control autoproj's behaviour while handling
|
97
|
+
OS dependencies.
|
98
|
+
|
99
|
+
* if you say "all", all OS-independent packages are going to be installed.
|
100
|
+
* if you say "gem", the RubyGem packages will be installed.
|
101
|
+
* if you say "pip", the Pythin PIP packages will be installed.
|
102
|
+
* if you say "none", autoproj will not do anything related to the OS
|
103
|
+
dependencies.
|
104
|
+
|
105
|
+
As any configuration value, the mode can be changed anytime by calling
|
106
|
+
autoproj reconfigure
|
107
|
+
|
108
|
+
Finally, the "autoproj osdeps" command will give you the necessary information
|
109
|
+
about the OS packages that you will need to install manually.
|
110
|
+
|
111
|
+
So, what do you want ? (all, none or a comma-separated list of: gem pip)
|
112
|
+
EOT
|
113
|
+
message = [ "Which prepackaged software (a.k.a. 'osdeps') should autoproj install automatically (all, none or a comma-separated list of: gem pip) ?", long_doc.strip ]
|
114
|
+
|
115
|
+
config.declare 'osdeps_mode', 'string',
|
116
|
+
default: 'ruby',
|
117
|
+
doc: message,
|
118
|
+
lowercase: true
|
119
|
+
end
|
120
|
+
|
121
|
+
def osdeps_mode_option_supported_os(config)
|
122
|
+
long_doc =<<-EOT
|
123
|
+
The software packages that autoproj will have to build may require other
|
124
|
+
prepackaged softwares (a.k.a. OS dependencies) to be installed (RubyGems
|
125
|
+
packages, packages from your operating system/distribution, ...). Autoproj
|
126
|
+
is able to install those automatically for you.
|
127
|
+
|
128
|
+
Advanced users may want to control this behaviour. Additionally, the
|
129
|
+
installation of some packages require administration rights, which you may
|
130
|
+
not have. This option is meant to allow you to control autoproj's behaviour
|
131
|
+
while handling OS dependencies.
|
132
|
+
|
133
|
+
* if you say "all", it will install all packages automatically.
|
134
|
+
This requires root access thru 'sudo'
|
135
|
+
* if you say "pip", only the Ruby packages will be installed.
|
136
|
+
Installing these packages does not require root access.
|
137
|
+
* if you say "gem", only the Ruby packages will be installed.
|
138
|
+
Installing these packages does not require root access.
|
139
|
+
* if you say "os", only the OS-provided packages will be installed.
|
140
|
+
Installing these packages requires root access.
|
141
|
+
* if you say "none", autoproj will not do anything related to the
|
142
|
+
OS dependencies.
|
143
|
+
|
144
|
+
Finally, you can provide a comma-separated list of pip gem and os.
|
145
|
+
|
146
|
+
As any configuration value, the mode can be changed anytime by calling
|
147
|
+
autoproj reconfigure
|
148
|
+
|
149
|
+
Finally, the "autoproj osdeps" command will give you the necessary information
|
150
|
+
about the OS packages that you will need to install manually.
|
151
|
+
|
152
|
+
So, what do you want ? (all, none or a comma-separated list of: os gem pip)
|
153
|
+
EOT
|
154
|
+
message = [ "Which prepackaged software (a.k.a. 'osdeps') should autoproj install automatically (all, none or a comma-separated list of: os gem pip) ?", long_doc.strip ]
|
155
|
+
|
156
|
+
config.declare 'osdeps_mode', 'string',
|
157
|
+
default: 'all',
|
158
|
+
doc: message,
|
159
|
+
lowercase: true
|
160
|
+
end
|
161
|
+
|
162
|
+
def define_osdeps_mode_option
|
163
|
+
if OSPackageResolver.supported_operating_system?
|
164
|
+
osdeps_mode_option_supported_os(ws.config)
|
165
|
+
else
|
166
|
+
osdeps_mode_option_unsupported_os(ws.config)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def osdeps_mode_string_to_value(string)
|
171
|
+
string = string.to_s.downcase.split(',')
|
172
|
+
modes = []
|
173
|
+
string.map do |str|
|
174
|
+
case str
|
175
|
+
when 'all' then modes.concat(['os', 'gem', 'pip'])
|
176
|
+
when 'ruby' then modes << 'gem'
|
177
|
+
when 'gem' then modes << 'gem'
|
178
|
+
when 'pip' then modes << 'pip'
|
179
|
+
when 'os' then modes << 'os'
|
180
|
+
when 'none' then
|
181
|
+
else raise ArgumentError, "#{str} is not a known package handler"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
modes
|
185
|
+
end
|
186
|
+
|
187
|
+
# If set to true (the default), #install will try to remove the list of
|
188
|
+
# already uptodate packages from the installed packages. Set to false to
|
189
|
+
# install all packages regardless of their status
|
190
|
+
attr_writer :filter_uptodate_packages
|
191
|
+
|
192
|
+
# If set to true (the default), #install will try to remove the list of
|
193
|
+
# already uptodate packages from the installed packages. Use
|
194
|
+
# #filter_uptodate_packages= to set it to false to install all packages
|
195
|
+
# regardless of their status
|
196
|
+
def filter_uptodate_packages?
|
197
|
+
!!@filter_uptodate_packages
|
198
|
+
end
|
199
|
+
|
200
|
+
# Override the osdeps mode
|
201
|
+
def osdeps_mode=(value)
|
202
|
+
@osdeps_mode = osdeps_mode_string_to_value(value)
|
203
|
+
end
|
204
|
+
|
205
|
+
# Returns the osdeps mode chosen by the user
|
206
|
+
def osdeps_mode
|
207
|
+
# This has two uses. It caches the value extracted from the
|
208
|
+
# AUTOPROJ_OSDEPS_MODE and/or configuration file. Moreover, it
|
209
|
+
# allows to override the osdeps mode by using
|
210
|
+
# OSPackageInstaller#osdeps_mode=
|
211
|
+
if @osdeps_mode
|
212
|
+
return @osdeps_mode
|
213
|
+
end
|
214
|
+
|
215
|
+
config = ws.config
|
216
|
+
while true
|
217
|
+
mode =
|
218
|
+
if !config.has_value_for?('osdeps_mode') && mode_name = ENV['AUTOPROJ_OSDEPS_MODE']
|
219
|
+
begin osdeps_mode_string_to_value(mode_name)
|
220
|
+
rescue ArgumentError
|
221
|
+
Autoproj.warn "invalid osdeps mode given through AUTOPROJ_OSDEPS_MODE (#{mode})"
|
222
|
+
nil
|
223
|
+
end
|
224
|
+
else
|
225
|
+
mode_name = config.get('osdeps_mode')
|
226
|
+
begin osdeps_mode_string_to_value(mode_name)
|
227
|
+
rescue ArgumentError
|
228
|
+
Autoproj.warn "invalid osdeps mode stored in configuration file"
|
229
|
+
nil
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
if mode
|
234
|
+
@osdeps_mode = mode
|
235
|
+
config.set('osdeps_mode', mode_name, true)
|
236
|
+
return mode
|
237
|
+
end
|
238
|
+
|
239
|
+
# Invalid configuration values. Retry
|
240
|
+
config.reset('osdeps_mode')
|
241
|
+
ENV['AUTOPROJ_OSDEPS_MODE'] = nil
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
# Set up the registered package handlers according to the specified osdeps mode
|
246
|
+
#
|
247
|
+
# It enables/disables package handlers based on either the value
|
248
|
+
# returned by {#osdeps_mode} or the value passed as option (the latter
|
249
|
+
# takes precedence). Moreover, sets the handler's silent flag using
|
250
|
+
# {#silent?}
|
251
|
+
#
|
252
|
+
# @option options [Array<String>] the package handlers that should be
|
253
|
+
# enabled. The default value is returned by {#osdeps_mode}
|
254
|
+
# @return [Array<PackageManagers::Manager>] the set of enabled package
|
255
|
+
# managers
|
256
|
+
def setup_package_managers(options = Hash.new)
|
257
|
+
options = Kernel.validate_options options,
|
258
|
+
osdeps_mode: osdeps_mode
|
259
|
+
|
260
|
+
os_package_manager.enabled = false
|
261
|
+
package_managers.each_value do |handler|
|
262
|
+
handler.enabled = false
|
263
|
+
end
|
264
|
+
options[:osdeps_mode].each do |m|
|
265
|
+
if m == 'os'
|
266
|
+
os_package_manager.enabled = true
|
267
|
+
elsif pkg = package_managers[m]
|
268
|
+
pkg.enabled = true
|
269
|
+
else
|
270
|
+
Autoproj.warn "osdep handler #{m.inspect} has no handler, available handlers are #{package_managers.keys.map(&:inspect).sort.join(", ")}"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
os_package_manager.silent = self.silent?
|
274
|
+
package_managers.each_value do |v|
|
275
|
+
v.silent = self.silent?
|
276
|
+
end
|
277
|
+
|
278
|
+
enabled_handlers = []
|
279
|
+
if os_package_manager.enabled?
|
280
|
+
enabled_handlers << os_package_manager
|
281
|
+
end
|
282
|
+
package_managers.each_value do |v|
|
283
|
+
if v.enabled?
|
284
|
+
enabled_handlers << v
|
285
|
+
end
|
286
|
+
end
|
287
|
+
enabled_handlers
|
288
|
+
end
|
289
|
+
|
290
|
+
# Requests that packages that are handled within the autoproj project
|
291
|
+
# (i.e. gems) are restored to pristine condition
|
292
|
+
#
|
293
|
+
# This is usually called as a rebuild step to make sure that all these
|
294
|
+
# packages are updated to whatever required the rebuild
|
295
|
+
def pristine(packages, options = Hash.new)
|
296
|
+
install(packages, options.merge(install_only: true))
|
297
|
+
packages = os_package_resolver.resolve_os_packages(packages)
|
298
|
+
|
299
|
+
_, other_packages =
|
300
|
+
packages.partition { |handler, list| handler == os_package_manager }
|
301
|
+
other_packages.each do |handler, list|
|
302
|
+
if handler.respond_to?(:pristine)
|
303
|
+
handler.pristine(list)
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
# Requests the installation of the given set of packages
|
309
|
+
def install(packages, options = Hash.new)
|
310
|
+
# Remove the set of packages that have already been installed
|
311
|
+
packages = packages.to_set - installed_packages
|
312
|
+
return false if packages.empty?
|
313
|
+
|
314
|
+
filter_options, options =
|
315
|
+
filter_options options, install_only: !Autobuild.do_update
|
316
|
+
setup_package_managers(options)
|
317
|
+
|
318
|
+
packages = os_package_resolver.resolve_os_packages(packages)
|
319
|
+
packages = packages.map do |handler_name, list|
|
320
|
+
[package_managers[handler_name], list]
|
321
|
+
end
|
322
|
+
|
323
|
+
needs_filter = (filter_uptodate_packages? || filter_options[:install_only])
|
324
|
+
packages = packages.map do |handler, list|
|
325
|
+
if needs_filter && handler.respond_to?(:filter_uptodate_packages)
|
326
|
+
list = handler.filter_uptodate_packages(list, filter_options)
|
327
|
+
end
|
328
|
+
|
329
|
+
if !list.empty?
|
330
|
+
[handler, list]
|
331
|
+
end
|
332
|
+
end.compact
|
333
|
+
return false if packages.empty?
|
334
|
+
|
335
|
+
# Install OS packages first, as the other package handlers might
|
336
|
+
# depend on OS packages
|
337
|
+
os_packages, other_packages = packages.partition { |handler, list| handler == os_package_manager }
|
338
|
+
[os_packages, other_packages].each do |packages|
|
339
|
+
packages.each do |handler, list|
|
340
|
+
handler.install(list)
|
341
|
+
@installed_packages |= list.to_set
|
342
|
+
end
|
343
|
+
end
|
344
|
+
true
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|