autoproj 2.0.0.rc3 → 2.0.0.rc4
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 +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
|
|