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
@@ -1,25 +1,9 @@
|
|
1
1
|
require 'tempfile'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
-
require 'autoproj/package_managers/manager'
|
5
|
-
require 'autoproj/package_managers/unknown_os_manager'
|
6
|
-
require 'autoproj/package_managers/shell_script_manager'
|
7
|
-
|
8
|
-
require 'autoproj/package_managers/apt_dpkg_manager'
|
9
|
-
require 'autoproj/package_managers/emerge_manager'
|
10
|
-
require 'autoproj/package_managers/homebrew_manager'
|
11
|
-
require 'autoproj/package_managers/pacman_manager'
|
12
|
-
require 'autoproj/package_managers/pkg_manager'
|
13
|
-
require 'autoproj/package_managers/port_manager'
|
14
|
-
require 'autoproj/package_managers/yum_manager'
|
15
|
-
require 'autoproj/package_managers/zypper_manager'
|
16
|
-
|
17
|
-
require 'autoproj/package_managers/gem_manager'
|
18
|
-
require 'autoproj/package_managers/pip_manager'
|
19
|
-
|
20
4
|
module Autoproj
|
21
5
|
# Manager for packages provided by external package managers
|
22
|
-
class
|
6
|
+
class OSPackageResolver
|
23
7
|
class << self
|
24
8
|
# When requested to load a file called '$FILE', the osdeps code will
|
25
9
|
# also look for files called '$FILE-suffix', where 'suffix' is an
|
@@ -45,7 +29,7 @@ def self.load(file)
|
|
45
29
|
else ArgumentError
|
46
30
|
end
|
47
31
|
|
48
|
-
result =
|
32
|
+
result = new
|
49
33
|
candidates.each do |file|
|
50
34
|
next if !File.file?(file)
|
51
35
|
file = File.expand_path(file)
|
@@ -56,19 +40,18 @@ def self.load(file)
|
|
56
40
|
raise ConfigError.new, "error in #{file}: #{e.message}", e.backtrace
|
57
41
|
end
|
58
42
|
|
59
|
-
result.merge(
|
43
|
+
result.merge(new(data, file))
|
60
44
|
end
|
61
45
|
result
|
62
46
|
end
|
63
47
|
|
64
48
|
class << self
|
65
49
|
attr_reader :aliases
|
66
|
-
attr_accessor :force_osdeps
|
67
50
|
end
|
68
51
|
@aliases = Hash.new
|
69
52
|
|
70
|
-
|
71
|
-
|
53
|
+
# The underlying workspace
|
54
|
+
attr_reader :ws
|
72
55
|
|
73
56
|
def self.alias(old_name, new_name)
|
74
57
|
@aliases[new_name] = old_name
|
@@ -99,23 +82,14 @@ def self.load_default
|
|
99
82
|
Autoproj.warn "#{file} (from AUTOPROJ_DEFAULT_OSDEPS) is not a file, falling back to #{AUTOPROJ_OSDEPS}"
|
100
83
|
file = AUTOPROJ_OSDEPS
|
101
84
|
end
|
102
|
-
|
85
|
+
load(file)
|
103
86
|
end
|
104
87
|
|
105
88
|
def load_default
|
106
89
|
merge(self.class.load_default)
|
107
90
|
end
|
108
91
|
|
109
|
-
|
110
|
-
PackageManagers::GemManager,
|
111
|
-
PackageManagers::EmergeManager,
|
112
|
-
PackageManagers::PacmanManager,
|
113
|
-
PackageManagers::HomebrewManager,
|
114
|
-
PackageManagers::YumManager,
|
115
|
-
PackageManagers::PortManager,
|
116
|
-
PackageManagers::ZypperManager,
|
117
|
-
PackageManagers::PipManager ,
|
118
|
-
PackageManagers::PkgManager]
|
92
|
+
PACKAGE_MANAGERS = OSPackageInstaller::PACKAGE_MANAGERS.keys
|
119
93
|
|
120
94
|
# Mapping from OS name to package manager name
|
121
95
|
#
|
@@ -128,15 +102,15 @@ def load_default
|
|
128
102
|
# homebrew: package
|
129
103
|
#
|
130
104
|
# we need to be able to separate between OS and package manager names.
|
131
|
-
|
132
|
-
'debian'
|
133
|
-
'gentoo'
|
134
|
-
'arch'
|
135
|
-
'fedora'
|
105
|
+
OS_PACKAGE_MANAGERS = {
|
106
|
+
'debian' => 'apt-dpkg',
|
107
|
+
'gentoo' => 'emerge',
|
108
|
+
'arch' => 'pacman',
|
109
|
+
'fedora' => 'yum',
|
136
110
|
'macos-port' => 'macports',
|
137
111
|
'macos-brew' => 'brew',
|
138
|
-
'opensuse'
|
139
|
-
'freebsd'
|
112
|
+
'opensuse' => 'zypper',
|
113
|
+
'freebsd' => 'pkg'
|
140
114
|
}
|
141
115
|
|
142
116
|
# The information contained in the OSdeps files, as a hash
|
@@ -150,36 +124,28 @@ def load_default
|
|
150
124
|
attr_reader :sources
|
151
125
|
|
152
126
|
# Use to override the autodetected OS-specific package handler
|
153
|
-
attr_writer :
|
154
|
-
|
155
|
-
# Returns the package manager object for the current OS
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
@os_package_handler = PackageManagers::UnknownOSManager.new
|
127
|
+
attr_writer :os_package_manager
|
128
|
+
|
129
|
+
# Returns the name of the package manager object for the current OS
|
130
|
+
#
|
131
|
+
# @return [String]
|
132
|
+
def os_package_manager
|
133
|
+
if !instance_variable_defined?(:@os_package_manager)
|
134
|
+
os_names, _ = OSPackageResolver.operating_system
|
135
|
+
os_name = os_names.find { |name| OS_PACKAGE_MANAGERS[name] }
|
136
|
+
@os_package_manager = OS_PACKAGE_MANAGERS[os_name]
|
137
|
+
if !@os_package_manager
|
138
|
+
raise "unsupported OS #{os_names.join(", ")}"
|
166
139
|
end
|
167
140
|
end
|
168
|
-
return @
|
141
|
+
return @os_package_manager
|
169
142
|
end
|
170
143
|
|
171
|
-
# Returns the set of package managers
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
obj = klass.new
|
177
|
-
obj.names.each do |n|
|
178
|
-
@package_handlers[n] = obj
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
@package_handlers
|
144
|
+
# Returns the set of known package managers
|
145
|
+
#
|
146
|
+
# @return [Array<String>]
|
147
|
+
def package_managers
|
148
|
+
PACKAGE_MANAGERS
|
183
149
|
end
|
184
150
|
|
185
151
|
# The Gem::SpecFetcher object that should be used to query RubyGems, and
|
@@ -196,8 +162,6 @@ def initialize(defs = Hash.new, file = nil)
|
|
196
162
|
all_definitions[package_name] << [[file], defs[package_name]]
|
197
163
|
end
|
198
164
|
end
|
199
|
-
@silent = true
|
200
|
-
@filter_uptodate_packages = true
|
201
165
|
end
|
202
166
|
|
203
167
|
# Returns the name of all known OS packages
|
@@ -215,7 +179,7 @@ def source_of(package_name)
|
|
215
179
|
end
|
216
180
|
|
217
181
|
# Merges the osdeps information of +info+ into +self+. If packages are
|
218
|
-
# defined in both
|
182
|
+
# defined in both OSPackageResolver objects, the information in +info+
|
219
183
|
# takes precedence
|
220
184
|
def merge(info)
|
221
185
|
root_dir = nil
|
@@ -228,11 +192,11 @@ def merge(info)
|
|
228
192
|
# Warn if the new osdep definition resolves to a different
|
229
193
|
# set of packages than the old one
|
230
194
|
old_resolved = resolve_package(h).inject(Hash.new) do |osdep_h, (handler, status, list)|
|
231
|
-
osdep_h[handler
|
195
|
+
osdep_h[handler] = [status, list]
|
232
196
|
osdep_h
|
233
197
|
end
|
234
198
|
new_resolved = info.resolve_package(h).inject(Hash.new) do |osdep_h, (handler, status, list)|
|
235
|
-
osdep_h[handler
|
199
|
+
osdep_h[handler] = [status, list]
|
236
200
|
osdep_h
|
237
201
|
end
|
238
202
|
if old_resolved != new_resolved
|
@@ -282,7 +246,7 @@ def self.supported_operating_system?
|
|
282
246
|
@supported_operating_system =
|
283
247
|
if !os_names then false
|
284
248
|
else
|
285
|
-
os_names.any? { |os_name|
|
249
|
+
os_names.any? { |os_name| OS_PACKAGE_MANAGERS.has_key?(os_name) }
|
286
250
|
end
|
287
251
|
end
|
288
252
|
return @supported_operating_system
|
@@ -325,8 +289,8 @@ def self.guess_operating_system
|
|
325
289
|
ENV['AUTOPROJ_MACOSX_PACKAGE_MANAGER']
|
326
290
|
else 'macos-brew'
|
327
291
|
end
|
328
|
-
if !
|
329
|
-
known_managers =
|
292
|
+
if !OS_PACKAGE_MANAGERS.has_key?(manager)
|
293
|
+
known_managers = OS_PACKAGE_MANAGERS.keys.grep(/^macos/)
|
330
294
|
raise ArgumentError, "#{manager} is not a known MacOSX package manager. Known package managers are #{known_managers.join(", ")}"
|
331
295
|
end
|
332
296
|
|
@@ -497,8 +461,8 @@ class InvalidRecursiveStatement < Autobuild::Exception; end
|
|
497
461
|
# ending at the resolved name
|
498
462
|
def self.resolve_name(name)
|
499
463
|
path = [ name ]
|
500
|
-
while
|
501
|
-
name =
|
464
|
+
while aliases.has_key?(name)
|
465
|
+
name = aliases[name]
|
502
466
|
path << name
|
503
467
|
end
|
504
468
|
path
|
@@ -522,10 +486,10 @@ def self.resolve_name(name)
|
|
522
486
|
# name and version. The package list might be empty even if status ==
|
523
487
|
# FOUND_PACKAGES, for instance if the ignore keyword is used.
|
524
488
|
def resolve_package(name)
|
525
|
-
path =
|
489
|
+
path = self.class.resolve_name(name)
|
526
490
|
name = path.last
|
527
491
|
|
528
|
-
os_names, os_versions =
|
492
|
+
os_names, os_versions = self.class.operating_system
|
529
493
|
os_names = os_names.dup
|
530
494
|
os_names << 'default'
|
531
495
|
|
@@ -543,19 +507,15 @@ def resolve_package(name)
|
|
543
507
|
os_versions = ['default']
|
544
508
|
end
|
545
509
|
|
546
|
-
package_handler_names = package_handlers.keys
|
547
|
-
|
548
510
|
result = []
|
549
|
-
found, pkg = partition_osdep_entry(name, dep_def, nil,
|
511
|
+
found, pkg = partition_osdep_entry(name, dep_def, nil,
|
512
|
+
(package_managers - [os_package_manager]), os_names, os_versions)
|
550
513
|
if found
|
551
|
-
result << [
|
514
|
+
result << [os_package_manager, found, pkg]
|
552
515
|
end
|
553
516
|
|
554
|
-
|
555
|
-
|
556
|
-
# do a to_set.each
|
557
|
-
package_handlers.each_value.to_set.each do |handler|
|
558
|
-
found, pkg = partition_osdep_entry(name, dep_def, handler.names, [], os_names, os_versions)
|
517
|
+
package_managers.each do |handler|
|
518
|
+
found, pkg = partition_osdep_entry(name, dep_def, [handler], [], os_names, os_versions)
|
559
519
|
if found
|
560
520
|
result << [handler, found, pkg]
|
561
521
|
end
|
@@ -573,13 +533,7 @@ def resolve_package(name)
|
|
573
533
|
end
|
574
534
|
end
|
575
535
|
|
576
|
-
result
|
577
|
-
if handler.respond_to?(:parse_package_entry)
|
578
|
-
[handler, status, entries.map { |s| handler.parse_package_entry(s) }]
|
579
|
-
else
|
580
|
-
[handler, status, entries]
|
581
|
-
end
|
582
|
-
end
|
536
|
+
result
|
583
537
|
end
|
584
538
|
|
585
539
|
# Value returned by #resolve_package and #partition_osdep_entry in
|
@@ -737,21 +691,21 @@ def partition_osdep_entry(osdep_name, dep_def, handler_names, excluded, *keys)
|
|
737
691
|
#
|
738
692
|
# @raise MissingOSDep if some packages can't be found or if the
|
739
693
|
# nonexistent keyword was found for some of them
|
740
|
-
def
|
694
|
+
def resolve_os_packages(dependencies)
|
741
695
|
all_packages = []
|
742
696
|
dependencies.each do |name|
|
743
697
|
result = resolve_package(name)
|
744
698
|
if !result
|
745
|
-
path =
|
699
|
+
path = self.class.resolve_name(name)
|
746
700
|
raise MissingOSDep.new, "there is no osdeps definition for #{path.last} (search tree: #{path.join("->")})"
|
747
701
|
end
|
748
702
|
|
749
703
|
if result.empty?
|
750
|
-
if
|
751
|
-
os_names, os_versions =
|
704
|
+
if self.class.supported_operating_system?
|
705
|
+
os_names, os_versions = self.class.operating_system
|
752
706
|
raise MissingOSDep.new, "there is an osdeps definition for #{name}, but not for this operating system and version (resp. #{os_names.join(", ")} and #{os_versions.join(", ")})"
|
753
707
|
end
|
754
|
-
result = [[
|
708
|
+
result = [[os_package_manager, FOUND_PACKAGES, [name]]]
|
755
709
|
end
|
756
710
|
|
757
711
|
result.each do |handler, status, packages|
|
@@ -817,16 +771,16 @@ def availability_of(name)
|
|
817
771
|
end
|
818
772
|
|
819
773
|
if resolved.empty?
|
820
|
-
if !
|
774
|
+
if !self.class.operating_system
|
821
775
|
return UNKNOWN_OS
|
822
|
-
elsif !
|
776
|
+
elsif !self.class.supported_operating_system?
|
823
777
|
return AVAILABLE
|
824
778
|
else return WRONG_OS
|
825
779
|
end
|
826
780
|
end
|
827
781
|
|
828
782
|
resolved = resolved.delete_if { |_, status, list| status == FOUND_PACKAGES && list.empty? }
|
829
|
-
failed = resolved.find_all do |
|
783
|
+
failed = resolved.find_all do |_, status, _|
|
830
784
|
status == FOUND_NONEXISTENT
|
831
785
|
end
|
832
786
|
if failed.empty?
|
@@ -839,296 +793,6 @@ def availability_of(name)
|
|
839
793
|
return NONEXISTENT
|
840
794
|
end
|
841
795
|
end
|
842
|
-
|
843
|
-
HANDLE_ALL = 'all'
|
844
|
-
HANDLE_RUBY = 'ruby'
|
845
|
-
HANDLE_OS = 'os'
|
846
|
-
HANDLE_NONE = 'none'
|
847
|
-
|
848
|
-
def self.osdeps_mode_option_unsupported_os(config = Autoproj.config)
|
849
|
-
long_doc =<<-EOT
|
850
|
-
The software packages that autoproj will have to build may require other
|
851
|
-
prepackaged softwares (a.k.a. OS dependencies) to be installed (RubyGems
|
852
|
-
packages, packages from your operating system/distribution, ...). Autoproj is
|
853
|
-
usually able to install those automatically, but unfortunately your operating
|
854
|
-
system is not (yet) supported by autoproj's osdeps mechanism, it can only offer
|
855
|
-
you some limited support.
|
856
|
-
|
857
|
-
Some package handlers are cross-platform, and are therefore supported. However,
|
858
|
-
you will have to install the kind of OS dependencies (so-called OS packages)
|
859
|
-
|
860
|
-
This option is meant to allow you to control autoproj's behaviour while handling
|
861
|
-
OS dependencies.
|
862
|
-
|
863
|
-
* if you say "all", all OS-independent packages are going to be installed.
|
864
|
-
* if you say "gem", the RubyGem packages will be installed.
|
865
|
-
* if you say "pip", the Pythin PIP packages will be installed.
|
866
|
-
* if you say "none", autoproj will not do anything related to the OS
|
867
|
-
dependencies.
|
868
|
-
|
869
|
-
As any configuration value, the mode can be changed anytime by calling
|
870
|
-
autoproj reconfigure
|
871
|
-
|
872
|
-
Finally, the "autoproj osdeps" command will give you the necessary information
|
873
|
-
about the OS packages that you will need to install manually.
|
874
|
-
|
875
|
-
So, what do you want ? (all, none or a comma-separated list of: gem pip)
|
876
|
-
EOT
|
877
|
-
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 ]
|
878
|
-
|
879
|
-
config.declare 'osdeps_mode', 'string',
|
880
|
-
:default => 'ruby',
|
881
|
-
:doc => message,
|
882
|
-
:lowercase => true
|
883
|
-
end
|
884
|
-
|
885
|
-
def self.osdeps_mode_option_supported_os(config = Autoproj.config)
|
886
|
-
long_doc =<<-EOT
|
887
|
-
The software packages that autoproj will have to build may require other
|
888
|
-
prepackaged softwares (a.k.a. OS dependencies) to be installed (RubyGems
|
889
|
-
packages, packages from your operating system/distribution, ...). Autoproj
|
890
|
-
is able to install those automatically for you.
|
891
|
-
|
892
|
-
Advanced users may want to control this behaviour. Additionally, the
|
893
|
-
installation of some packages require administration rights, which you may
|
894
|
-
not have. This option is meant to allow you to control autoproj's behaviour
|
895
|
-
while handling OS dependencies.
|
896
|
-
|
897
|
-
* if you say "all", it will install all packages automatically.
|
898
|
-
This requires root access thru 'sudo'
|
899
|
-
* if you say "pip", only the Ruby packages will be installed.
|
900
|
-
Installing these packages does not require root access.
|
901
|
-
* if you say "gem", only the Ruby packages will be installed.
|
902
|
-
Installing these packages does not require root access.
|
903
|
-
* if you say "os", only the OS-provided packages will be installed.
|
904
|
-
Installing these packages requires root access.
|
905
|
-
* if you say "none", autoproj will not do anything related to the
|
906
|
-
OS dependencies.
|
907
|
-
|
908
|
-
Finally, you can provide a comma-separated list of pip gem and os.
|
909
|
-
|
910
|
-
As any configuration value, the mode can be changed anytime by calling
|
911
|
-
autoproj reconfigure
|
912
|
-
|
913
|
-
Finally, the "autoproj osdeps" command will give you the necessary information
|
914
|
-
about the OS packages that you will need to install manually.
|
915
|
-
|
916
|
-
So, what do you want ? (all, none or a comma-separated list of: os gem pip)
|
917
|
-
EOT
|
918
|
-
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 ]
|
919
|
-
|
920
|
-
config.declare 'osdeps_mode', 'string',
|
921
|
-
:default => 'all',
|
922
|
-
:doc => message,
|
923
|
-
:lowercase => true
|
924
|
-
end
|
925
|
-
|
926
|
-
def self.define_osdeps_mode_option(config = Autoproj.config)
|
927
|
-
if supported_operating_system?
|
928
|
-
osdeps_mode_option_supported_os(config)
|
929
|
-
else
|
930
|
-
osdeps_mode_option_unsupported_os(config)
|
931
|
-
end
|
932
|
-
end
|
933
|
-
|
934
|
-
def self.osdeps_mode_string_to_value(string)
|
935
|
-
string = string.to_s.downcase.split(',')
|
936
|
-
modes = []
|
937
|
-
string.map do |str|
|
938
|
-
case str
|
939
|
-
when 'all' then modes.concat(['os', 'gem', 'pip'])
|
940
|
-
when 'ruby' then modes << 'gem'
|
941
|
-
when 'gem' then modes << 'gem'
|
942
|
-
when 'pip' then modes << 'pip'
|
943
|
-
when 'os' then modes << 'os'
|
944
|
-
when 'none' then
|
945
|
-
else raise ArgumentError, "#{str} is not a known package handler"
|
946
|
-
end
|
947
|
-
end
|
948
|
-
modes
|
949
|
-
end
|
950
|
-
|
951
|
-
# If set to true (the default), #install will try to remove the list of
|
952
|
-
# already uptodate packages from the installed packages. Set to false to
|
953
|
-
# install all packages regardless of their status
|
954
|
-
attr_writer :filter_uptodate_packages
|
955
|
-
|
956
|
-
# If set to true (the default), #install will try to remove the list of
|
957
|
-
# already uptodate packages from the installed packages. Use
|
958
|
-
# #filter_uptodate_packages= to set it to false to install all packages
|
959
|
-
# regardless of their status
|
960
|
-
def filter_uptodate_packages?
|
961
|
-
!!@filter_uptodate_packages
|
962
|
-
end
|
963
|
-
|
964
|
-
# Override the osdeps mode
|
965
|
-
def osdeps_mode=(value)
|
966
|
-
@osdeps_mode = OSDependencies.osdeps_mode_string_to_value(value)
|
967
|
-
end
|
968
|
-
|
969
|
-
# Returns the osdeps mode chosen by the user
|
970
|
-
def osdeps_mode
|
971
|
-
# This has two uses. It caches the value extracted from the
|
972
|
-
# AUTOPROJ_OSDEPS_MODE and/or configuration file. Moreover, it
|
973
|
-
# allows to override the osdeps mode by using
|
974
|
-
# OSDependencies#osdeps_mode=
|
975
|
-
if @osdeps_mode
|
976
|
-
return @osdeps_mode
|
977
|
-
end
|
978
|
-
|
979
|
-
@osdeps_mode = OSDependencies.osdeps_mode
|
980
|
-
end
|
981
|
-
|
982
|
-
def self.osdeps_mode(config = Autoproj.config)
|
983
|
-
while true
|
984
|
-
mode =
|
985
|
-
if !config.has_value_for?('osdeps_mode') &&
|
986
|
-
mode_name = ENV['AUTOPROJ_OSDEPS_MODE']
|
987
|
-
begin OSDependencies.osdeps_mode_string_to_value(mode_name)
|
988
|
-
rescue ArgumentError
|
989
|
-
Autoproj.warn "invalid osdeps mode given through AUTOPROJ_OSDEPS_MODE (#{mode})"
|
990
|
-
nil
|
991
|
-
end
|
992
|
-
else
|
993
|
-
mode_name = config.get('osdeps_mode')
|
994
|
-
begin OSDependencies.osdeps_mode_string_to_value(mode_name)
|
995
|
-
rescue ArgumentError
|
996
|
-
Autoproj.warn "invalid osdeps mode stored in configuration file"
|
997
|
-
nil
|
998
|
-
end
|
999
|
-
end
|
1000
|
-
|
1001
|
-
if mode
|
1002
|
-
@osdeps_mode = mode
|
1003
|
-
config.set('osdeps_mode', mode_name, true)
|
1004
|
-
return mode
|
1005
|
-
end
|
1006
|
-
|
1007
|
-
# Invalid configuration values. Retry
|
1008
|
-
config.reset('osdeps_mode')
|
1009
|
-
ENV['AUTOPROJ_OSDEPS_MODE'] = nil
|
1010
|
-
end
|
1011
|
-
end
|
1012
|
-
|
1013
|
-
# The set of packages that have already been installed
|
1014
|
-
attr_reader :installed_packages
|
1015
|
-
|
1016
|
-
# Set up the registered package handlers according to the specified osdeps mode
|
1017
|
-
#
|
1018
|
-
# It enables/disables package handlers based on either the value
|
1019
|
-
# returned by {#osdeps_mode} or the value passed as option (the latter
|
1020
|
-
# takes precedence). Moreover, sets the handler's silent flag using
|
1021
|
-
# {#silent?}
|
1022
|
-
#
|
1023
|
-
# @option options [Array<String>] the package handlers that should be
|
1024
|
-
# enabled. The default value is returned by {#osdeps_mode}
|
1025
|
-
# @return [Array<PackageManagers::Manager>] the set of enabled package
|
1026
|
-
# managers
|
1027
|
-
def setup_package_handlers(options = Hash.new)
|
1028
|
-
options =
|
1029
|
-
if Kernel.respond_to?(:validate_options)
|
1030
|
-
Kernel.validate_options options,
|
1031
|
-
osdeps_mode: osdeps_mode
|
1032
|
-
else
|
1033
|
-
options = options.dup
|
1034
|
-
options[:osdeps_mode] ||= osdeps_mode
|
1035
|
-
options
|
1036
|
-
end
|
1037
|
-
|
1038
|
-
os_package_handler.enabled = false
|
1039
|
-
package_handlers.each_value do |handler|
|
1040
|
-
handler.enabled = false
|
1041
|
-
end
|
1042
|
-
options[:osdeps_mode].each do |m|
|
1043
|
-
if m == 'os'
|
1044
|
-
os_package_handler.enabled = true
|
1045
|
-
elsif pkg = package_handlers[m]
|
1046
|
-
pkg.enabled = true
|
1047
|
-
else
|
1048
|
-
Autoproj.warn "osdep handler #{m.inspect} has no handler, available handlers are #{package_handlers.keys.map(&:inspect).sort.join(", ")}"
|
1049
|
-
end
|
1050
|
-
end
|
1051
|
-
os_package_handler.silent = self.silent?
|
1052
|
-
package_handlers.each_value do |v|
|
1053
|
-
v.silent = self.silent?
|
1054
|
-
end
|
1055
|
-
|
1056
|
-
enabled_handlers = []
|
1057
|
-
if os_package_handler.enabled?
|
1058
|
-
enabled_handlers << os_package_handler
|
1059
|
-
end
|
1060
|
-
package_handlers.each_value do |v|
|
1061
|
-
if v.enabled?
|
1062
|
-
enabled_handlers << v
|
1063
|
-
end
|
1064
|
-
end
|
1065
|
-
enabled_handlers
|
1066
|
-
end
|
1067
|
-
|
1068
|
-
# Requests that packages that are handled within the autoproj project
|
1069
|
-
# (i.e. gems) are restored to pristine condition
|
1070
|
-
#
|
1071
|
-
# This is usually called as a rebuild step to make sure that all these
|
1072
|
-
# packages are updated to whatever required the rebuild
|
1073
|
-
def pristine(packages, options = Hash.new)
|
1074
|
-
install(packages, options.merge(install_only: true))
|
1075
|
-
packages = resolve_os_dependencies(packages)
|
1076
|
-
|
1077
|
-
_, other_packages =
|
1078
|
-
packages.partition { |handler, list| handler == os_package_handler }
|
1079
|
-
other_packages.each do |handler, list|
|
1080
|
-
if handler.respond_to?(:pristine)
|
1081
|
-
handler.pristine(list)
|
1082
|
-
end
|
1083
|
-
end
|
1084
|
-
end
|
1085
|
-
|
1086
|
-
# Requests the installation of the given set of packages
|
1087
|
-
def install(packages, options = Hash.new)
|
1088
|
-
# Remove the set of packages that have already been installed
|
1089
|
-
packages = packages.to_set - installed_packages
|
1090
|
-
return false if packages.empty?
|
1091
|
-
|
1092
|
-
filter_options, options =
|
1093
|
-
filter_options options, install_only: !Autobuild.do_update
|
1094
|
-
setup_package_handlers(options)
|
1095
|
-
|
1096
|
-
packages = resolve_os_dependencies(packages)
|
1097
|
-
|
1098
|
-
needs_filter = (filter_uptodate_packages? || filter_options[:install_only])
|
1099
|
-
packages = packages.map do |handler, list|
|
1100
|
-
if needs_filter && handler.respond_to?(:filter_uptodate_packages)
|
1101
|
-
list = handler.filter_uptodate_packages(list, filter_options)
|
1102
|
-
end
|
1103
|
-
|
1104
|
-
if !list.empty?
|
1105
|
-
[handler, list]
|
1106
|
-
end
|
1107
|
-
end.compact
|
1108
|
-
return false if packages.empty?
|
1109
|
-
|
1110
|
-
# Install OS packages first, as the other package handlers might
|
1111
|
-
# depend on OS packages
|
1112
|
-
os_packages, other_packages = packages.partition { |handler, list| handler == os_package_handler }
|
1113
|
-
[os_packages, other_packages].each do |packages|
|
1114
|
-
packages.each do |handler, list|
|
1115
|
-
handler.install(list)
|
1116
|
-
@installed_packages |= list.to_set
|
1117
|
-
end
|
1118
|
-
end
|
1119
|
-
true
|
1120
|
-
end
|
1121
|
-
|
1122
|
-
def reinstall(options = Hash.new)
|
1123
|
-
# We also reinstall the osdeps that provide the
|
1124
|
-
# functionality
|
1125
|
-
managers = setup_package_handlers(options)
|
1126
|
-
managers.each do |mng|
|
1127
|
-
if mng.enabled? && mng.respond_to?(:reinstall)
|
1128
|
-
mng.reinstall
|
1129
|
-
end
|
1130
|
-
end
|
1131
|
-
end
|
1132
796
|
end
|
1133
797
|
end
|
1134
798
|
|