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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +9 -29
  3. data/bin/autoproj_bootstrap +159 -3150
  4. data/bin/autoproj_bootstrap.in +4 -256
  5. data/bin/autoproj_install +225 -0
  6. data/bin/autoproj_install.in +14 -0
  7. data/lib/autoproj.rb +2 -1
  8. data/lib/autoproj/autobuild.rb +2 -2
  9. data/lib/autoproj/cli/bootstrap.rb +0 -39
  10. data/lib/autoproj/cli/build.rb +0 -3
  11. data/lib/autoproj/cli/main.rb +13 -1
  12. data/lib/autoproj/cli/osdeps.rb +1 -1
  13. data/lib/autoproj/cli/show.rb +1 -1
  14. data/lib/autoproj/cli/update.rb +4 -4
  15. data/lib/autoproj/cli/upgrade.rb +71 -0
  16. data/lib/autoproj/configuration.rb +18 -1
  17. data/lib/autoproj/exceptions.rb +7 -0
  18. data/lib/autoproj/installation_manifest.rb +23 -12
  19. data/lib/autoproj/manifest.rb +22 -48
  20. data/lib/autoproj/ops/build.rb +2 -2
  21. data/lib/autoproj/ops/configuration.rb +1 -1
  22. data/lib/autoproj/ops/import.rb +1 -1
  23. data/lib/autoproj/ops/install.rb +211 -0
  24. data/lib/autoproj/ops/main_config_switcher.rb +1 -5
  25. data/lib/autoproj/os_package_installer.rb +348 -0
  26. data/lib/autoproj/{osdeps.rb → os_package_resolver.rb} +56 -392
  27. data/lib/autoproj/package_managers/apt_dpkg_manager.rb +2 -2
  28. data/lib/autoproj/package_managers/bundler_manager.rb +179 -0
  29. data/lib/autoproj/package_managers/emerge_manager.rb +2 -2
  30. data/lib/autoproj/package_managers/gem_manager.rb +7 -6
  31. data/lib/autoproj/package_managers/homebrew_manager.rb +2 -2
  32. data/lib/autoproj/package_managers/manager.rb +5 -6
  33. data/lib/autoproj/package_managers/pacman_manager.rb +2 -2
  34. data/lib/autoproj/package_managers/pip_manager.rb +8 -8
  35. data/lib/autoproj/package_managers/pkg_manager.rb +2 -2
  36. data/lib/autoproj/package_managers/port_manager.rb +2 -2
  37. data/lib/autoproj/package_managers/shell_script_manager.rb +4 -4
  38. data/lib/autoproj/package_managers/unknown_os_manager.rb +2 -2
  39. data/lib/autoproj/package_managers/yum_manager.rb +2 -2
  40. data/lib/autoproj/package_managers/zypper_manager.rb +2 -2
  41. data/lib/autoproj/package_set.rb +10 -10
  42. data/lib/autoproj/reporter.rb +3 -2
  43. data/lib/autoproj/system.rb +1 -4
  44. data/lib/autoproj/version.rb +1 -1
  45. data/lib/autoproj/workspace.rb +155 -32
  46. 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 OSDependencies
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 = OSDependencies.new
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(OSDependencies.new(data, file))
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
- attr_writer :silent
71
- def silent?; @silent end
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
- OSDependencies.load(file)
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
- PACKAGE_HANDLERS = [PackageManagers::AptDpkgManager,
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
- OS_PACKAGE_HANDLERS = {
132
- 'debian' => 'apt-dpkg',
133
- 'gentoo' => 'emerge',
134
- 'arch' => 'pacman',
135
- 'fedora' => 'yum',
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' => 'zypper',
139
- 'freebsd' => 'pkg'
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 :os_package_handler
154
-
155
- # Returns the package manager object for the current OS
156
- def os_package_handler
157
- if @os_package_handler.nil?
158
- os_names, _ = OSDependencies.operating_system
159
- if os_names && (key = os_names.find { |name| OS_PACKAGE_HANDLERS[name] })
160
- @os_package_handler = package_handlers[OS_PACKAGE_HANDLERS[key]]
161
- if !@os_package_handler
162
- raise ArgumentError, "found #{OS_PACKAGE_HANDLERS[name]} as the required package handler for #{os_names.join(", ")}, but it is not registered"
163
- end
164
- else
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 @os_package_handler
141
+ return @os_package_manager
169
142
  end
170
143
 
171
- # Returns the set of package managers
172
- def package_handlers
173
- if !@package_handlers
174
- @package_handlers = Hash.new
175
- PACKAGE_HANDLERS.each do |klass|
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 OSDependencies objects, the information in +info+
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.name] = [status, list]
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.name] = [status, list]
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| OS_PACKAGE_HANDLERS.has_key?(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 !OS_PACKAGE_HANDLERS.include?(manager)
329
- known_managers = OS_PACKAGE_HANDLERS.keys.grep(/^macos/)
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 OSDependencies.aliases.has_key?(name)
501
- name = OSDependencies.aliases[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 = OSDependencies.resolve_name(name)
489
+ path = self.class.resolve_name(name)
526
490
  name = path.last
527
491
 
528
- os_names, os_versions = OSDependencies.operating_system
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, (package_handler_names - os_package_handler.names), os_names, os_versions)
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 << [os_package_handler, found, pkg]
514
+ result << [os_package_manager, found, pkg]
552
515
  end
553
516
 
554
- # NOTE: package_handlers might contain the same handler multiple
555
- # times (when a package manager has multiple names). That's why we
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.map do |handler, status, entries|
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 resolve_os_dependencies(dependencies)
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 = OSDependencies.resolve_name(name)
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 OSDependencies.supported_operating_system?
751
- os_names, os_versions = OSDependencies.operating_system
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 = [[os_package_handler, FOUND_PACKAGES, [name]]]
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 !OSDependencies.operating_system
774
+ if !self.class.operating_system
821
775
  return UNKNOWN_OS
822
- elsif !OSDependencies.supported_operating_system?
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 |handler, status, list|
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