autoproj 1.9.6 → 1.9.7.rc1

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -8,13 +8,17 @@ bin/aup
8
8
  bin/autolocate
9
9
  bin/autoproj
10
10
  bin/autoproj-bootstrap
11
+ bin/autoproj-cache
11
12
  bin/autoproj-clean
12
13
  bin/autoproj-create-set
14
+ bin/autoproj-doc
13
15
  bin/autoproj-envsh
14
16
  bin/autoproj-list
15
17
  bin/autoproj-locate
16
18
  bin/autoproj-query
17
19
  bin/autoproj-show
20
+ bin/autoproj-snapshot
21
+ bin/autoproj-test
18
22
  bin/autoproj_bootstrap
19
23
  bin/autoproj_bootstrap.in
20
24
  bin/autoproj_stress_test
@@ -23,14 +27,24 @@ lib/autoproj/autobuild.rb
23
27
  lib/autoproj/base.rb
24
28
  lib/autoproj/cmdline.rb
25
29
  lib/autoproj/default.osdeps
30
+ lib/autoproj/environment.rb
26
31
  lib/autoproj/gitorious.rb
32
+ lib/autoproj/installation_manifest.rb
33
+ lib/autoproj/loader.rb
27
34
  lib/autoproj/manifest.rb
35
+ lib/autoproj/metapackage.rb
28
36
  lib/autoproj/options.rb
29
37
  lib/autoproj/osdeps.rb
38
+ lib/autoproj/package_definition.rb
39
+ lib/autoproj/package_manifest.rb
40
+ lib/autoproj/package_selection.rb
41
+ lib/autoproj/package_set.rb
30
42
  lib/autoproj/query.rb
31
43
  lib/autoproj/system.rb
32
44
  lib/autoproj/templates/create-set/packages.autobuild
33
45
  lib/autoproj/templates/create-set/source.yml
46
+ lib/autoproj/variable_expansion.rb
47
+ lib/autoproj/vcs_definition.rb
34
48
  lib/autoproj/version.rb
35
49
  samples/autoproj/README.txt
36
50
  samples/autoproj/init.rb
@@ -51,6 +65,7 @@ test/package_managers/apt-dpkg-status.installed-last
51
65
  test/package_managers/apt-dpkg-status.noninstalled-last
52
66
  test/package_managers/test_apt_dpkg_manager.rb
53
67
  test/package_managers/test_gem.rb
68
+ test/package_managers/test_pip.rb
54
69
  test/test_debian.rb
55
70
  test/test_manifest.rb
56
71
  test/test_os_dependencies.rb
data/Rakefile CHANGED
@@ -8,11 +8,12 @@ Utilrb::Rake.hoe do
8
8
  self.developer "Rock Core Developers", "rock-dev@dfki.de"
9
9
 
10
10
  self.urls = ["http://rock-robotics.org/documentation/autoproj"]
11
- self.rubyforge_name = 'autobuild'
11
+ self.group_name = 'autobuild'
12
12
  self.summary = 'Easy installation and management of sets of software packages'
13
13
  self.description = "autoproj is a manager for sets of software packages. It allows the user to import and build packages from source, still using the underlying distribution's native package manager for software that is available on it."
14
14
  self.email = "rock-dev@dfki.de"
15
15
 
16
+ self.spec_extras[:required_ruby_version] = ">= 1.9.2"
16
17
  extra_deps <<
17
18
  ['autobuild', '>= 1.7.0'] <<
18
19
  ['utilrb', '>= 1.6.0'] <<
data/bin/autoproj CHANGED
@@ -267,9 +267,8 @@ EOTEXT
267
267
 
268
268
  if all_enabled_packages.empty?
269
269
  STDERR.puts color("autoproj: nothing to do", :bold)
270
- elsif Autoproj::CmdLine.doc?
271
- Autoproj::CmdLine.build_packages(command_line_selection, all_enabled_packages)
272
270
  elsif Autoproj::CmdLine.build?
271
+ Autoproj.message("autoproj: building and installing packages", :bold)
273
272
  Autoproj::CmdLine.build_packages(command_line_selection, all_enabled_packages)
274
273
  end
275
274
 
@@ -0,0 +1,56 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'autoproj'
4
+
5
+ root_dir = Autoproj::CmdLine.initialize_root_directory
6
+
7
+ Autoproj::CmdLine.report do
8
+ cache_dir, *_ =
9
+ Autoproj.silent do
10
+ Autoproj::CmdLine.initialize_and_load(ARGV)
11
+ end
12
+ manifest = Autoproj.manifest
13
+
14
+ cache_dir = File.expand_path(cache_dir, root_dir)
15
+ if !File.exists?(cache_dir)
16
+ Autoproj.message " creating autoproj cache in #{cache_dir}"
17
+ FileUtils.mkdir_p cache_dir
18
+ else
19
+ Autoproj.message " updating already existing cache repository in #{cache_dir}"
20
+ end
21
+ archive_cache_dir = File.join(cache_dir, 'archives')
22
+ if !File.directory?(archive_cache_dir)
23
+ Autoproj.message " creating archive cache in #{archive_cache_dir}"
24
+ FileUtils.mkdir_p archive_cache_dir
25
+ else
26
+ Autoproj.message " updating already existing archive cache in #{archive_cache_dir}"
27
+ end
28
+ git_cache_dir = File.join(cache_dir, 'git')
29
+ if !File.directory?(git_cache_dir)
30
+ Autoproj.message " creating git cache in #{git_cache_dir}"
31
+ FileUtils.mkdir_p git_cache_dir
32
+ Autobuild::Subprocess.run("autoproj-cache", "import", Autobuild.tool(:git), "--git-dir", git_cache_dir, 'init', "--bare")
33
+ else
34
+ Autoproj.message " updating already existing git cache in #{git_cache_dir}"
35
+ end
36
+
37
+ manifest.each_package do |pkg|
38
+ if pkg.importer.kind_of?(Autobuild::Git)
39
+ Autoproj.message " caching #{pkg.name} (git)"
40
+ pkg.importdir = git_cache_dir
41
+ pkg.importer.local_branch = nil
42
+ pkg.importer.remote_branch = nil
43
+ remote_name = pkg.name.gsub(/[^\w]/, '_')
44
+ pkg.importer.remote_name = remote_name
45
+ pkg.importer.update_remotes_configuration(pkg, 'autoproj-cache')
46
+ Autobuild::Subprocess.run('autoproj-cache', :import, Autobuild.tool('git'), '--git-dir', git_cache_dir, 'remote', 'update', remote_name)
47
+ elsif pkg.importer.kind_of?(Autobuild::ArchiveImporter)
48
+ Autoproj.message " caching #{pkg.name} (archive)"
49
+ pkg.importer.cachedir = archive_cache_dir
50
+ pkg.importer.update_cache(pkg)
51
+ end
52
+ end
53
+
54
+ Autobuild::Subprocess.run('autoproj-cache', :import, Autobuild.tool('git'), '--git-dir', git_cache_dir, 'gc', '--aggressive', '--prune=all')
55
+ end
56
+
data/bin/autoproj-doc ADDED
@@ -0,0 +1,28 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'autoproj'
4
+ require 'autoproj/cmdline'
5
+
6
+ user_selection = Autoproj.silent do
7
+ Autoproj::CmdLine.initialize_root_directory
8
+ Autoproj::CmdLine.initialize_and_load(ARGV)
9
+ end
10
+
11
+ user_selection = user_selection.map do |arg|
12
+ if File.directory?(arg)
13
+ File.expand_path(arg)
14
+ else arg
15
+ end
16
+ end
17
+
18
+ Autobuild.pass_doc_errors = false
19
+
20
+ Autoproj::CmdLine.report do
21
+ resolved_selection = Autoproj::CmdLine.
22
+ resolve_user_selection(user_selection, :filter => false)
23
+ # This calls #prepare, which is required to run build_packages
24
+ packages = Autoproj::CmdLine.import_packages(resolved_selection)
25
+ packages.each { |pkg| Autobuild::Package[pkg].disable_phases('import', 'prepare', 'install') }
26
+ Autoproj::CmdLine.build_packages(resolved_selection, packages, ['doc'])
27
+ end
28
+
data/bin/autoproj-query CHANGED
@@ -38,42 +38,45 @@ end
38
38
  remaining = parser.parse(ARGV)
39
39
 
40
40
  root_dir = Autoproj::CmdLine.initialize_root_directory
41
- selection = Autoproj::CmdLine.initialize_and_load(remaining)
42
- if selection.empty?
43
- STDERR.puts Autoproj.console.color("no query given on the command line", :red)
44
- exit 1
45
- elsif selection.size > 1
46
- STDERR.puts Autoproj.console.color("more than one query given on the command line", :red)
47
- exit 1
48
- end
49
- selection = selection.first
50
- query = Autoproj::Query.parse_query(selection)
41
+ Autoproj::CmdLine.report do
42
+ selection = Autoproj::CmdLine.initialize_and_load(remaining)
51
43
 
52
- packages =
53
- if search_all
54
- Autoproj.manifest.packages.to_a
55
- else
56
- Autoproj.manifest.all_selected_packages.map do |pkg_name|
57
- [pkg_name, Autoproj.manifest.packages[pkg_name]]
58
- end
44
+ if selection.empty?
45
+ STDERR.puts Autoproj.console.color("no query given on the command line", :red)
46
+ exit 1
47
+ elsif selection.size > 1
48
+ STDERR.puts Autoproj.console.color("more than one query given on the command line", :red)
49
+ exit 1
59
50
  end
51
+ selection = selection.first
52
+ query = Autoproj::Query.parse_query(selection)
60
53
 
61
- matches = packages.map do |name, pkg_def|
62
- if priority = query.match(pkg_def)
63
- [priority, name]
64
- end
65
- end.compact
54
+ packages =
55
+ if search_all
56
+ Autoproj.manifest.packages.to_a
57
+ else
58
+ Autoproj.manifest.all_selected_packages.map do |pkg_name|
59
+ [pkg_name, Autoproj.manifest.packages[pkg_name]]
60
+ end
61
+ end
66
62
 
67
- fields = Hash.new
68
- matches = matches.sort
69
- matches.each do |priority, name|
70
- pkg = Autobuild::Package[name]
71
- fields['SRCDIR'] = pkg.srcdir
72
- fields['PREFIX'] = pkg.prefix
73
- fields['NAME'] = name
74
- fields['PRIORITY'] = priority
63
+ matches = packages.map do |name, pkg_def|
64
+ if priority = query.match(pkg_def)
65
+ [priority, name]
66
+ end
67
+ end.compact
68
+
69
+ fields = Hash.new
70
+ matches = matches.sort
71
+ matches.each do |priority, name|
72
+ pkg = Autobuild::Package[name]
73
+ fields['SRCDIR'] = pkg.srcdir
74
+ fields['PREFIX'] = pkg.prefix
75
+ fields['NAME'] = name
76
+ fields['PRIORITY'] = priority
75
77
 
76
- value = Autoproj.expand(display_format, fields)
77
- puts value
78
+ value = Autoproj.expand(display_format, fields)
79
+ puts value
80
+ end
78
81
  end
79
82
 
@@ -0,0 +1,38 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'autoproj'
4
+ require 'autoproj/cmdline'
5
+
6
+ current_dir = Dir.pwd
7
+ remaining_args = Autoproj.silent do
8
+ Autoproj::CmdLine.initialize_root_directory
9
+ Autoproj::CmdLine.initialize_and_load(ARGV)
10
+ end
11
+
12
+ snapshot_dir = File.expand_path(remaining_args.shift, current_dir)
13
+ if !snapshot_dir
14
+ raise ConfigError.new, "target directory missing\nusage: autoproj snapshot target_dir"
15
+ end
16
+
17
+ user_selection = remaining_args.map do |arg|
18
+ if File.directory?(arg)
19
+ File.expand_path(arg)
20
+ else arg
21
+ end
22
+ end
23
+ manifest = Autoproj.manifest
24
+ Autoproj::CmdLine.report do
25
+ resolved_selection = Autoproj::CmdLine.
26
+ resolve_user_selection(user_selection, :filter => false)
27
+ resolved_selection.filter_excluded_and_ignored_packages(Autoproj.manifest)
28
+ # This calls #prepare, which is required to run build_packages
29
+ packages = Autoproj::CmdLine.import_packages(resolved_selection)
30
+ # Remove non-existing packages
31
+ packages.each do |pkg|
32
+ if !File.directory?(manifest.package(pkg).autobuild.srcdir)
33
+ raise ConfigError, "cannot snapshot #{pkg.name} as it is not checked out"
34
+ end
35
+ end
36
+ Autoproj::CmdLine.snapshot(Autoproj.manifest, snapshot_dir, packages)
37
+ end
38
+
data/bin/autoproj-test ADDED
@@ -0,0 +1,36 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'autoproj'
4
+ require 'autoproj/cmdline'
5
+
6
+ user_selection = Autoproj.silent do
7
+ Autoproj::CmdLine.initialize_root_directory
8
+ Autoproj::CmdLine.initialize_and_load(ARGV)
9
+ end
10
+
11
+ user_selection = user_selection.map do |arg|
12
+ if File.directory?(arg)
13
+ File.expand_path(arg)
14
+ else arg
15
+ end
16
+ end
17
+
18
+ Autobuild.pass_test_errors = true
19
+ Autobuild.ignore_errors = true
20
+
21
+ Autoproj::CmdLine.report do
22
+ resolved_selection = Autoproj::CmdLine.
23
+ resolve_user_selection(user_selection, :filter => false)
24
+ # Remove non-existing packages
25
+ Autoproj.manifest.each_package do |pkg|
26
+ if !File.directory?(pkg.srcdir)
27
+ Autoproj.manifest.add_exclusion(pkg, "#{pkg.name} is not checked out")
28
+ end
29
+ end
30
+ resolved_selection.filter_excluded_and_ignored_packages(Autoproj.manifest)
31
+ # This calls #prepare, which is required to run build_packages
32
+ packages = Autoproj::CmdLine.import_packages(resolved_selection)
33
+ packages.each { |pkg| Autobuild::Package[pkg].disable_phases('import', 'prepare', 'install') }
34
+ Autoproj::CmdLine.build_packages(resolved_selection, packages, ['test'])
35
+ end
36
+
@@ -212,11 +212,11 @@ module Autoproj
212
212
  end
213
213
  end
214
214
  end
215
-
216
-
215
+
216
+ sudo = Autobuild.tool_in_path('sudo')
217
217
  Tempfile.open('osdeps_sh') do |io|
218
218
  io.puts "#! /bin/bash"
219
- io.puts GAIN_ROOT_ACCESS
219
+ io.puts GAIN_ROOT_ACCESS % [sudo]
220
220
  io.write script
221
221
  io.flush
222
222
  Autobuild::Subprocess.run 'autoproj', 'osdeps', '/bin/bash', io.path
@@ -226,7 +226,7 @@ module Autoproj
226
226
  GAIN_ROOT_ACCESS = <<-EOSCRIPT
227
227
  # Gain root access using sudo
228
228
  if test `id -u` != "0"; then
229
- exec sudo /bin/bash $0 "$@"
229
+ exec %s /bin/bash $0 "$@"
230
230
 
231
231
  fi
232
232
  EOSCRIPT
@@ -338,6 +338,15 @@ fi
338
338
  end
339
339
  end
340
340
 
341
+ #Package manger for OpenSuse and Suse (untested)
342
+ class ZypperManager < ShellScriptManager
343
+ def initialize
344
+ super(['zypper'], true,
345
+ "zypper -n install '%s'",
346
+ "zypper -n install '%s'")
347
+ end
348
+ end
349
+
341
350
  # Package manager interface for systems that use yum
342
351
  class YumManager < ShellScriptManager
343
352
  def initialize
@@ -513,10 +522,18 @@ fi
513
522
  end
514
523
  end
515
524
 
525
+ def reinstall
526
+ base_cmdline = [Autobuild.tool_in_path('ruby'), '-S', Autobuild.tool('gem')]
527
+ Autobuild::Subprocess.run 'autoproj', 'osdeps', 'reinstall', *base_cmdline,
528
+ 'clean'
529
+ Autobuild::Subprocess.run 'autoproj', 'osdeps', 'reinstall', *base_cmdline,
530
+ 'pristine', '--all', '--extensions'
531
+ end
532
+
516
533
  def install(gems)
517
534
  guess_gem_program
518
535
 
519
- base_cmdline = [Autobuild.tool('gem'), 'install']
536
+ base_cmdline = [Autobuild.tool_in_path('ruby'), '-S', Autobuild.tool('gem'), 'install']
520
537
  if !GemManager.with_doc
521
538
  base_cmdline << '--no-rdoc' << '--no-ri'
522
539
  end
@@ -814,6 +831,7 @@ fi
814
831
  PackageManagers::PacmanManager,
815
832
  PackageManagers::YumManager,
816
833
  PackageManagers::PortManager,
834
+ PackageManagers::ZypperManager,
817
835
  PackageManagers::PipManager]
818
836
  OS_PACKAGE_HANDLERS = {
819
837
  'debian' => 'apt-dpkg',
@@ -821,7 +839,8 @@ fi
821
839
  'arch' => 'pacman',
822
840
  'manjarolinux' => 'pacman',
823
841
  'fedora' => 'yum',
824
- 'darwin' => 'port'
842
+ 'darwin' => 'port',
843
+ 'opensuse' => 'zypper'
825
844
  }
826
845
 
827
846
  # The information contained in the OSdeps files, as a hash
@@ -1012,6 +1031,8 @@ fi
1012
1031
  @operating_system = [[lsb_name, "debian"], lsb_versions]
1013
1032
  elsif lsb_name != 'arch' && File.exists?("/etc/arch-release")
1014
1033
  @operating_system = [[lsb_name, "arch"], lsb_versions]
1034
+ elsif lsb_name != 'opensuse' && File.exists?("/etc/SuSE-release")
1035
+ @operating_system = [[lsb_name, "opensuse"], lsb_versions]
1015
1036
  elsif lsb_name != 'debian'
1016
1037
  # Debian unstable cannot be detected with lsb_release,
1017
1038
  # so debian has its own detection logic
@@ -1049,6 +1070,11 @@ fi
1049
1070
  [['darwin'], [version.strip]]
1050
1071
  elsif Autobuild.windows?
1051
1072
  [['windows'], []]
1073
+ elsif File.exists?('/etc/SuSE-release')
1074
+ version = File.read('/etc/SuSE-release').strip
1075
+ version =~/.*VERSION\s+=\s+([^\s]+)/
1076
+ version = $1
1077
+ [['opensuse'], [version.strip]]
1052
1078
  end
1053
1079
  end
1054
1080
 
@@ -1590,8 +1616,18 @@ So, what do you want ? (all, none or a comma-separated list of: os gem pip)
1590
1616
  # The set of packages that have already been installed
1591
1617
  attr_reader :installed_packages
1592
1618
 
1593
- # Requests the installation of the given set of packages
1594
- def install(packages, options = Hash.new)
1619
+ # Set up the registered package handlers according to the specified osdeps mode
1620
+ #
1621
+ # It enables/disables package handlers based on either the value
1622
+ # returned by {#osdeps_mode} or the value passed as option (the latter
1623
+ # takes precedence). Moreover, sets the handler's silent flag using
1624
+ # {#silent?}
1625
+ #
1626
+ # @option options [Array<String>] the package handlers that should be
1627
+ # enabled. The default value is returned by {#osdeps_mode}
1628
+ # @return [Array<PackageManagers::Manager>] the set of enabled package
1629
+ # managers
1630
+ def setup_package_handlers(options = Hash.new)
1595
1631
  options =
1596
1632
  if Kernel.respond_to?(:validate_options)
1597
1633
  Kernel.validate_options options, :osdeps_mode => osdeps_mode
@@ -1619,10 +1655,26 @@ So, what do you want ? (all, none or a comma-separated list of: os gem pip)
1619
1655
  v.silent = self.silent?
1620
1656
  end
1621
1657
 
1658
+ enabled_handlers = []
1659
+ if os_package_handler.enabled?
1660
+ enabled_handlers << os_package_handler
1661
+ end
1662
+ package_handlers.each_value do |v|
1663
+ if v.enabled?
1664
+ enabled_handlers << v
1665
+ end
1666
+ end
1667
+ enabled_handlers
1668
+ end
1669
+
1670
+ # Requests the installation of the given set of packages
1671
+ def install(packages, options = Hash.new)
1622
1672
  # Remove the set of packages that have already been installed
1623
1673
  packages = packages.to_set - installed_packages
1624
1674
  return false if packages.empty?
1625
1675
 
1676
+ setup_package_handlers(options)
1677
+
1626
1678
  packages = resolve_os_dependencies(packages)
1627
1679
  packages = packages.map do |handler, list|
1628
1680
  if filter_uptodate_packages? && handler.respond_to?(:filter_uptodate_packages)
@@ -1653,6 +1705,20 @@ end
1653
1705
  module Autoproj
1654
1706
  class InputError < RuntimeError; end
1655
1707
 
1708
+ class << self
1709
+ # Programatically overriden autoproj options
1710
+ #
1711
+ # @see override_option
1712
+ attr_reader :option_overrides
1713
+ end
1714
+ @option_overrides = Hash.new
1715
+
1716
+ # Programatically override a user-selected option without changing the
1717
+ # configuration file
1718
+ def self.override_option(option_name, value)
1719
+ @option_overrides[option_name] = value
1720
+ end
1721
+
1656
1722
  class BuildOption
1657
1723
  attr_reader :name
1658
1724
  attr_reader :type
@@ -1953,7 +2019,7 @@ module Autoproj
1953
2019
 
1954
2020
  # Run the provided command as root, using sudo to gain root access
1955
2021
  def self.run_as_root(*args)
1956
- if !system('sudo', *args)
2022
+ if !system(Autobuild.tool_in_path('sudo'), *args)
1957
2023
  raise "failed to run #{args.join(" ")} as root"
1958
2024
  end
1959
2025
  end
@@ -2152,13 +2218,28 @@ ruby19:
2152
2218
  - ruby19
2153
2219
  - rake
2154
2220
  default: nonexistent
2155
- ruby20: ignore
2221
+ opensuse: ruby19-devel
2222
+ ruby20:
2223
+ debian:
2224
+ - ruby2.0
2225
+ - ruby2.0-dev
2226
+ - rake
2227
+ - rubygems-integration
2228
+ default: ignore
2229
+ ruby21:
2230
+ debian:
2231
+ - ruby2.1
2232
+ - ruby2.1-dev
2233
+ - rake
2234
+ - rubygems-integration
2235
+ default: ignore
2156
2236
  build-essential:
2157
2237
  debian,ubuntu: build-essential
2158
2238
  gentoo: ignore
2159
2239
  arch,manjarolinux: base-dev
2160
2240
  fedora: ignore
2161
2241
  darwin: ignore
2242
+ opensuse: ignore
2162
2243
  autobuild: gem
2163
2244
  autoproj: gem
2164
2245
  git:
@@ -2170,24 +2251,28 @@ git:
2170
2251
  arch,manjarolinux: git
2171
2252
  fedora: git
2172
2253
  darwin: git-core
2254
+ opensuse: git
2173
2255
  hg:
2174
2256
  debian,ubuntu: mercurial
2175
2257
  gentoo: dev-vcs/mercurial
2176
2258
  arch,manjarolinux: mercurial
2177
2259
  fedora: mercurial
2178
2260
  darwin: mercurial
2261
+ opensuse: mercurial
2179
2262
  svn:
2180
2263
  debian,ubuntu: subversion
2181
2264
  gentoo: dev-util/subversion
2182
2265
  arch,manjarolinux: subversion
2183
2266
  fedora: subversion
2184
2267
  darwin: subversion
2268
+ opensuse: subversion
2185
2269
  cmake:
2186
2270
  debian,ubuntu: cmake
2187
2271
  gentoo: dev-util/cmake
2188
2272
  arch,manjarolinux: cmake
2189
2273
  fedora: cmake
2190
2274
  darwin: cmake
2275
+ opensuse: cmake
2191
2276
  autotools:
2192
2277
  debian,ubuntu:
2193
2278
  - automake1.9
@@ -2204,12 +2289,16 @@ autotools:
2204
2289
  darwin:
2205
2290
  - automake
2206
2291
  - autoconf
2292
+ opensuse:
2293
+ - automake
2294
+ - autoconf
2207
2295
  lsb_release:
2208
2296
  debian,ubuntu: lsb-release
2209
2297
  gentoo: sys-apps/lsb-release
2210
2298
  arch,manjarolinux: lsb-release
2211
2299
  fedora: redhat-lsb
2212
2300
  darwin: ignore
2301
+ opensuse: ignore
2213
2302
  archive:
2214
2303
  debian,ubuntu:
2215
2304
  - tar
@@ -2226,14 +2315,19 @@ archive:
2226
2315
  darwin:
2227
2316
  - gnutar
2228
2317
  - unzip
2318
+ opensuse:
2319
+ - tar
2320
+ - unzip
2229
2321
  cvs:
2230
2322
  debian,ubuntu: cvs
2231
2323
  fedora: cvs
2232
2324
  darwin: cvs
2233
2325
  arch,manjarolinux: cvs
2326
+ opensuse: cvs
2234
2327
  pip:
2235
2328
  debian,ubuntu: python-pip
2236
2329
  arch,manjarolinux: python2-pip
2330
+ opensuse: python-pip
2237
2331
 
2238
2332
  EODEFS
2239
2333