autoproj 2.9.0 → 2.10.0

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +113 -0
  3. data/.travis.yml +0 -2
  4. data/Gemfile +1 -0
  5. data/README.md +59 -14
  6. data/bin/autoproj_bootstrap +21 -12
  7. data/bin/autoproj_bootstrap.in +2 -2
  8. data/bin/autoproj_install +21 -12
  9. data/bin/autoproj_install.in +2 -2
  10. data/lib/autoproj/aruba_minitest.rb +4 -4
  11. data/lib/autoproj/autobuild_extensions/dsl.rb +91 -70
  12. data/lib/autoproj/autobuild_extensions/package.rb +20 -1
  13. data/lib/autoproj/build_option.rb +24 -7
  14. data/lib/autoproj/cli/base.rb +12 -1
  15. data/lib/autoproj/cli/bootstrap.rb +9 -3
  16. data/lib/autoproj/cli/build.rb +17 -13
  17. data/lib/autoproj/cli/envsh.rb +1 -1
  18. data/lib/autoproj/cli/exec.rb +5 -7
  19. data/lib/autoproj/cli/main.rb +44 -9
  20. data/lib/autoproj/cli/main_test.rb +2 -0
  21. data/lib/autoproj/cli/test.rb +29 -6
  22. data/lib/autoproj/cli/version.rb +52 -0
  23. data/lib/autoproj/cli/versions.rb +4 -1
  24. data/lib/autoproj/cli/watch.rb +2 -1
  25. data/lib/autoproj/configuration.rb +49 -11
  26. data/lib/autoproj/default.osdeps +9 -0
  27. data/lib/autoproj/manifest.rb +6 -6
  28. data/lib/autoproj/ops/build.rb +5 -15
  29. data/lib/autoproj/ops/import.rb +22 -3
  30. data/lib/autoproj/ops/install.rb +19 -10
  31. data/lib/autoproj/ops/main_config_switcher.rb +12 -6
  32. data/lib/autoproj/ops/snapshot.rb +5 -1
  33. data/lib/autoproj/os_package_resolver.rb +245 -209
  34. data/lib/autoproj/package_selection.rb +18 -0
  35. data/lib/autoproj/reporter.rb +45 -31
  36. data/lib/autoproj/test.rb +107 -56
  37. data/lib/autoproj/version.rb +1 -1
  38. data/lib/autoproj/workspace.rb +90 -72
  39. data/shell/completion/amake_bash +1 -0
  40. data/shell/completion/amake_zsh +1 -0
  41. data/shell/completion/autoproj_bash +2 -0
  42. data/shell/completion/autoproj_zsh +2 -0
  43. metadata +5 -3
@@ -1,3 +1,3 @@
1
1
  module Autoproj
2
- VERSION = "2.9.0"
2
+ VERSION = "2.10.0"
3
3
  end
@@ -54,11 +54,12 @@ class Workspace < Ops::Loader
54
54
  def initialize(root_dir,
55
55
  os_package_resolver: OSPackageResolver.new,
56
56
  package_managers: OSPackageInstaller::PACKAGE_MANAGERS,
57
- os_repository_resolver: OSRepositoryResolver.new(operating_system: os_package_resolver.operating_system),
57
+ os_repository_resolver: OSRepositoryResolver.new(
58
+ operating_system: os_package_resolver.operating_system),
58
59
  os_repository_installer: OSRepositoryInstaller.new(self))
59
60
  @root_dir = root_dir
60
61
  @root_path = Pathname.new(root_dir)
61
- @ruby_version_keyword = "ruby#{RUBY_VERSION.split('.')[0, 2].join("")}"
62
+ @ruby_version_keyword = "ruby#{RUBY_VERSION.split('.')[0, 2].join('')}"
62
63
  @osdep_suffixes = Array.new
63
64
 
64
65
  @loader = loader
@@ -82,10 +83,8 @@ def initialize(root_dir,
82
83
  # @return [String,nil] the root path, or nil if one did not yet source
83
84
  # the workspace's env.sh
84
85
  def self.autoproj_current_root
85
- if env = ENV['AUTOPROJ_CURRENT_ROOT']
86
- if !env.empty?
87
- env
88
- end
86
+ if (env = ENV['AUTOPROJ_CURRENT_ROOT'])
87
+ env unless env.empty?
89
88
  end
90
89
  end
91
90
 
@@ -104,31 +103,35 @@ def self.from_pwd(**workspace_options)
104
103
  # and the one from +dir+ mismatch
105
104
  # @raise [NotWorkspace] if dir is not within an autoproj workspace
106
105
  def self.from_dir(dir, **workspace_options)
107
- if path = Autoproj.find_workspace_dir(dir)
106
+ if (path = Autoproj.find_workspace_dir(dir))
108
107
  Workspace.new(path, **workspace_options)
109
108
  elsif Autoproj.find_v1_workspace_dir(dir)
110
- raise OutdatedWorkspace, "#{dir} looks like a v1 workspace, run autoproj upgrade before continuing"
109
+ raise OutdatedWorkspace, "#{dir} looks like a v1 workspace, "\
110
+ "run autoproj upgrade before continuing"
111
111
  else
112
112
  raise NotWorkspace, "not in a Autoproj installation"
113
113
  end
114
114
  end
115
115
 
116
116
  def self.from_environment(**workspace_options)
117
- if path = Autoproj.find_workspace_dir
117
+ if (path = Autoproj.find_workspace_dir)
118
118
  from_dir(path, **workspace_options)
119
119
  elsif Autoproj.find_v1_workspace_dir(dir = Autoproj.default_find_base_dir)
120
- raise OutdatedWorkspace, "#{dir} looks like a v1 workspace, run autoproj upgrade before continuing"
121
- elsif envvar = ENV['AUTOPROJ_CURRENT_ROOT']
122
- raise NotWorkspace, "AUTOPROJ_CURRENT_ROOT is currently set to #{envvar}, but that is not an Autoproj workspace"
120
+ raise OutdatedWorkspace, "#{dir} looks like a v1 workspace, "\
121
+ "run autoproj upgrade before continuing"
122
+ elsif (envvar = ENV['AUTOPROJ_CURRENT_ROOT'])
123
+ raise NotWorkspace, "AUTOPROJ_CURRENT_ROOT is currently set "\
124
+ "to #{envvar}, but that is not an Autoproj workspace"
123
125
  else
124
- raise NotWorkspace, "not in an Autoproj installation, and no env.sh has been loaded so far"
126
+ raise NotWorkspace, "not in an Autoproj installation, "\
127
+ "and no env.sh has been loaded so far"
125
128
  end
126
129
  end
127
130
 
128
131
  # Tests whether the given path is under a directory tree managed by
129
132
  # autoproj
130
133
  def self.in_autoproj_project?(path)
131
- !!Autoproj.find_workspace_dir(path)
134
+ Autoproj.find_workspace_dir(path)
132
135
  end
133
136
 
134
137
  # Returns the default workspace
@@ -141,15 +144,19 @@ def self.in_autoproj_project?(path)
141
144
  # directory
142
145
  def self.default(**workspace_options)
143
146
  ws = from_environment(**workspace_options)
144
- if (from_pwd = Autoproj.find_workspace_dir(Dir.pwd)) && (from_pwd != ws.root_dir)
145
- raise MismatchingWorkspace, "the current environment points to #{ws.root_dir}, but you are in #{from_pwd}, make sure you are loading the right #{ENV_FILENAME} script !"
147
+ from_pwd = Autoproj.find_workspace_dir(Dir.pwd)
148
+ if from_pwd && (from_pwd != ws.root_dir)
149
+ raise MismatchingWorkspace, "the current environment points to "\
150
+ "#{ws.root_dir}, but you are in #{from_pwd}, make sure you "\
151
+ "are loading the right #{ENV_FILENAME} script !"
146
152
  end
147
153
  ws
148
154
  end
149
155
 
150
156
  def load(*args)
151
157
  set_as_main_workspace
152
- flag, Autoproj.warn_deprecated_level = Autoproj.warn_deprecated_level, 1
158
+ flag = Autoproj.warn_deprecated_level
159
+ Autoproj.warn_deprecated_level = 1
153
160
  super
154
161
  ensure
155
162
  Autoproj.warn_deprecated_level = flag
@@ -227,7 +234,7 @@ def log_dir
227
234
  File.join(prefix_dir, 'log')
228
235
  end
229
236
 
230
- OVERRIDES_DIR = "overrides.d"
237
+ OVERRIDES_DIR = "overrides.d".freeze
231
238
 
232
239
  # Returns the directory containing overrides files
233
240
  #
@@ -236,24 +243,42 @@ def overrides_dir
236
243
  File.join(config_dir, OVERRIDES_DIR)
237
244
  end
238
245
 
246
+ BUILD_REPORT_BASENAME = "build_report.json"
247
+
248
+ # The full path to the build report
249
+ #
250
+ # @return [String]
251
+ def build_report_path
252
+ File.join(log_dir, BUILD_REPORT_BASENAME)
253
+ end
254
+
255
+ # Load the configuration for this workspace from
256
+ # config_file_path
257
+ #
258
+ # @param [Boolean] reset Set to true to replace the configuration object,
259
+ # set to false to load into the existing
260
+ # @return [Configuration] configuration object
239
261
  def load_config(reconfigure = false)
240
- @config = Configuration.new(config_file_path)
241
262
  if File.file?(config_file_path)
242
- config.load(reconfigure: reconfigure)
243
- if raw_vcs = config.get('manifest_source', nil)
244
- manifest.vcs = VCSDefinition.from_raw(raw_vcs)
245
- else
246
- manifest.vcs = VCSDefinition.from_raw(
247
- type: 'local', url: config_dir)
248
- end
263
+ config.reset
264
+ config.load(path: config_file_path, reconfigure: reconfigure)
265
+ manifest.vcs =
266
+ if (raw_vcs = config.get('manifest_source', nil))
267
+ VCSDefinition.from_raw(raw_vcs)
268
+ else
269
+ VCSDefinition.from_raw(type: 'local', url: config_dir)
270
+ end
249
271
 
250
272
  if config.source_dir && Pathname.new(config.source_dir).absolute?
251
273
  raise ConfigError, 'source dir path configuration must be relative'
252
274
  end
253
275
 
254
- os_package_resolver.prefer_indep_over_os_packages = config.prefer_indep_over_os_packages?
255
- os_package_resolver.operating_system ||= config.get('operating_system', nil)
256
- os_repository_resolver.operating_system ||= config.get('operating_system', nil)
276
+ os_package_resolver.prefer_indep_over_os_packages =
277
+ config.prefer_indep_over_os_packages?
278
+ os_package_resolver.operating_system ||=
279
+ config.get('operating_system', nil)
280
+ os_repository_resolver.operating_system ||=
281
+ config.get('operating_system', nil)
257
282
  end
258
283
  @config
259
284
  end
@@ -271,7 +296,8 @@ def autodetect_operating_system(force: false)
271
296
  os_package_resolver.operating_system = [names, versions]
272
297
  os_repository_resolver.operating_system = [names, versions]
273
298
  Autobuild.progress :operating_system_autodetection,
274
- "operating system: #{(names - ['default']).join(",")} - #{(versions - ['default']).join(",")}"
299
+ "operating system: #{(names - ['default']).join(',')} -"\
300
+ " #{(versions - ['default']).join(',')}"
275
301
  ensure
276
302
  Autobuild.progress_done :operating_system_autodetection
277
303
  end
@@ -289,9 +315,7 @@ def supported_operating_system?
289
315
 
290
316
  def setup_os_package_installer
291
317
  autodetect_operating_system
292
- os_package_installer.each_manager do |pkg_mng|
293
- pkg_mng.initialize_environment
294
- end
318
+ os_package_installer.each_manager(&:initialize_environment)
295
319
  os_package_resolver.load_default
296
320
  os_package_installer.define_osdeps_mode_option
297
321
  os_package_installer.osdeps_mode
@@ -318,9 +342,7 @@ def setup
318
342
  config.each_reused_autoproj_installation do |p|
319
343
  manifest.reuse(p)
320
344
  end
321
- if File.exist?(manifest_file_path)
322
- manifest.load(manifest_file_path)
323
- end
345
+ manifest.load(manifest_file_path) if File.exist?(manifest_file_path)
324
346
 
325
347
  Autobuild.prefix = prefix_dir
326
348
  FileUtils.mkdir_p File.join(prefix_dir, '.autoproj')
@@ -330,7 +352,7 @@ def setup
330
352
 
331
353
  Autobuild.srcdir = source_dir
332
354
  Autobuild.logdir = log_dir
333
- if cache_dir = config.importer_cache_dir
355
+ if (cache_dir = config.importer_cache_dir)
334
356
  Autobuild::Importer.default_cache_dirs = cache_dir
335
357
  end
336
358
  setup_os_package_installer
@@ -339,7 +361,7 @@ def setup
339
361
 
340
362
  def install_ruby_shims
341
363
  install_suffix = ""
342
- if match = /ruby(.*)$/.match(RbConfig::CONFIG['RUBY_INSTALL_NAME'])
364
+ if (match = /ruby(.*)$/.match(RbConfig::CONFIG['RUBY_INSTALL_NAME']))
343
365
  install_suffix = match[1]
344
366
  end
345
367
 
@@ -351,9 +373,9 @@ def install_ruby_shims
351
373
  io.puts "#! /bin/sh"
352
374
  io.puts "exec #{config.ruby_executable} \"$@\""
353
375
  end
354
- FileUtils.chmod 0755, File.join(bindir, 'ruby')
376
+ FileUtils.chmod 0o755, File.join(bindir, 'ruby')
355
377
 
356
- ['gem', 'irb', 'testrb'].each do |name|
378
+ %w[gem irb testrb].each do |name|
357
379
  # Look for the corresponding gem program
358
380
  prg_name = "#{name}#{install_suffix}"
359
381
  if File.file?(prg_path = File.join(RbConfig::CONFIG['bindir'], prg_name))
@@ -361,7 +383,7 @@ def install_ruby_shims
361
383
  io.puts "#! #{config.ruby_executable}"
362
384
  io.puts "exec \"#{prg_path}\", *ARGV"
363
385
  end
364
- FileUtils.chmod 0755, File.join(bindir, name)
386
+ FileUtils.chmod 0o755, File.join(bindir, name)
365
387
  end
366
388
  end
367
389
  end
@@ -386,9 +408,7 @@ def update_autoproj(restart_on_update: true)
386
408
 
387
409
  # This is a guard to avoid infinite recursion in case the user is
388
410
  # running autoproj osdeps --force
389
- if ENV['AUTOPROJ_RESTARTING'] == '1'
390
- return
391
- end
411
+ return if ENV['AUTOPROJ_RESTARTING'] == '1'
392
412
 
393
413
  gemfile = File.join(dot_autoproj_dir, 'Gemfile')
394
414
  binstubs = File.join(dot_autoproj_dir, 'bin')
@@ -420,15 +440,16 @@ def update_autoproj(restart_on_update: true)
420
440
  config.save
421
441
  ENV['AUTOPROJ_RESTARTING'] = '1'
422
442
  require 'rbconfig'
423
- exec(config.ruby_executable, $0, *ARGV)
443
+ exec(config.ruby_executable, $PROGRAM_NAME, *ARGV)
424
444
  end
425
445
  end
426
446
 
427
447
  def run(*args, &block)
428
- if args.last.kind_of?(Hash)
429
- options = args.pop
430
- else options = Hash.new
431
- end
448
+ options =
449
+ if args.last.kind_of?(Hash)
450
+ args.pop
451
+ else Hash.new
452
+ end
432
453
  options_env = options.fetch(:env, Hash.new)
433
454
  options[:env] = env.resolved_env.merge(options_env)
434
455
  Autobuild::Subprocess.run(*args, options, &block)
@@ -438,7 +459,8 @@ def migrate_bundler_and_autoproj_gem_layout
438
459
  if !File.directory?(File.join(dot_autoproj_dir, 'autoproj'))
439
460
  return
440
461
  else
441
- config = YAML.load(File.read(File.join(dot_autoproj_dir, 'config.yml')))
462
+ config_path = File.join(dot_autoproj_dir, 'config.yml')
463
+ config = YAML.safe_load(File.read(config_path))
442
464
  return if config['gems_install_path']
443
465
  end
444
466
 
@@ -519,7 +541,7 @@ def self.find_user_cache_path(xdg_path, home_path = xdg_path)
519
541
  def self.registered_workspaces
520
542
  path = find_user_data_path('workspaces.yml')
521
543
  if File.file?(path)
522
- yaml = (YAML.load(File.read(path)) || [])
544
+ yaml = (YAML.safe_load(File.read(path)) || [])
523
545
  fields = RegisteredWorkspace.members.map(&:to_s)
524
546
  yaml.map do |h|
525
547
  values = h.values_at(*fields)
@@ -572,9 +594,7 @@ def load_package_sets(only_local: false,
572
594
  mainline: nil,
573
595
  reset: false,
574
596
  retry_count: nil)
575
- if !File.file?(manifest_file_path) # empty install, just return
576
- return
577
- end
597
+ return unless File.file?(manifest_file_path) # empty install, just return
578
598
 
579
599
  Ops::Configuration.new(self).
580
600
  load_package_sets(only_local: only_local,
@@ -585,7 +605,7 @@ def load_package_sets(only_local: false,
585
605
  mainline: mainline)
586
606
  end
587
607
 
588
- def load_packages(selection = manifest.default_packages(false), options = Hash.new)
608
+ def load_packages(selection = manifest.default_packages(false), options = {})
589
609
  options = Hash[warn_about_ignored_packages: true, checkout_only: true].
590
610
  merge(options)
591
611
  ops = Ops::Import.new(self)
@@ -602,7 +622,7 @@ def setup_all_package_directories
602
622
  manifest.reused_installations.each do |imported_manifest|
603
623
  imported_manifest.each do |imported_pkg|
604
624
  imported_packages << imported_pkg.name
605
- if pkg = manifest.find_package_definition(imported_pkg.name)
625
+ if (pkg = manifest.find_package_definition(imported_pkg.name))
606
626
  pkg.autobuild.srcdir = imported_pkg.srcdir
607
627
  pkg.autobuild.prefix = imported_pkg.prefix
608
628
  end
@@ -612,6 +632,7 @@ def setup_all_package_directories
612
632
  manifest.each_package_definition do |pkg_def|
613
633
  pkg = pkg_def.autobuild
614
634
  next if imported_packages.include?(pkg_def.name)
635
+
615
636
  setup_package_directories(pkg)
616
637
  end
617
638
  end
@@ -626,7 +647,7 @@ def setup_package_directories(pkg)
626
647
  end
627
648
 
628
649
  srcdir =
629
- if target = manifest.moved_packages[pkg_name]
650
+ if (target = manifest.moved_packages[pkg_name])
630
651
  File.join(layout, target)
631
652
  else
632
653
  File.join(layout, pkg_name)
@@ -641,9 +662,7 @@ def setup_package_directories(pkg)
641
662
 
642
663
  pkg = manifest.find_autobuild_package(pkg_name)
643
664
  pkg.srcdir = File.join(source_dir, srcdir)
644
- if pkg.respond_to?(:builddir)
645
- pkg.builddir = compute_builddir(pkg)
646
- end
665
+ pkg.builddir = compute_builddir(pkg) if pkg.respond_to?(:builddir)
647
666
 
648
667
  pkg.prefix = File.join(prefix_dir, prefixdir)
649
668
  pkg.doc_target_dir = File.join(prefix_dir, 'doc', pkg_name)
@@ -682,7 +701,7 @@ def finalize_package_setup
682
701
  end
683
702
 
684
703
  main_package_set = manifest.main_package_set
685
- Dir.glob(File.join( overrides_dir, "*.rb" ) ).sort.each do |file|
704
+ Dir.glob(File.join(overrides_dir, "*.rb")).sort.each do |file|
686
705
  load main_package_set, file
687
706
  end
688
707
  end
@@ -693,9 +712,7 @@ def finalize_package_setup
693
712
  # have been properly set up (a.k.a. after package import)
694
713
  def finalize_setup
695
714
  # Finally, disable all ignored packages on the autobuild side
696
- manifest.each_ignored_package do |pkg|
697
- pkg.disable
698
- end
715
+ manifest.each_ignored_package(&:disable)
699
716
 
700
717
  # We now have processed the process setup blocks. All configuration
701
718
  # should be done and we can save the configuration data.
@@ -719,6 +736,7 @@ def export_installation_manifest
719
736
  # Update the new entries
720
737
  manifest.each_package_set do |pkg_set|
721
738
  next if pkg_set.main?
739
+
722
740
  install_manifest.add_package_set(pkg_set)
723
741
  end
724
742
  selected_packages.each do |pkg_name|
@@ -741,14 +759,14 @@ def full_env
741
759
  # Export the workspace's env.sh file
742
760
  #
743
761
  # @return [Boolean] true if the environment has been changed, false otherwise
744
- def export_env_sh(package_names = nil, shell_helpers: true)
762
+ def export_env_sh(_package_names = nil, shell_helpers: true)
745
763
  full_env = self.full_env
746
764
  changed = save_cached_env(full_env)
747
765
  full_env.export_env_sh(shell_helpers: shell_helpers)
748
766
  changed
749
767
  end
750
768
 
751
- def save_cached_env(env = self.full_env)
769
+ def save_cached_env(env = full_env)
752
770
  Ops.save_cached_env(root_dir, env)
753
771
  end
754
772
 
@@ -801,7 +819,8 @@ def install_os_repositories
801
819
  # @param [Proc,nil] block a setup block that should be called to
802
820
  # configure the package
803
821
  # @return [PackageDefinition]
804
- def define_package(package_type, package_name, block = nil, package_set = manifest.main_package_set, file = nil)
822
+ def define_package(package_type, package_name, block = nil,
823
+ package_set = manifest.main_package_set, file = nil)
805
824
  autobuild_package = Autobuild.send(package_type, package_name)
806
825
  register_package(autobuild_package, block, package_set, file)
807
826
  end
@@ -816,7 +835,8 @@ def define_package(package_type, package_name, block = nil, package_set = manife
816
835
  # @param [Proc,nil] block a setup block that should be called to
817
836
  # configure the package
818
837
  # @return [PackageDefinition]
819
- def register_package(package, block = nil, package_set = manifest.main_package_set, file = nil)
838
+ def register_package(package, block = nil,
839
+ package_set = manifest.main_package_set, file = nil)
820
840
  pkg = manifest.register_package(package, block, package_set, file)
821
841
  pkg.autobuild.ws = self
822
842
  pkg
@@ -834,7 +854,7 @@ def register_package(package, block = nil, package_set = manifest.main_package_s
834
854
  # @return [String] the resolved program
835
855
  # @raise [ExecutableNotFound] if an executable file named `cmd` cannot
836
856
  # be found
837
- def which(cmd, path_entries: nil)
857
+ def which(cmd, _path_entries: nil)
838
858
  Ops.which(cmd, path_entries: -> { full_env.value('PATH') || Array.new })
839
859
  end
840
860
  end
@@ -845,9 +865,7 @@ def self.workspace
845
865
 
846
866
  def self.workspace=(ws)
847
867
  @workspace = ws
848
- if ws
849
- self.root_dir = ws.root_dir
850
- end
868
+ self.root_dir = ws&.root_dir
851
869
  end
852
870
 
853
871
  def self.env
@@ -61,6 +61,7 @@ __amake() {
61
61
  --no-tool
62
62
  --confirm
63
63
  --no-confirm
64
+ --not
64
65
  "
65
66
 
66
67
  case "$cur" in
@@ -20,6 +20,7 @@ __amake() {
20
20
  {--auto-exclude,--no-auto-exclude}'[if true, packages that fail to import will be excluded from the build]' \
21
21
  {--tool,--no-tool}'[act as a build tool, transparently passing the subcommand''s outputs to STDOUT]' \
22
22
  {--confirm,--no-confirm}'[--force and --rebuild will ask confirmation if applied to the whole workspace. Use --no-confirm to disable this confirmation]' \
23
+ --not'[do not build the packages listed]' \
23
24
  '*:arg:_autoproj_installed_packages'
24
25
  }
25
26
 
@@ -666,6 +666,7 @@ __autoproj_build() {
666
666
  --no-tool
667
667
  --confirm
668
668
  --no-confirm
669
+ --not
669
670
  "
670
671
 
671
672
  case "$cur" in
@@ -1061,6 +1062,7 @@ __autoproj_versions() {
1061
1062
  --local
1062
1063
  --no-local
1063
1064
  --save
1065
+ --fingerprint
1064
1066
  "
1065
1067
 
1066
1068
  case "$cur" in
@@ -471,6 +471,7 @@ __autoproj_build() {
471
471
  {--auto-exclude,--no-auto-exclude}'[if true, packages that fail to import will be excluded from the build]' \
472
472
  {--tool,--no-tool}'[act as a build tool, transparently passing the subcommand''s outputs to STDOUT]' \
473
473
  {--confirm,--no-confirm}'[--force and --rebuild will ask confirmation if applied to the whole workspace. Use --no-confirm to disable this confirmation]' \
474
+ --not'[do not build the packages listed]' \
474
475
  '*:arg:_autoproj_installed_packages'
475
476
  }
476
477
 
@@ -697,6 +698,7 @@ __autoproj_versions() {
697
698
  {--deps,--no-deps}'[whether both packages and their dependencies should be versioned, or only the selected packages (the latter is the default)]' \
698
699
  {--local,--no-local}'[whether we should access the remote server to verify that the snapshotted state is present]' \
699
700
  --save'[save to the given file instead of displaying it on the standard output]' \
701
+ --fingerprint'[calculate unique fingerprint for each package]' \
700
702
  '*:arg:_autoproj_installed_packages'
701
703
  }
702
704