autoproj 2.12.0 → 2.12.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a68519807da7c2961d51b2036e82906d450b7726b97fdf7b61f79ab15918a506
4
- data.tar.gz: f7951a66ca5422a51dc4c8f15d979916ae85ee0ff84fb7bdaeb83d3df72dc0ac
3
+ metadata.gz: 214fd95f143468744f972355eefe4d626db36b1b9682c47998fc33373f1e5af5
4
+ data.tar.gz: 7fc8e361877c7ae1a66da15c00661e858cde213e6cf152c83799a7af71d910bf
5
5
  SHA512:
6
- metadata.gz: f84abc55dc7ac4c1d09a4478c86dd33b05a71e53d5368eb501bc31b637c48ab24ed13587300a6f2760d3731b95bb9bdbf46138c18ef4f9e8c1bd7a90ab1a15df
7
- data.tar.gz: 02da417bb10600b48425087f732c823930ce5e573724d097927f9c49381b5e15fe3c682cbc52248fafd943e0b2bc4b7b15db9ebe7415b4599ff9dc13f65ecadb
6
+ metadata.gz: 75a492d69d8b5902468f0a21c20bf1b4cbfe19c86d438f879094d3684c31da6a14fa184aa839fe1607dad086bf3210fe43a572d488f99e1ecb85c56be04f9489
7
+ data.tar.gz: d65b0bbbce89c696c913cddb23241b40a8d3acad47aabe7b93e9283701d3e7c1a82fde6544924d7b3f209a855aa9d065218303701c809b7a15e4fba3837193f6
@@ -6,6 +6,6 @@ argv = Autoproj::CLI.basic_setup
6
6
 
7
7
  begin
8
8
  Autoproj::CLI::Main.start(argv)
9
- rescue Interrupt
9
+ rescue Interrupt # rubocop:disable Lint/HandleExceptions
10
10
  # Already notified in the reporting infrastructure
11
11
  end
@@ -35,24 +35,30 @@ def self.package_name_from_options(spec)
35
35
  # @deprecated use Autoproj.workspace.in_package_set or add a proper Loader
36
36
  # object to your class
37
37
  def self.in_package_set(package_set, path, &block)
38
- Autoproj.warn_deprecated __method__,
38
+ Autoproj.warn_deprecated(
39
+ __method__,
39
40
  "use Autoproj.workspace.in_package_set instead"
41
+ )
40
42
  Autoproj.workspace.in_package_set(package_set, path, &block)
41
43
  end
42
44
 
43
45
  # @deprecated use Autoproj.workspace.current_file or add a proper Loader
44
46
  # object to your class
45
47
  def self.current_file
46
- Autoproj.warn_deprecated __method__,
48
+ Autoproj.warn_deprecated(
49
+ __method__,
47
50
  "use AUtoproj.workspace.current_file instead"
51
+ )
48
52
  Autoproj.workspace.current_file
49
53
  end
50
54
 
51
55
  # @deprecated use Autoproj.workspace.current_package_set or add a proper
52
56
  # Loader object to your class
53
57
  def self.current_package_set
54
- Autoproj.warn_deprecated __method__,
58
+ Autoproj.warn_deprecated(
59
+ __method__,
55
60
  "use Autoproj.workspace.current_package_set instead"
61
+ )
56
62
  Autoproj.workspace.current_package_set
57
63
  end
58
64
 
@@ -60,22 +66,27 @@ def self.current_package_set
60
66
  # Beware that the return value changed from Autobuild::Package to
61
67
  # Autoproj::PackageDefinition
62
68
  def self.define(package_type, spec, &block)
63
- Autoproj.warn_deprecated __method__, "use Autoproj.workspace.define_package "\
69
+ Autoproj.warn_deprecated(
70
+ __method__, "use Autoproj.workspace.define_package "\
64
71
  "instead (and beware that the return value changed from "\
65
72
  "Autobuild::Package to Autoproj::PackageDefinition)"
73
+ )
66
74
  workspace.define_package(package_type, spec, block, *current_file).
67
75
  autobuild
68
76
  end
69
77
 
70
78
  def self.loaded_autobuild_files
71
- Autoproj.warn_deprecated __method__,
72
- "use Autoproj.workspace.loaded_autobuild_files"
79
+ Autoproj.warn_deprecated(
80
+ __method__, "use Autoproj.workspace.loaded_autobuild_files"
81
+ )
73
82
  Autoproj.workspace.loaded_autobuild_files
74
83
  end
75
84
 
76
85
  def self.import_autobuild_file(package_set, path)
77
- Autoproj.warn_deprecated __method__,
86
+ Autoproj.warn_deprecated(
87
+ __method__,
78
88
  "use Autoproj.workspace.import_autobuild_file"
89
+ )
79
90
  Autoproj.workspace.import_autobuild_file(package_set, path)
80
91
  end
81
92
 
@@ -490,11 +501,13 @@ def renamed_package(current_name, old_name, options)
490
501
  explicitely_selected_in_layout?(old_name)
491
502
  if options[:obsolete] && !explicit_selection
492
503
  import_package old_name
493
- Autoproj.workspace.manifest.exclude_package old_name,
504
+ Autoproj.workspace.manifest.exclude_package(
505
+ old_name,
494
506
  "#{old_name} has been renamed to #{current_name}, you still have "\
495
507
  "the option of using the old name by adding '- #{old_name}' explicitely "\
496
508
  "in the layout in autoproj/manifest, but be warned that the name will "\
497
509
  "stop being usable at all in the near future"
510
+ )
498
511
  else
499
512
  metapackage old_name, current_name
500
513
  end
@@ -151,7 +151,7 @@ def resolve_selection(user_selection, checkout_only: true, only_local: false, re
151
151
  non_imported_packages: non_imported_packages,
152
152
  auto_exclude: auto_exclude)
153
153
 
154
- return source_packages, osdep_packages, resolved_selection
154
+ [source_packages, osdep_packages, resolved_selection]
155
155
  rescue ExcludedSelection => e
156
156
  raise CLIInvalidSelection, e.message, e.backtrace
157
157
  end
@@ -18,12 +18,14 @@ def validate_options(selected_packages, options)
18
18
  end
19
19
 
20
20
  def run(selected_packages, **options)
21
- build_options, options = filter_options options,
21
+ build_options, options = filter_options(
22
+ options,
22
23
  force: false,
23
24
  rebuild: false,
24
25
  parallel: nil,
25
26
  confirm: true,
26
27
  not: Array.new
28
+ )
27
29
 
28
30
  command_line_selection, source_packages, _osdep_packages =
29
31
  super(selected_packages,
@@ -41,6 +43,7 @@ def run(selected_packages, **options)
41
43
  # Disable all packages that are not selected
42
44
  ws.manifest.each_autobuild_package do |pkg|
43
45
  next if active_packages.include?(pkg.name)
46
+
44
47
  pkg.disable
45
48
  end
46
49
 
@@ -61,11 +64,13 @@ def run(selected_packages, **options)
61
64
  else 'force-build'
62
65
  end
63
66
  if build_options[:confirm] != false
64
- opt = BuildOption.new("", "boolean",
67
+ opt = BuildOption.new(
68
+ "", "boolean",
65
69
  {
66
70
  doc: "this is going to trigger a #{mode_name} "\
67
71
  "of all packages. Is that really what you want ?"
68
- }, nil)
72
+ }, nil
73
+ )
69
74
  raise Interrupt unless opt.ask(false)
70
75
  end
71
76
 
@@ -1,9 +1,54 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'autoproj/cli/inspection_tool'
2
4
  require 'autoproj/ops/cache'
3
5
 
4
6
  module Autoproj
5
7
  module CLI
6
8
  class Cache < InspectionTool
9
+ def parse_gem_compile(string)
10
+ scanner = StringScanner.new(string)
11
+ name = scanner.scan(/[^\[]+/)
12
+
13
+ level = 0
14
+ artifacts = []
15
+ artifact_include = nil
16
+ artifact_name = ''.dup
17
+ until scanner.eos?
18
+ c = scanner.getch
19
+ if level == 0
20
+ raise ArgumentError, "expected '[' but got '#{c}'" unless c == '['
21
+
22
+ level = 1
23
+ include_c = scanner.getch
24
+ if %w[+ -].include?(include_c)
25
+ artifact_include = (include_c == '+')
26
+ elsif include_c == ']'
27
+ raise ArgumentError, "empty [] found in '#{string}'"
28
+ else
29
+ raise ArgumentError,
30
+ "expected '+' or '-' but got '#{c}' in '#{string}'"
31
+ end
32
+ next
33
+ end
34
+
35
+ if c == ']'
36
+ level -= 1
37
+ if level == 0
38
+ artifacts << [artifact_include, artifact_name]
39
+ artifact_name = ''.dup
40
+ next
41
+ end
42
+ end
43
+
44
+ artifact_name << c
45
+ end
46
+
47
+ raise ArgumentError, "missing closing ']' in #{string}" if level != 0
48
+
49
+ [name, artifacts: artifacts]
50
+ end
51
+
7
52
  def validate_options(argv, options = Hash.new)
8
53
  argv, options = super
9
54
 
@@ -22,8 +67,7 @@ def validate_options(argv, options = Hash.new)
22
67
 
23
68
  if (compile = options[:gems_compile])
24
69
  options[:gems_compile] = compile.map do |name|
25
- name, *artifacts = name.split('+')
26
- [name, artifacts: artifacts]
70
+ parse_gem_compile(name)
27
71
  end
28
72
  end
29
73
 
@@ -58,4 +102,3 @@ def run(cache_dir, *package_names,
58
102
  end
59
103
  end
60
104
  end
61
-
@@ -8,9 +8,7 @@ class InspectionTool < Base
8
8
  def initialize_and_load(mainline: nil)
9
9
  Autoproj.silent do
10
10
  ws.setup
11
- if mainline == 'mainline' || mainline == 'true'
12
- mainline = true
13
- end
11
+ mainline = true if %w[mainline true].include?(mainline)
14
12
  ws.load_package_sets(mainline: mainline)
15
13
  ws.config.save
16
14
  ws.setup_all_package_directories
@@ -22,7 +20,7 @@ def initialize_and_load(mainline: nil)
22
20
  # @param [Array<String>] packages the list of package names
23
21
  # @param [Symbol] non_imported_packages whether packages that are
24
22
  # not yet imported should be ignored (:ignore) or returned
25
- # (:return).
23
+ # (:return).
26
24
  # @option options recursive (true) whether the package resolution
27
25
  # should return the package(s) and their dependencies
28
26
  #
@@ -32,7 +30,8 @@ def initialize_and_load(mainline: nil)
32
30
  # the arguments were pointing within the configuration area
33
31
  def finalize_setup(packages = [], non_imported_packages: :ignore, recursive: true, auto_exclude: false)
34
32
  Autoproj.silent do
35
- packages, config_selected = normalize_command_line_package_selection(packages)
33
+ packages, config_selected =
34
+ normalize_command_line_package_selection(packages)
36
35
  # Call resolve_user_selection once to auto-add packages, so
37
36
  # that they're available to e.g. overrides.rb
38
37
  resolve_user_selection(packages)
@@ -41,7 +40,7 @@ def finalize_setup(packages = [], non_imported_packages: :ignore, recursive: tru
41
40
  resolve_selection(packages, recursive: recursive, non_imported_packages: non_imported_packages, auto_exclude: auto_exclude)
42
41
  ws.finalize_setup
43
42
  ws.export_installation_manifest
44
- return source_packages, osdep_packages, resolved_selection, config_selected
43
+ [source_packages, osdep_packages, resolved_selection, config_selected]
45
44
  end
46
45
  end
47
46
  end
@@ -17,7 +17,8 @@ def run(user_selection, short: false, recursive: false, mainline: false, env: fa
17
17
  source_packages, osdep_packages, * =
18
18
  finalize_setup(user_selection, recursive: recursive, non_imported_packages: :return)
19
19
  else
20
- source_packages, osdep_packages = Array.new, Array.new
20
+ source_packages = []
21
+ osdep_packages = []
21
22
  end
22
23
 
23
24
  all_matching_osdeps = osdep_packages.map { |pkg| [pkg, true] }
@@ -232,7 +233,7 @@ def display_common_information(pkg_name, default_packages, revdeps)
232
233
  end
233
234
  end
234
235
 
235
- if !selections.empty?
236
+ unless selections.empty?
236
237
  puts " selected by way of"
237
238
  selections.each do |root_pkg|
238
239
  paths = find_selection_path(root_pkg, pkg_name)
@@ -248,9 +249,7 @@ def display_common_information(pkg_name, default_packages, revdeps)
248
249
  end
249
250
 
250
251
  def find_selection_path(from, to)
251
- if from == to
252
- return [[from]]
253
- end
252
+ return [[from]] if from == to
254
253
 
255
254
  all_paths = Array.new
256
255
  ws.manifest.resolve_package_name(from).each do |pkg_type, pkg_name|
@@ -262,19 +261,17 @@ def find_selection_path(from, to)
262
261
 
263
262
  pkg = ws.manifest.find_autobuild_package(pkg_name)
264
263
  pkg.dependencies.each do |dep_pkg_name|
265
- if result = find_selection_path(dep_pkg_name, to)
264
+ if (result = find_selection_path(dep_pkg_name, to))
266
265
  all_paths.concat(result.map { |p| path + p })
267
266
  end
268
267
  end
269
- if pkg.os_packages.include?(to)
270
- all_paths << (path + [to])
271
- end
268
+ all_paths << (path + [to]) if pkg.os_packages.include?(to)
272
269
  end
273
270
 
274
271
  # Now filter common trailing subpaths
275
272
  all_paths = all_paths.sort_by(&:size)
276
273
  filtered_paths = Array.new
277
- while !all_paths.empty?
274
+ until all_paths.empty?
278
275
  path = all_paths.shift
279
276
  filtered_paths << path
280
277
  size = path.size
@@ -290,19 +287,15 @@ def vcs_to_array(vcs)
290
287
  options = vcs.dup
291
288
  type = options.delete('type')
292
289
  url = options.delete('url')
293
- else
290
+ else
294
291
  options = vcs.options
295
292
  type = vcs.type
296
293
  url = vcs.url
297
294
  end
298
295
 
299
296
  fields = []
300
- if type
301
- fields << ['type', type]
302
- end
303
- if url
304
- fields << ['url', url]
305
- end
297
+ fields << ['type', type] if type
298
+ fields << ['url', url] if url
306
299
  fields = fields.concat(options.to_a.sort_by { |k, _| k.to_s })
307
300
  fields.map do |key, value|
308
301
  if value.respond_to?(:to_str) && File.file?(value) && value =~ /^\//
@@ -315,9 +308,10 @@ def vcs_to_array(vcs)
315
308
  def compute_all_revdeps(pkg_revdeps, revdeps)
316
309
  pkg_revdeps = pkg_revdeps.dup
317
310
  all_revdeps = Array.new
318
- while !pkg_revdeps.empty?
311
+ until pkg_revdeps.empty?
319
312
  parent_name = pkg_revdeps.shift
320
313
  next if all_revdeps.include?(parent_name)
314
+
321
315
  all_revdeps << parent_name
322
316
  pkg_revdeps.concat(revdeps[parent_name].to_a)
323
317
  end
@@ -199,9 +199,7 @@ def update_packages(selected_packages,
199
199
  retry_count: 0, osdeps: true, auto_exclude: false, osdeps_options: Hash.new,
200
200
  report: true)
201
201
 
202
- if from
203
- setup_update_from(from)
204
- end
202
+ setup_update_from(from) if from
205
203
 
206
204
  ops = Autoproj::Ops::Import.new(
207
205
  ws, report_path: (ws.import_report_path if report))
@@ -216,14 +214,15 @@ def update_packages(selected_packages,
216
214
  retry_count: retry_count,
217
215
  install_vcs_packages: (osdeps_options if osdeps),
218
216
  auto_exclude: auto_exclude)
219
- return source_packages, osdep_packages, nil
217
+ [source_packages, osdep_packages, nil]
220
218
  rescue ExcludedSelection => e
221
219
  raise CLIInvalidSelection, e.message, e.backtrace
222
220
  rescue PackageImportFailed => import_failure
223
- if !keep_going
224
- raise
225
- end
226
- return import_failure.source_packages, import_failure.osdep_packages, import_failure
221
+ raise unless keep_going
222
+
223
+ [import_failure.source_packages,
224
+ import_failure.osdep_packages,
225
+ import_failure]
227
226
  end
228
227
 
229
228
  def setup_update_from(other_root)
@@ -50,12 +50,14 @@ def self.load(file)
50
50
 
51
51
  # Load the manifest data contained in +file+
52
52
  def load(file)
53
- if !File.exist?(file)
54
- raise ConfigError.new(File.dirname(file)), "expected an autoproj configuration in #{File.dirname(file)}, but #{file} does not exist"
53
+ unless File.exist?(file)
54
+ raise ConfigError.new(File.dirname(file)),
55
+ "expected an autoproj configuration in #{File.dirname(file)}, "\
56
+ "but #{file} does not exist"
55
57
  end
56
58
 
57
59
  data = Autoproj.in_file(file, Autoproj::YAML_LOAD_ERROR) do
58
- YAML.load(File.read(file)) || Hash.new
60
+ YAML.safe_load(File.read(file)) || {}
59
61
  end
60
62
 
61
63
  @file = file
@@ -81,7 +83,8 @@ def initialize_from_hash(data)
81
83
  @has_layout = !!data['layout']
82
84
 
83
85
  if data['constants']
84
- @constant_definitions = Autoproj.resolve_constant_definitions(data['constants'])
86
+ @constant_definitions =
87
+ Autoproj.resolve_constant_definitions(data['constants'])
85
88
  end
86
89
  end
87
90
 
@@ -107,13 +107,20 @@ def create_or_update(*package_names, all: true, keep_going: false,
107
107
  begin
108
108
  case pkg.importer
109
109
  when Autobuild::Git
110
- Autoproj.message " [#{i}/#{total}] caching #{pkg.name} (git)"
110
+ Autoproj.message(
111
+ " [#{i}/#{total}] caching #{pkg.name} (git)"
112
+ )
111
113
  cache_git(pkg, checkout_only: checkout_only)
112
114
  when Autobuild::ArchiveImporter
113
- Autoproj.message " [#{i}/#{total}] caching #{pkg.name} (archive)"
115
+ Autoproj.message(
116
+ " [#{i}/#{total}] caching #{pkg.name} (archive)"
117
+ )
114
118
  cache_archive(pkg)
115
119
  else
116
- Autoproj.message " [#{i}/#{total}] not caching #{pkg.name} (cannot cache #{pkg.importer.class})"
120
+ Autoproj.message(
121
+ " [#{i}/#{total}] not caching #{pkg.name} "\
122
+ "(cannot cache #{pkg.importer.class})"
123
+ )
117
124
  end
118
125
  rescue Interrupt
119
126
  raise
@@ -170,7 +177,9 @@ def create_or_update_gems(keep_going: true, compile_force: false, compile: [])
170
177
  next if !compile_force && File.file?(expected_platform_gem)
171
178
 
172
179
  begin
173
- compile_gem(gem, artifacts: artifacts, output: real_target_dir)
180
+ compile_gem(
181
+ gem, artifacts: artifacts, output: real_target_dir
182
+ )
174
183
  rescue CompilationFailed
175
184
  unless keep_going
176
185
  raise CompilationFailed, "#{gem} failed to compile"
@@ -200,17 +209,13 @@ def synchronize_gems_cache_dirs(source, target)
200
209
  end
201
210
 
202
211
  def guess_gem_program
203
- if Autobuild.programs['gem']
204
- return Autobuild.programs['gem']
205
- end
212
+ return Autobuild.programs['gem'] if Autobuild.programs['gem']
206
213
 
207
214
  ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
208
215
  ruby_bindir = RbConfig::CONFIG['bindir']
209
216
 
210
217
  candidates = ['gem']
211
- if ruby_bin =~ /^ruby(.+)$/
212
- candidates << "gem#{$1}"
213
- end
218
+ candidates << "gem#{$1}" if ruby_bin =~ /^ruby(.+)$/
214
219
 
215
220
  candidates.each do |gem_name|
216
221
  if File.file?(gem_full_path = File.join(ruby_bindir, gem_name))
@@ -219,11 +224,19 @@ def guess_gem_program
219
224
  end
220
225
  end
221
226
 
222
- raise ArgumentError, "cannot find a gem program (tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
227
+ raise ArgumentError,
228
+ 'cannot find a gem program (tried '\
229
+ "#{candidates.sort.join(', ')} in #{ruby_bindir})"
223
230
  end
224
231
 
225
232
  private def compile_gem(gem_path, output:, artifacts: [])
226
- artifacts = artifacts.flat_map { |n| ["--artifact", n] }
233
+ artifacts = artifacts.flat_map do |include, n|
234
+ if include
235
+ ["--include", n]
236
+ else
237
+ ["--exclude", n]
238
+ end
239
+ end
227
240
  unless system(Autobuild.tool('ruby'), '-S', guess_gem_program,
228
241
  'compile', '--output', output, *artifacts, gem_path)
229
242
  raise CompilationFailed, "#{gem_path} failed to compile"
@@ -9,7 +9,7 @@ def self.cached_env_path(root_dir)
9
9
  def self.load_cached_env(root_dir)
10
10
  path = cached_env_path(root_dir)
11
11
  if File.file?(path)
12
- env = YAML.load(File.read(path))
12
+ env = YAML.safe_load(File.read(path))
13
13
  Autobuild::Environment::ExportedEnvironment.new(
14
14
  env['set'], env['unset'], env['update'])
15
15
  end
@@ -20,7 +20,7 @@ def self.save_cached_env(root_dir, env)
20
20
  path = cached_env_path(root_dir)
21
21
  existing =
22
22
  begin
23
- YAML.load(File.read(path))
23
+ YAML.safe_load(File.read(path))
24
24
  rescue Exception
25
25
  end
26
26
 
@@ -288,8 +288,12 @@ def import_selected_packages(selection,
288
288
  if completion_queue.empty? && pending_packages.empty?
289
289
  unless missing_vcs.empty?
290
290
  installed_vcs_packages.merge(
291
- install_vcs_packages_for(*missing_vcs,
292
- **install_vcs_packages))
291
+ install_vcs_packages_for(
292
+ *missing_vcs,
293
+ install_only: import_options[:checkout_only],
294
+ **install_vcs_packages
295
+ )
296
+ )
293
297
  package_queue.concat(missing_vcs)
294
298
  missing_vcs.clear
295
299
  next
@@ -366,7 +370,9 @@ def import_selected_packages(selection,
366
370
  end
367
371
  end
368
372
 
369
- def finalize_package_load(processed_packages, auto_exclude: auto_exclude?)
373
+ def finalize_package_load(processed_packages,
374
+ ignore_optional_dependencies: false,
375
+ auto_exclude: auto_exclude?)
370
376
  manifest = ws.manifest
371
377
 
372
378
  all = Set.new
@@ -14,15 +14,17 @@ def initialize(ws, status_file = "/var/lib/dpkg/status")
14
14
  @installed_packages = nil
15
15
  @installed_versions = nil
16
16
  super(ws, true,
17
- %w{apt-get install},
18
- %w{DEBIAN_FRONTEND=noninteractive apt-get install -y})
17
+ %w[apt-get install],
18
+ %w[DEBIAN_FRONTEND=noninteractive apt-get install -y])
19
19
  end
20
20
 
21
21
  def configure_manager
22
22
  super
23
- ws.config.declare 'apt_dpkg_update', 'boolean',
23
+ ws.config.declare(
24
+ 'apt_dpkg_update', 'boolean',
24
25
  default: 'yes',
25
26
  doc: ['Would you like autoproj to keep apt packages up-to-date?']
27
+ )
26
28
  keep_uptodate?
27
29
  end
28
30
 
@@ -58,11 +60,12 @@ def self.parse_dpkg_status(status_file, virtual: true)
58
60
  dpkg_status << "\n"
59
61
 
60
62
  dpkg_status = StringScanner.new(dpkg_status)
61
- if !dpkg_status.scan(/Package: /)
62
- raise ArgumentError, "expected #{status_file} to have Package: lines but found none"
63
+ unless dpkg_status.scan(/Package: /)
64
+ raise ArgumentError, "expected #{status_file} to have Package: "\
65
+ "lines but found none"
63
66
  end
64
67
 
65
- while paragraph_end = dpkg_status.scan_until(/Package: /)
68
+ while (paragraph_end = dpkg_status.scan_until(/Package: /))
66
69
  paragraph = "Package: #{paragraph_end[0..-10]}"
67
70
  parse_package_status(installed_packages, installed_versions,
68
71
  paragraph, virtual: virtual)
@@ -74,11 +77,10 @@ def self.parse_dpkg_status(status_file, virtual: true)
74
77
 
75
78
  def self.parse_apt_cache_paragraph(paragraph)
76
79
  version = '0'
77
- if paragraph =~ /^Package: (.*)$/
78
- package_name = $1
79
- if paragraph =~ /^Version: (.*)$/
80
- version = $1
81
- end
80
+ if (paragraph_m = /^Package: (.*)$/.match(paragraph))
81
+ package_name = paragraph_m[1]
82
+ version_m = /^Version: (.*)$/.match(paragraph)
83
+ version = version_m[1] if version_m
82
84
  end
83
85
  [package_name, version]
84
86
  end
@@ -87,23 +89,24 @@ def self.parse_packages_versions(packages)
87
89
  packages_versions = {}
88
90
  apt_cache_show = `apt-cache show --no-all-versions #{packages.join(' ')}`
89
91
  apt_cache_show = StringScanner.new(apt_cache_show)
90
- if !apt_cache_show.scan(/Package: /)
91
- return packages_versions
92
- end
92
+ return packages_versions unless apt_cache_show.scan(/Package: /)
93
93
 
94
- while paragraph_end = apt_cache_show.scan_until(/Package: /)
94
+ while (paragraph_end = apt_cache_show.scan_until(/Package: /))
95
95
  paragraph = "Package: #{paragraph_end[0..-10]}"
96
96
  package_name, version = parse_apt_cache_paragraph(paragraph)
97
97
  packages_versions[package_name] = DebianVersion.new(version)
98
98
  end
99
- package_name, version = parse_apt_cache_paragraph("Package: #{apt_cache_show.rest}")
99
+ package_name, version = parse_apt_cache_paragraph(
100
+ "Package: #{apt_cache_show.rest}"
101
+ )
100
102
  packages_versions[package_name] = DebianVersion.new(version)
101
103
  packages_versions
102
104
  end
103
105
 
104
106
  def updated?(package, available_version)
105
- # Consider up-to-date if the package is provided by another package (purely virtual)
106
- # Ideally, we should check the version of the package that provides it
107
+ # Consider up-to-date if the package is provided by another
108
+ # package (purely virtual) Ideally, we should check the version
109
+ # of the package that provides it
107
110
  return true unless available_version && @installed_versions[package]
108
111
 
109
112
  (available_version <= @installed_versions[package])
@@ -111,8 +114,13 @@ def updated?(package, available_version)
111
114
 
112
115
  # On a dpkg-enabled system, checks if the provided package is installed
113
116
  # and returns true if it is the case
114
- def installed?(package_name, filter_uptodate_packages: false, install_only: false)
115
- @installed_packages, @installed_versions = self.class.parse_dpkg_status(status_file) unless @installed_packages && @installed_versions
117
+ def installed?(package_name, filter_uptodate_packages: false,
118
+ install_only: false)
119
+ unless @installed_packages && @installed_versions
120
+ @installed_packages, @installed_versions =
121
+ self.class.parse_dpkg_status(status_file)
122
+ end
123
+
116
124
  if package_name =~ /^(\w[a-z0-9+-.]+)/
117
125
  @installed_packages.include?($1)
118
126
  else
@@ -122,11 +130,18 @@ def installed?(package_name, filter_uptodate_packages: false, install_only: fals
122
130
  end
123
131
 
124
132
  def install(packages, filter_uptodate_packages: false, install_only: false)
125
- packages_versions = self.class.parse_packages_versions(packages)
126
133
  if filter_uptodate_packages || install_only
127
- packages = packages.find_all do |package_name|
128
- !installed?(package_name) || (keep_uptodate? && !updated?(package_name, packages_versions[package_name]))
134
+ already_installed, missing = packages.partition do |package_name|
135
+ installed?(package_name)
136
+ end
137
+
138
+ if keep_uptodate? && !install_only
139
+ packages_versions = self.class.parse_packages_versions(already_installed)
140
+ need_update = already_installed.find_all do |package_name|
141
+ !updated?(package_name, packages_versions[package_name])
142
+ end
129
143
  end
144
+ packages = missing + (need_update || [])
130
145
  end
131
146
 
132
147
  if super(packages)
@@ -89,6 +89,7 @@ def initialize_environment
89
89
  Bundler.rubygems.gem_path
90
90
  .none? { |gem_p| p.start_with?(gem_p) }
91
91
  end
92
+
92
93
  # And discover the system's rubylib
93
94
  if (system_rubylib = discover_rubylib)
94
95
  # Do not explicitely add the system rubylib to the
@@ -7,8 +7,10 @@ def self.execute(command_line, with_locking, with_root, env: Autobuild.env)
7
7
  if with_locking
8
8
  File.open('/tmp/autoproj_osdeps_lock', 'w') do |lock_io|
9
9
  begin
10
- while !lock_io.flock(File::LOCK_EX | File::LOCK_NB)
11
- Autoproj.message " waiting for other autoproj instances to finish their osdeps installation"
10
+ until lock_io.flock(File::LOCK_EX | File::LOCK_NB)
11
+ Autoproj.message " waiting for other autoproj "\
12
+ "instances to finish their osdeps "\
13
+ "installation"
12
14
  sleep 5
13
15
  end
14
16
  return execute(command_line, false, with_root, env: env)
@@ -17,7 +19,7 @@ def self.execute(command_line, with_locking, with_root, env: Autobuild.env)
17
19
  end
18
20
  end
19
21
  end
20
-
22
+
21
23
  if with_root
22
24
  sudo = Autobuild.tool_in_path('sudo', env: env)
23
25
  command_line = [sudo, *command_line]
@@ -34,10 +36,12 @@ def self.execute(command_line, with_locking, with_root, env: Autobuild.env)
34
36
  # This declares if this package manager cannot be used concurrently.
35
37
  # If it is the case, autoproj will ensure that there is no two
36
38
  # autoproj instances running this package manager at the same time
37
- #
39
+ #
38
40
  # @return [Boolean]
39
41
  # @see needs_locking=
40
- def needs_locking?; !!@needs_locking end
42
+ def needs_locking?
43
+ @needs_locking
44
+ end
41
45
 
42
46
  # Overrides the {#needs_root?} flag
43
47
  attr_writer :needs_root
@@ -45,10 +49,12 @@ def needs_locking?; !!@needs_locking end
45
49
  #
46
50
  # This declares if the command line(s) for this package manager
47
51
  # should be started as root. Root access is provided using sudo
48
- #
52
+ #
49
53
  # @return [Boolean]
50
54
  # @see needs_root=
51
- def needs_root?; !!@needs_root end
55
+ def needs_root?
56
+ @needs_root
57
+ end
52
58
 
53
59
  # Command line used by autoproj to install packages
54
60
  #
@@ -83,10 +89,13 @@ def needs_root?; !!@needs_root end
83
89
  # itself, see {#auto_install_cmd}.
84
90
  # @param [Boolean] needs_root if the command lines should be started
85
91
  # as root or not. See {#needs_root?}
86
- def initialize(ws, needs_locking, user_install_cmd, auto_install_cmd,needs_root=true)
92
+ def initialize(ws, needs_locking, user_install_cmd,
93
+ auto_install_cmd, needs_root = true)
87
94
  super(ws)
88
- @needs_locking, @user_install_cmd, @auto_install_cmd,@needs_root =
89
- needs_locking, user_install_cmd, auto_install_cmd, needs_root
95
+ @needs_locking = needs_locking
96
+ @user_install_cmd = user_install_cmd
97
+ @auto_install_cmd = auto_install_cmd
98
+ @needs_root = needs_root
90
99
  end
91
100
 
92
101
  # Generate the shell script that would allow the user to install
@@ -98,7 +107,8 @@ def initialize(ws, needs_locking, user_install_cmd, auto_install_cmd,needs_root=
98
107
  # command-line pattern that should be used to generate the script.
99
108
  # If given, it overrides the default value stored in
100
109
  # {#user_install_cmd]
101
- def generate_user_os_script(os_packages, user_install_cmd: self.user_install_cmd)
110
+ def generate_user_os_script(os_packages,
111
+ user_install_cmd: self.user_install_cmd)
102
112
  if user_install_cmd
103
113
  user_install_cmd.join(" ") + " " + os_packages.join("' '")
104
114
  else generate_auto_os_script(os_packages)
@@ -114,7 +124,8 @@ def generate_user_os_script(os_packages, user_install_cmd: self.user_install_cmd
114
124
  # command-line pattern that should be used to generate the script.
115
125
  # If given, it overrides the default value stored in
116
126
  # {#auto_install_cmd]
117
- def generate_auto_os_script(os_packages, auto_install_cmd: self.auto_install_cmd)
127
+ def generate_auto_os_script(os_packages,
128
+ auto_install_cmd: self.auto_install_cmd)
118
129
  auto_install_cmd.join(" ") + " " + os_packages.join("' '")
119
130
  end
120
131
 
@@ -139,9 +150,9 @@ def osdeps_interaction(os_packages, shell_script)
139
150
  # anyway, do so now
140
151
  puts <<-EOMSG
141
152
 
142
- #{Autoproj.color("The build process and/or the packages require some other software to be installed", :bold)}
143
- #{Autoproj.color("and you required autoproj to not install them itself", :bold)}
144
- #{Autoproj.color("\nIf these packages are already installed, simply ignore this message\n", :red) if !respond_to?(:filter_uptodate_packages)}
153
+ #{Autoproj.color('The build process and/or the packages require some other software to be installed', :bold)}
154
+ #{Autoproj.color('and you required autoproj to not install them itself', :bold)}
155
+ #{Autoproj.color('\nIf these packages are already installed, simply ignore this message\n', :red) unless respond_to?(:filter_uptodate_packages)}
145
156
  The following packages are available as OS dependencies, i.e. as prebuilt
146
157
  packages provided by your distribution / operating system. You will have to
147
158
  install them manually if they are not already installed
@@ -152,8 +163,8 @@ def osdeps_interaction(os_packages, shell_script)
152
163
 
153
164
  #{shell_script.split("\n").join("\n| ")}
154
165
 
155
- EOMSG
156
- print " #{Autoproj.color("Press ENTER to continue ", :bold)}"
166
+ EOMSG
167
+ print " #{Autoproj.color('Press ENTER to continue ', :bold)}"
157
168
  STDOUT.flush
158
169
  STDIN.readline
159
170
  puts
@@ -172,23 +183,33 @@ def osdeps_interaction(os_packages, shell_script)
172
183
  # packages. See the option in {#generate_auto_os_script}
173
184
  # @return [Boolean] true if packages got installed, false otherwise
174
185
  def install(packages, filter_uptodate_packages: false, install_only: false,
175
- auto_install_cmd: self.auto_install_cmd, user_install_cmd: self.user_install_cmd)
186
+ auto_install_cmd: self.auto_install_cmd,
187
+ user_install_cmd: self.user_install_cmd)
176
188
  return if packages.empty?
177
189
 
178
190
  handled_os = ws.supported_operating_system?
179
191
  if handled_os
180
- shell_script = generate_auto_os_script(packages, auto_install_cmd: auto_install_cmd)
181
- user_shell_script = generate_user_os_script(packages, user_install_cmd: user_install_cmd)
192
+ shell_script = generate_auto_os_script(
193
+ packages, auto_install_cmd: auto_install_cmd
194
+ )
195
+ user_shell_script = generate_user_os_script(
196
+ packages, user_install_cmd: user_install_cmd
197
+ )
182
198
  end
183
199
  if osdeps_interaction(packages, user_shell_script)
184
- Autoproj.message " installing OS packages: #{packages.sort.join(", ")}"
200
+ Autoproj.message " installing OS packages: "\
201
+ "#{packages.sort.join(', ')}"
185
202
 
186
203
  if Autoproj.verbose
187
- Autoproj.message "Generating installation script for non-ruby OS dependencies"
204
+ Autoproj.message "Generating installation script for "\
205
+ "non-ruby OS dependencies"
188
206
  Autoproj.message shell_script
189
207
  end
190
208
 
191
- ShellScriptManager.execute([*auto_install_cmd, *packages], needs_locking?, needs_root?, env: ws.env)
209
+ ShellScriptManager.execute(
210
+ [*auto_install_cmd, *packages], needs_locking?,
211
+ needs_root?, env: ws.env
212
+ )
192
213
  return true
193
214
  end
194
215
  false
@@ -196,4 +217,3 @@ def install(packages, filter_uptodate_packages: false, install_only: false,
196
217
  end
197
218
  end
198
219
  end
199
-
@@ -30,13 +30,15 @@ def self.load(package, file, ros_manifest: false)
30
30
  # @param [Boolean] ros_manifest whether the file follows the ROS format
31
31
  # @return [PackageManifest]
32
32
  # @see load
33
- def self.parse(package, contents, path: '<loaded from string>', loader_class: Loader)
33
+ def self.parse(package, contents,
34
+ path: '<loaded from string>', loader_class: Loader)
34
35
  manifest = PackageManifest.new(package, path)
35
36
  loader = loader_class.new(path, manifest)
36
37
  begin
37
38
  REXML::Document.parse_stream(contents, loader)
38
39
  rescue REXML::ParseException => e
39
- raise Autobuild::PackageException.new(package.name, 'prepare'), "invalid #{file}: #{e.message}"
40
+ raise Autobuild::PackageException.new(package.name, 'prepare'),
41
+ "invalid #{file}: #{e.message}"
40
42
  end
41
43
  manifest
42
44
  end
@@ -45,7 +47,7 @@ def self.parse(package, contents, path: '<loaded from string>', loader_class: Lo
45
47
  Dependency = Struct.new :name, :optional, :modes
46
48
 
47
49
  # The Autobuild::Package instance this manifest applies on
48
- attr_reader :package
50
+ attr_accessor :package
49
51
  attr_reader :path
50
52
  attr_accessor :description
51
53
  attr_accessor :brief_description
@@ -64,7 +66,7 @@ def add_dependency(name, optional: false, modes: [])
64
66
  end
65
67
 
66
68
  def has_documentation?
67
- !!description
69
+ description
68
70
  end
69
71
 
70
72
  def documentation
@@ -72,7 +74,7 @@ def documentation
72
74
  end
73
75
 
74
76
  def has_short_documentation?
75
- !!brief_description
77
+ brief_description
76
78
  end
77
79
 
78
80
  def short_documentation
@@ -95,11 +97,12 @@ def initialize(package, path = nil, null: false)
95
97
  # Whether this is a null manifest (used for packages that have actually
96
98
  # no manifest) or not
97
99
  def null?
98
- !!@null
100
+ @null
99
101
  end
100
102
 
101
- def each_dependency(in_modes = Array.new, &block)
102
- return enum_for(__method__, in_modes) if !block_given?
103
+ def each_dependency(in_modes = [])
104
+ return enum_for(__method__, in_modes) unless block_given?
105
+
103
106
  dependencies.each do |dep|
104
107
  if dep.modes.empty? || in_modes.any? { |m| dep.modes.include?(m) }
105
108
  yield(dep.name, dep.optional)
@@ -108,24 +111,28 @@ def each_dependency(in_modes = Array.new, &block)
108
111
  end
109
112
 
110
113
  def each_os_dependency(modes = Array.new, &block)
111
- Autoproj.warn_deprecated "#{self.class}##{__method__}", "call #each_dependency instead"
112
- return each_dependency(modes, &block)
114
+ Autoproj.warn_deprecated "#{self.class}##{__method__}",
115
+ "call #each_dependency instead"
116
+ each_dependency(modes, &block)
113
117
  end
114
118
 
115
119
  def each_package_dependency(modes = Array.new, &block)
116
- Autoproj.warn_deprecated "#{self.class}##{__method__}", "call #each_dependency instead"
117
- return each_dependency(modes, &block)
120
+ Autoproj.warn_deprecated "#{self.class}##{__method__}",
121
+ "call #each_dependency instead"
122
+ each_dependency(modes, &block)
118
123
  end
119
124
 
120
125
  def each_rock_maintainer
121
- return enum_for(__method__) if !block_given?
126
+ return enum_for(__method__) unless block_given?
127
+
122
128
  rock_maintainers.each do |m|
123
129
  yield(m.name, m.email)
124
130
  end
125
131
  end
126
132
 
127
133
  def each_maintainer
128
- return enum_for(__method__) if !block_given?
134
+ return enum_for(__method__) unless block_given?
135
+
129
136
  maintainers.each do |m|
130
137
  yield(m.name, m.email)
131
138
  end
@@ -134,7 +141,8 @@ def each_maintainer
134
141
  # Enumerates the name and email of each author. If no email is present,
135
142
  # yields (name, nil)
136
143
  def each_author
137
- return enum_for(__method__) if !block_given?
144
+ return enum_for(__method__) unless block_given?
145
+
138
146
  authors.each do |m|
139
147
  yield(m.name, m.email)
140
148
  end
@@ -178,11 +186,13 @@ def initialize(path, manifest)
178
186
 
179
187
  def parse_depend_tag(tag_name, attributes, modes: [], optional: false)
180
188
  package = attributes['package'] || attributes['name']
181
- if !package
182
- raise InvalidPackageManifest, "found '#{tag_name}' tag in #{path} without a 'package' attribute"
189
+ unless package
190
+ raise InvalidPackageManifest,
191
+ "found '#{tag_name}' tag in #{path} "\
192
+ "without a 'package' attribute"
183
193
  end
184
194
 
185
- if tag_modes = attributes['modes']
195
+ if (tag_modes = attributes['modes'])
186
196
  modes += tag_modes.split(',')
187
197
  end
188
198
 
@@ -195,7 +205,7 @@ def parse_depend_tag(tag_name, attributes, modes: [], optional: false)
195
205
  def parse_contact_field(text)
196
206
  text.strip.split(',').map do |str|
197
207
  name, email = str.split('/').map(&:strip)
198
- email = nil if email && email.empty?
208
+ email = nil if email&.empty?
199
209
  ContactInfo.new(name, email)
200
210
  end
201
211
  end
@@ -213,7 +223,7 @@ def toplevel_tag_start(name, attributes)
213
223
  elsif name =~ /^(\w+)_depend$/
214
224
  parse_depend_tag(name, attributes, modes: [$1])
215
225
  elsif name == 'description'
216
- if brief = attributes['brief']
226
+ if (brief = attributes['brief'])
217
227
  manifest.brief_description = brief
218
228
  end
219
229
  @tag_text = ''
@@ -225,14 +235,13 @@ def toplevel_tag_start(name, attributes)
225
235
  @tag_text = nil
226
236
  end
227
237
  end
238
+
228
239
  def toplevel_tag_end(name)
229
240
  if AUTHOR_FIELDS.include?(name)
230
241
  manifest.send("#{name}s").concat(parse_contact_field(@tag_text))
231
242
  elsif TEXT_FIELDS.include?(name)
232
243
  field = @tag_text.strip
233
- if !field.empty?
234
- manifest.send("#{name}=", field)
235
- end
244
+ manifest.send("#{name}=", field) unless field.empty?
236
245
  elsif name == 'tags'
237
246
  manifest.tags.concat(@tag_text.strip.split(',').map(&:strip))
238
247
  end
@@ -245,10 +254,10 @@ def toplevel_tag_end(name)
245
254
  # REXML stream parser object used to load the XML contents into a
246
255
  # {PackageManifest} object
247
256
  class RosLoader < Loader
248
- SUPPORTED_MODES = ['test', 'doc'].freeze
249
- DEPEND_TAGS = Set['depend', 'build_depend', 'build_export_depend',
250
- 'buildtool_depend', 'buildtool_export_depend',
251
- 'exec_depend', 'test_depend', 'run_depend', 'doc_depend']
257
+ SUPPORTED_MODES = %w[test doc].freeze
258
+ DEPEND_TAGS = %w[depend build_depend build_export_depend
259
+ buildtool_depend buildtool_export_depend
260
+ exec_depend test_depend run_depend doc_depend].to_set.freeze
252
261
 
253
262
  def toplevel_tag_start(name, attributes)
254
263
  if DEPEND_TAGS.include?(name)
@@ -265,18 +274,21 @@ def toplevel_tag_start(name, attributes)
265
274
 
266
275
  def toplevel_tag_end(name)
267
276
  if DEPEND_TAGS.include?(name)
268
- raise InvalidPackageManifest, "found '#{name}' tag in #{path} without content" if @tag_text.strip.empty?
277
+ if @tag_text.strip.empty?
278
+ raise InvalidPackageManifest, "found '#{name}' tag in #{path} "\
279
+ "without content"
280
+ end
269
281
 
270
282
  mode = []
271
- if name =~ /^(\w+)_depend$/
272
- mode = SUPPORTED_MODES & [$1]
283
+ if (m = /^(\w+)_depend$/.match(name))
284
+ mode = SUPPORTED_MODES & [m[1]]
273
285
  end
274
286
 
275
287
  manifest.add_dependency(@tag_text, modes: mode)
276
288
  elsif AUTHOR_FIELDS.include?(name)
277
289
  author_name = @tag_text.strip
278
290
  email = @author_email ? @author_email.strip : nil
279
- email = nil if email && email.empty?
291
+ email = nil if email&.empty?
280
292
  contact = ContactInfo.new(author_name, email)
281
293
  manifest.send("#{name}s").concat([contact])
282
294
  elsif TEXT_FIELDS.include?(name)
@@ -1,3 +1,3 @@
1
1
  module Autoproj
2
- VERSION = "2.12.0"
2
+ VERSION = "2.12.1"
3
3
  end
@@ -243,7 +243,7 @@ def overrides_dir
243
243
  File.join(config_dir, OVERRIDES_DIR)
244
244
  end
245
245
 
246
- IMPORT_REPORT_BASENAME = "import_report.json"
246
+ IMPORT_REPORT_BASENAME = "import_report.json".freeze
247
247
 
248
248
  # The full path to the update report
249
249
  #
@@ -252,7 +252,7 @@ def import_report_path
252
252
  File.join(log_dir, IMPORT_REPORT_BASENAME)
253
253
  end
254
254
 
255
- BUILD_REPORT_BASENAME = "build_report.json"
255
+ BUILD_REPORT_BASENAME = "build_report.json".freeze
256
256
 
257
257
  # The full path to the build report
258
258
  #
@@ -306,14 +306,18 @@ def save_config
306
306
  def autodetect_operating_system(force: false)
307
307
  if force || !os_package_resolver.operating_system
308
308
  begin
309
- Autobuild.progress_start :operating_system_autodetection,
309
+ Autobuild.progress_start(
310
+ :operating_system_autodetection,
310
311
  "autodetecting the operating system"
312
+ )
311
313
  names, versions = OSPackageResolver.autodetect_operating_system
312
314
  os_package_resolver.operating_system = [names, versions]
313
315
  os_repository_resolver.operating_system = [names, versions]
314
- Autobuild.progress :operating_system_autodetection,
316
+ Autobuild.progress(
317
+ :operating_system_autodetection,
315
318
  "operating system: #{(names - ['default']).join(',')} -"\
316
319
  " #{(versions - ['default']).join(',')}"
320
+ )
317
321
  ensure
318
322
  Autobuild.progress_done :operating_system_autodetection
319
323
  end
@@ -416,7 +420,7 @@ def rewrite_shims
416
420
  gemfile = File.join(dot_autoproj_dir, 'Gemfile')
417
421
  binstubs = File.join(dot_autoproj_dir, 'bin')
418
422
  Ops::Install.rewrite_shims(binstubs, config.ruby_executable,
419
- root_dir, gemfile, config.gems_gem_home)
423
+ root_dir, gemfile, config.gems_gem_home)
420
424
  end
421
425
 
422
426
  def update_bundler
@@ -601,6 +605,10 @@ def register_workspace
601
605
  current_workspaces = Workspace.registered_workspaces
602
606
  existing = current_workspaces.find { |w| w.root_dir == root_dir }
603
607
  if existing
608
+ if existing.prefix_dir == prefix_dir && existing.build_dir == build_dir
609
+ return
610
+ end
611
+
604
612
  existing.prefix_dir = prefix_dir
605
613
  existing.build_dir = build_dir
606
614
  else
@@ -818,10 +826,12 @@ def all_os_packages(import_missing: false, parallel: config.parallel_import_leve
818
826
  if import_missing
819
827
  ops = Autoproj::Ops::Import.new(self)
820
828
  _, all_os_packages =
821
- ops.import_packages(manifest.default_packages,
822
- checkout_only: true, only_local: true, reset: false,
823
- recursive: true, keep_going: true, parallel: parallel,
824
- retry_count: 0)
829
+ ops.import_packages(
830
+ manifest.default_packages,
831
+ checkout_only: true, only_local: true, reset: false,
832
+ recursive: true, keep_going: true, parallel: parallel,
833
+ retry_count: 0
834
+ )
825
835
  all_os_packages
826
836
  else
827
837
  manifest.all_selected_osdep_packages
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autoproj
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.12.0
4
+ version: 2.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-27 00:00:00.000000000 Z
11
+ date: 2020-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler