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.
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