autoproj 1.8.2.b17 → 1.8.2.b18

Sign up to get free protection for your applications and to get access to all the features.
data/bin/autoproj CHANGED
@@ -150,7 +150,7 @@ EOTEXT
150
150
 
151
151
  # If in verbose mode, or if we only update sources, list the sources
152
152
  if Autoproj.verbose || Autoproj::CmdLine.display_configuration?
153
- Autoproj::CmdLine.display_configuration(manifest, selected_packages)
153
+ Autoproj::CmdLine.display_configuration(manifest, selected_packages.packages)
154
154
  end
155
155
 
156
156
  if Autoproj::CmdLine.bootstrap?
@@ -509,7 +509,7 @@ module Autoproj
509
509
  send(handler, relative_to_root.to_s)
510
510
  end
511
511
  setup_package_directories(pkg)
512
- selected_packages << pkg.name
512
+ selected_packages.select(sel, pkg.name)
513
513
  break(true)
514
514
  end
515
515
 
@@ -521,40 +521,38 @@ module Autoproj
521
521
  Autoproj.message("autoproj: wrong package selection on command line, cannot find a match for #{nonresolved.to_a.join(", ")}", :red)
522
522
  exit 1
523
523
  elsif Autoproj.verbose
524
- Autoproj.message "will install #{selected_packages.to_a.join(", ")}"
524
+ Autoproj.message "will install #{selected_packages.packages.keys.to_a.sort.join(", ")}"
525
525
  end
526
526
  selected_packages
527
527
  end
528
528
 
529
- def self.verify_package_availability(pkg_name, stack = Array.new)
530
- if reason = Autoproj.manifest.exclusion_reason(pkg_name)
531
- raise ConfigError.new, "#{pkg_name} is excluded from the build: #{reason}"
532
- end
533
- pkg = Autobuild::Package[pkg_name]
534
- if !pkg
535
- raise ConfigError.new, "#{pkg_name} does not seem to exist"
536
- end
537
- stack << pkg_name
538
-
539
- # Verify that its dependencies are there, and add
540
- # them to the selected_packages set so that they get
541
- # imported as well
542
- pkg.dependencies.each do |dep_name|
543
- if stack.include?(dep_name)
544
- raise ConfigError.new, "circular dependency #{pkg.name} => #{dep_name}"
529
+ def self.mark_exclusion_along_revdeps(pkg_name, revdeps, chain = [], reason = nil)
530
+ root = !reason
531
+ chain.unshift pkg_name
532
+ if root
533
+ reason = Autoproj.manifest.exclusion_reason(pkg_name)
534
+ else
535
+ if chain.size == 1
536
+ Autoproj.manifest.add_exclusion(pkg_name, "its dependency #{reason}")
537
+ else
538
+ Autoproj.manifest.add_exclusion(pkg_name, "#{reason} (dependency chain: #{chain.join(">")}")
545
539
  end
540
+ end
546
541
 
547
- begin
548
- verify_package_availability(dep_name, stack.dup)
549
- rescue ConfigError => e
550
- raise e, "#{pkg_name} depends on #{dep_name}, but #{e.message}"
542
+ return if !revdeps.has_key?(pkg_name)
543
+ revdeps[pkg_name].each do |dep_name|
544
+ if !Autoproj.manifest.excluded?(dep_name)
545
+ mark_exclusion_along_revdeps(dep_name, revdeps, chain.dup, reason)
551
546
  end
552
547
  end
553
548
  end
554
549
 
555
- def self.import_packages(selected_packages)
556
- selected_packages = selected_packages.dup.
550
+ def self.import_packages(selection)
551
+ selected_packages = selection.packages.
557
552
  map do |pkg_name|
553
+ if Autoproj.manifest.excluded?(pkg_name)
554
+ raise
555
+ end
558
556
  pkg = Autobuild::Package[pkg_name]
559
557
  if !pkg
560
558
  raise ConfigError.new, "selected package #{pkg_name} does not exist"
@@ -562,107 +560,92 @@ module Autoproj
562
560
  pkg
563
561
  end.to_set
564
562
 
565
- # First, import all packages that are already there to make
566
- # automatic dependency discovery possible
567
- old_update_flag = Autobuild.do_update
568
- begin
569
- Autobuild.do_update = false
570
- packages = Autobuild::Package.each.
571
- find_all { |pkg_name, pkg| File.directory?(pkg.srcdir) }.
572
- delete_if { |pkg_name, pkg| Autoproj.manifest.excluded?(pkg_name) || Autoproj.manifest.ignored?(pkg_name) }
573
-
574
- packages.each do |_, pkg|
575
- pkg.isolate_errors do
576
- pkg.import
577
- end
578
- end
579
-
580
- ensure
581
- Autobuild.do_update = old_update_flag
582
- end
583
-
584
- known_available_packages = Set.new
563
+ # The set of all packages that are currently selected by +selection+
585
564
  all_enabled_packages = Set.new
565
+ # The reverse dependencies for the package tree. It is discovered as
566
+ # we go on with the import
567
+ #
568
+ # It only contains strong dependencies. Optional dependencies are
569
+ # not included, as we will use this only to take into account
570
+ # package exclusion (and that does not affect optional dependencies)
571
+ reverse_dependencies = Hash.new { |h, k| h[k] = Set.new }
586
572
 
587
- package_queue = selected_packages.dup
573
+ package_queue = selected_packages.to_a.sort_by(&:name)
588
574
  while !package_queue.empty?
589
- current_packages, package_queue = package_queue, Set.new
590
- current_packages = current_packages.sort_by(&:name)
591
-
592
- current_packages.
593
- delete_if { |pkg| all_enabled_packages.include?(pkg.name) }.
594
- delete_if { |pkg| Autoproj.manifest.ignored?(pkg.name) }
595
- all_enabled_packages |= current_packages.map(&:name).to_set
596
-
597
- # Recursively check that no package in the selection depend on
598
- # excluded packages
599
- current_packages.each do |pkg|
600
- verify_package_availability(pkg.name)
601
- end
602
-
603
- # We import first so that all packages can export the
604
- # additional targets they provide.
605
- current_packages.each do |pkg|
606
- # If the package has no importer, the source directory must
607
- # be there
608
- if !pkg.importer && !File.directory?(pkg.srcdir)
609
- raise ConfigError.new, "#{pkg.name} has no VCS, but is not checked out in #{pkg.srcdir}"
575
+ pkg = package_queue.shift
576
+ # Remove packages that have already been processed
577
+ next if all_enabled_packages.include?(pkg.name)
578
+ all_enabled_packages << pkg.name
579
+
580
+ # If the package has no importer, the source directory must
581
+ # be there
582
+ if !pkg.importer && !File.directory?(pkg.srcdir)
583
+ raise ConfigError.new, "#{pkg.name} has no VCS, but is not checked out in #{pkg.srcdir}"
584
+ end
585
+
586
+ ## COMPLETELY BYPASS RAKE HERE
587
+ # The reason is that the ordering of import/prepare between
588
+ # packages is not important BUT the ordering of import vs.
589
+ # prepare in one package IS important: prepare is the method
590
+ # that takes into account dependencies.
591
+ pkg.import
592
+ Rake::Task["#{pkg.name}-import"].instance_variable_set(:@already_invoked, true)
593
+ manifest.load_package_manifest(pkg.name)
594
+
595
+ # The package setup mechanisms might have added an exclusion
596
+ # on this package. Handle this.
597
+ if Autoproj.manifest.excluded?(pkg.name)
598
+ mark_exclusion_along_revdeps(pkg.name, reverse_dependencies)
599
+ # Run a filter now, to have errors as early as possible
600
+ selection.filter_excluded_and_ignored_packages(Autoproj.manifest)
601
+ all_enabled_packages.delete(pkg.name)
602
+ # Delete this package from the current_packages set
603
+ true
604
+ end
605
+
606
+ Autoproj.each_post_import_block(pkg) do |block|
607
+ block.call(pkg)
608
+ end
609
+
610
+ pkg.prepare
611
+ Rake::Task["#{pkg.name}-prepare"].instance_variable_set(:@already_invoked, true)
612
+
613
+ # Verify that its dependencies are there, and add
614
+ # them to the selected_packages set so that they get
615
+ # imported as well
616
+ new_packages = []
617
+ pkg.dependencies.each do |dep_name|
618
+ reverse_dependencies[dep_name] << pkg.name
619
+ new_packages << Autobuild::Package[dep_name]
620
+ end
621
+ pkg_opt_deps, _ = pkg.partition_optional_dependencies
622
+ pkg_opt_deps.each do |dep_name|
623
+ new_packages << Autobuild::Package[dep_name]
624
+ end
625
+
626
+ new_packages.delete_if do |pkg|
627
+ if Autoproj.manifest.excluded?(pkg.name)
628
+ mark_exclusion_along_revdeps(pkg.name, reverse_dependencies)
629
+ true
610
630
  end
611
-
612
- ## COMPLETELY BYPASS RAKE HERE
613
- # The reason is that the ordering of import/prepare between
614
- # packages is not important BUT the ordering of import vs.
615
- # prepare in one package IS important: prepare is the method
616
- # that takes into account dependencies.
617
- pkg.import
618
- Rake::Task["#{pkg.name}-import"].instance_variable_set(:@already_invoked, true)
619
- manifest.load_package_manifest(pkg.name)
620
- pkg.resolve_optional_dependencies
621
- verify_package_availability(pkg.name)
622
631
  end
632
+ package_queue.concat(new_packages.sort_by(&:name))
623
633
 
624
- current_packages.each do |pkg|
625
- verify_package_availability(pkg.name)
626
- Autoproj.each_post_import_block(pkg) do |block|
627
- block.call(pkg)
628
- end
629
-
630
- pkg.prepare
631
- Rake::Task["#{pkg.name}-prepare"].instance_variable_set(:@already_invoked, true)
632
-
633
- # Verify that its dependencies are there, and add
634
- # them to the selected_packages set so that they get
635
- # imported as well
636
- pkg.dependencies.each do |dep_name|
637
- package_queue << Autobuild::Package[dep_name]
638
- end
639
- end
634
+ # Verify that everything is still OK with the new
635
+ # exclusions/ignores
636
+ selection.filter_excluded_and_ignored_packages(Autoproj.manifest)
640
637
  end
641
638
 
642
- begin
643
- Autobuild.do_update = false
644
- packages = Autobuild::Package.each.
645
- find_all { |pkg_name, pkg| File.directory?(pkg.srcdir) }.
646
- delete_if { |pkg_name, pkg| all_enabled_packages.include?(pkg_name) || Autoproj.manifest.excluded?(pkg_name) || Autoproj.manifest.ignored?(pkg_name) }
647
-
648
- packages.each do |_, pkg|
649
- pkg.isolate_errors do
650
- manifest.load_package_manifest(pkg.name)
651
- pkg.prepare
652
-
653
- Autoproj.each_post_import_block(pkg) do |block|
654
- block.call(pkg)
655
- end
656
- end
657
- end
658
-
659
- ensure
660
- Autobuild.do_update = old_update_flag
639
+ # We finally resolve optional dependencies at the very end, as the
640
+ # list of exclusions may have changed
641
+ all_enabled_packages.each do |pkg_name|
642
+ Autobuild::Package[pkg_name].resolve_optional_dependencies
661
643
  end
662
644
 
663
645
  if Autoproj.verbose
664
646
  Autoproj.message "autoproj: finished importing packages"
665
647
  end
648
+
666
649
  if Autoproj::CmdLine.list_newest?
667
650
  fields = []
668
651
  Rake::Task.tasks.each do |task|
@@ -1144,11 +1144,11 @@ module Autoproj
1144
1144
  # tells why. Otherwise, returns nil
1145
1145
  #
1146
1146
  # Packages can either be excluded because their name is listed in the
1147
- # excluded_packages section of the manifest, or because they are
1147
+ # exclude_packages section of the manifest, or because they are
1148
1148
  # disabled on this particular operating system.
1149
1149
  def exclusion_reason(package_name)
1150
1150
  if manifest_exclusions.any? { |l| Regexp.new(l) =~ package_name }
1151
- "#{package_name} is listed in the excluded_packages section of the manifest"
1151
+ "#{package_name} is listed in the exclude_packages section of the manifest"
1152
1152
  else
1153
1153
  automatic_exclusions[package_name]
1154
1154
  end
@@ -1805,21 +1805,19 @@ module Autoproj
1805
1805
  #
1806
1806
  # If recursive is false, yields only the packages at this level.
1807
1807
  # Otherwise, return all packages.
1808
- def layout_packages(result, validate)
1808
+ def layout_packages(validate)
1809
+ result = PackageSelection.new
1809
1810
  Autoproj.in_file(self.file) do
1810
1811
  normalized_layout.each_key do |pkg_or_set|
1811
- begin
1812
- resolve_package_set(pkg_or_set).each do |pkg_name|
1813
- if !excluded?(pkg_name) && !ignored?(pkg_name)
1814
- result << pkg_name
1815
- end
1816
- Autobuild::Package[pkg_name].all_dependencies(result)
1817
- end
1818
- rescue ConfigError
1819
- raise if validate
1820
- end
1812
+ result.select(pkg_or_set, resolve_package_set(pkg_or_set))
1821
1813
  end
1822
1814
  end
1815
+
1816
+ begin
1817
+ result.filter_excluded_and_ignored_packages(self)
1818
+ rescue ConfigError
1819
+ raise if validate
1820
+ end
1823
1821
  result
1824
1822
  end
1825
1823
 
@@ -1898,15 +1896,18 @@ module Autoproj
1898
1896
  # Returns the set of packages that should be built if the user does not
1899
1897
  # specify any on the command line
1900
1898
  def default_packages(validate = true)
1901
- names = if layout = data['layout']
1902
- layout_packages(Set.new, validate)
1903
- else
1904
- # No layout, all packages are selected
1905
- all_packages
1906
- end
1907
-
1908
- names.delete_if { |pkg_name| excluded?(pkg_name) || ignored?(pkg_name) }
1909
- names.to_set
1899
+ if layout = data['layout']
1900
+ return layout_packages(validate)
1901
+ else
1902
+ result = PackageSelection.new
1903
+ # No layout, all packages are selected
1904
+ names = all_packages
1905
+ names.delete_if { |pkg_name| excluded?(pkg_name) || ignored?(pkg_name) }
1906
+ names.each do |pkg_name|
1907
+ result.select(pkg_name, pkg_name)
1908
+ end
1909
+ result
1910
+ end
1910
1911
  end
1911
1912
 
1912
1913
  def normalized_layout(result = Hash.new, layout_level = '/', layout_data = (data['layout'] || Hash.new))
@@ -2070,6 +2071,101 @@ module Autoproj
2070
2071
  @osdeps_overrides.delete(osdeps_name.to_s)
2071
2072
  end
2072
2073
 
2074
+ # Class holding information about which packages have been selected, and
2075
+ # why. It is used to decide whether some non-availability of packages
2076
+ # are errors or simply warnings (i.e. if the user really wants a given
2077
+ # package, or merely might be adding it by accident)
2078
+ class PackageSelection
2079
+ # The set of matches, i.e. a mapping from a user-provided string to
2080
+ # the set of packages it selected
2081
+ attr_reader :matches
2082
+ # The set of selected packages, as a hash of the package name to the
2083
+ # set of user-provided strings that caused that package to be
2084
+ # selected
2085
+ attr_reader :selection
2086
+
2087
+ # The set of packages that have been selected
2088
+ def packages
2089
+ selection.keys
2090
+ end
2091
+
2092
+ def include?(pkg_name)
2093
+ selection.has_key?(pkg_name)
2094
+ end
2095
+
2096
+ def initialize
2097
+ @selection = Hash.new { |h, k| h[k] = Set.new }
2098
+ @matches = Hash.new { |h, k| h[k] = Set.new }
2099
+ end
2100
+
2101
+ def select(sel, packages)
2102
+ if !packages.respond_to?(:each)
2103
+ matches[sel] << packages
2104
+ selection[packages] << sel
2105
+ else
2106
+ matches[sel] |= packages.to_set
2107
+ packages.each do |pkg_name|
2108
+ selection[pkg_name] << sel
2109
+ end
2110
+ end
2111
+ end
2112
+
2113
+ def initialize_copy(old)
2114
+ old.selection.each do |pkg_name, set|
2115
+ @selection[pkg_name] = set.dup
2116
+ end
2117
+ old.matches.each do |sel, set|
2118
+ @matches[sel] = set.dup
2119
+ end
2120
+ end
2121
+
2122
+ # Remove packages that are explicitely excluded and/or ignored
2123
+ #
2124
+ # Raise an error if an explicit selection expands only to an
2125
+ # excluded package, and display a warning for ignored packages
2126
+ def filter_excluded_and_ignored_packages(manifest)
2127
+ matches.each do |sel, expansion|
2128
+ excluded, other = expansion.partition { |pkg_name| manifest.excluded?(pkg_name) }
2129
+ ignored, ok = other.partition { |pkg_name| manifest.ignored?(pkg_name) }
2130
+
2131
+ if ok.empty? && ignored.empty?
2132
+ exclusions = excluded.map do |pkg_name|
2133
+ [pkg_name, manifest.exclusion_reason(pkg_name)]
2134
+ end
2135
+ if exclusions.size == 1
2136
+ reason = exclusions[0][1]
2137
+ if sel == exclusions[0][0]
2138
+ raise ConfigError.new, "#{sel} is excluded from the build: #{reason}"
2139
+ else
2140
+ raise ConfigError.new, "#{sel} expands to #{exclusions.map(&:first).join(", ")}, which is excluded from the build: #{reason}"
2141
+ end
2142
+ else
2143
+ raise ConfigError.new, "#{sel} expands to #{exclusions.map(&:first).join(", ")}, and all these packages are excluded from the build:\n #{exclusions.map { |name, reason| "#{name}: #{reason}" }.join("\n ")}"
2144
+ end
2145
+ elsif !ignored.empty?
2146
+ ignored.each do |pkg_name|
2147
+ Autoproj.warn "#{pkg_name} was selected for #{sel}, but is explicitely ignored in the manifest"
2148
+ end
2149
+ end
2150
+
2151
+ excluded = excluded.to_set
2152
+ expansion.delete_if do |pkg_name|
2153
+ excluded.include?(pkg_name)
2154
+ end
2155
+ end
2156
+
2157
+ selection.keys.sort.each do |pkg_name|
2158
+ if manifest.excluded?(pkg_name)
2159
+ Autoproj.warn "#{pkg_name} was selected for #{selection[pkg_name].to_a.sort.join(", ")}, but it is excluded from the build: #{Autoproj.manifest.exclusion_reason(pkg_name)}"
2160
+ selection.delete(pkg_name)
2161
+ elsif manifest.ignored?(pkg_name)
2162
+ Autoproj.warn "#{pkg_name} was selected for #{selection[pkg_name].to_a.sort.join(", ")}, but it is ignored in this build"
2163
+ selection.delete(pkg_name)
2164
+ end
2165
+ end
2166
+ end
2167
+ end
2168
+
2073
2169
  # Package selection can be done in three ways:
2074
2170
  # * as a subdirectory in the layout
2075
2171
  # * as a on-disk directory
@@ -2079,14 +2175,10 @@ module Autoproj
2079
2175
  def expand_package_selection(selection)
2080
2176
  base_dir = Autoproj.root_dir
2081
2177
 
2082
- # The expanded selection
2083
- expanded_packages = Set.new
2178
+ result = PackageSelection.new
2084
2179
  # All the packages that are available on this installation
2085
2180
  all_layout_packages = self.all_selected_packages
2086
2181
 
2087
- # A selection to packages map that represents the matches found
2088
- matches = Hash.new { |h, k| h[k] = Set.new }
2089
-
2090
2182
  # First, remove packages that are directly referenced by name or by
2091
2183
  # package set names
2092
2184
  selection.each do |sel|
@@ -2096,16 +2188,14 @@ module Autoproj
2096
2188
  find_all { |pkg_name| pkg_name =~ match_pkg_name }.
2097
2189
  to_set
2098
2190
  if !packages.empty?
2099
- matches[sel] = packages
2100
- expanded_packages |= packages
2191
+ result.select(sel, packages)
2101
2192
  end
2102
2193
 
2103
2194
  each_metapackage do |pkg|
2104
2195
  if pkg.name =~ match_pkg_name
2105
2196
  packages = resolve_package_set(pkg.name).to_set
2106
2197
  packages = (packages & all_layout_packages)
2107
- matches[sel] |= packages
2108
- expanded_packages |= packages
2198
+ result.select(sel, packages)
2109
2199
  end
2110
2200
  end
2111
2201
  end
@@ -2125,37 +2215,13 @@ module Autoproj
2125
2215
  end
2126
2216
  end
2127
2217
 
2128
- matches[sel] << pkg_name
2129
- expanded_packages << pkg_name
2130
- end
2131
- end
2132
- end
2133
-
2134
- # Remove packages that are explicitely excluded and/or ignored
2135
- #
2136
- # Raise an error if an explicit selection expands only to an
2137
- # excluded package, and display a warning for ignored packages
2138
- matches.each do |sel, expansion|
2139
- next if expansion.empty?
2140
- excluded, other = expansion.partition { |pkg_name| excluded?(pkg_name) }
2141
- ignored, ok = other.partition { |pkg_name| ignored?(pkg_name) }
2142
-
2143
- if ok.empty? && ignored.empty?
2144
- packages = excluded.map do |pkg_name|
2145
- [pkg_name, Autoproj.manifest.exclusion_reason(pkg_name)]
2146
- end
2147
- raise ConfigError.new, "selection #{sel} expands to #{packages.map(&:first).join(", ")} which are excluded from the build:\n #{packages.map { |name, reason| "#{name}: #{reason}" }.join("\n ")}"
2148
- elsif !ignored.empty?
2149
- ignored.each do |pkg_name|
2150
- Autoproj.warn "#{pkg_name} was selected for #{sel}, but is explicitely ignored in the manifest"
2218
+ result.select(sel, pkg_name)
2151
2219
  end
2152
2220
  end
2153
2221
  end
2154
2222
 
2155
- expanded_packages.delete_if do |pkg_name|
2156
- excluded?(pkg_name) || ignored?(pkg_name)
2157
- end
2158
- return expanded_packages.to_set, (selection - matches.keys)
2223
+ result.filter_excluded_and_ignored_packages(self)
2224
+ return result, (selection - matches.keys)
2159
2225
  end
2160
2226
 
2161
2227
  attr_reader :moved_packages
@@ -1,3 +1,3 @@
1
1
  module Autoproj
2
- VERSION = "1.8.2.b17"
2
+ VERSION = "1.8.2.b18"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autoproj
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2.b17
4
+ version: 1.8.2.b18
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-10-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: autobuild
16
- requirement: &16486980 !ruby/object:Gem::Requirement
16
+ requirement: &12848100 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.6.0.rc1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16486980
24
+ version_requirements: *12848100
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: utilrb
27
- requirement: &16484260 !ruby/object:Gem::Requirement
27
+ requirement: &12847280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.6.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *16484260
35
+ version_requirements: *12847280
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: highline
38
- requirement: &16482140 !ruby/object:Gem::Requirement
38
+ requirement: &12846560 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.5.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *16482140
46
+ version_requirements: *12846560
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &16480960 !ruby/object:Gem::Requirement
49
+ requirement: &12845640 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '3.10'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *16480960
57
+ version_requirements: *12845640
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: hoe
60
- requirement: &16480180 !ruby/object:Gem::Requirement
60
+ requirement: &12868200 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '3.1'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *16480180
68
+ version_requirements: *12868200
69
69
  description: autoproj is a manager for sets of software packages. It allows the user
70
70
  to import and build packages from source, still using the underlying distribution's
71
71
  native package manager for software that is available on it.