autoproj 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -3
  3. data/.vscode/launch.json +25 -0
  4. data/Gemfile +10 -3
  5. data/autoproj.gemspec +1 -1
  6. data/bin/autoproj_bootstrap +5 -3
  7. data/bin/autoproj_bootstrap.in +5 -3
  8. data/bin/autoproj_install +2 -2
  9. data/bin/autoproj_install.in +2 -2
  10. data/lib/autoproj.rb +3 -1
  11. data/lib/autoproj/build_option.rb +4 -4
  12. data/lib/autoproj/cli.rb +10 -1
  13. data/lib/autoproj/cli/base.rb +14 -4
  14. data/lib/autoproj/cli/bootstrap.rb +2 -2
  15. data/lib/autoproj/cli/cache.rb +4 -10
  16. data/lib/autoproj/cli/clean.rb +1 -1
  17. data/lib/autoproj/cli/commit.rb +1 -1
  18. data/lib/autoproj/cli/exec.rb +11 -5
  19. data/lib/autoproj/cli/locate.rb +12 -12
  20. data/lib/autoproj/cli/log.rb +1 -2
  21. data/lib/autoproj/cli/main.rb +23 -4
  22. data/lib/autoproj/cli/main_plugin.rb +2 -2
  23. data/lib/autoproj/cli/manifest.rb +6 -3
  24. data/lib/autoproj/cli/query.rb +71 -10
  25. data/lib/autoproj/cli/reset.rb +4 -4
  26. data/lib/autoproj/cli/switch_config.rb +2 -2
  27. data/lib/autoproj/cli/tag.rb +2 -2
  28. data/lib/autoproj/cli/update.rb +2 -0
  29. data/lib/autoproj/cli/which.rb +17 -0
  30. data/lib/autoproj/exceptions.rb +9 -4
  31. data/lib/autoproj/git_server_configuration.rb +80 -53
  32. data/lib/autoproj/manifest.rb +1 -1
  33. data/lib/autoproj/ops/cache.rb +21 -10
  34. data/lib/autoproj/ops/main_config_switcher.rb +6 -9
  35. data/lib/autoproj/os_package_query.rb +99 -0
  36. data/lib/autoproj/package_managers/bundler_manager.rb +8 -1
  37. data/lib/autoproj/package_managers/yum_manager.rb +2 -2
  38. data/lib/autoproj/package_managers/zypper_manager.rb +2 -2
  39. data/lib/autoproj/query_base.rb +128 -0
  40. data/lib/autoproj/reporter.rb +12 -0
  41. data/lib/autoproj/{query.rb → source_package_query.rb} +15 -81
  42. data/lib/autoproj/version.rb +1 -1
  43. data/lib/autoproj/workspace.rb +38 -0
  44. metadata +8 -5
  45. data/lib/autoproj/cli/snapshot.rb +0 -66
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: edb94a99f41c2bd7fa5cd1787e3717a5ace88746
4
- data.tar.gz: c1663aaa8f9cb260cfa34bff60f140dc9f14952b
3
+ metadata.gz: 99c12d40c6ed5bf39360d3f3e39b3a602841f5f8
4
+ data.tar.gz: c2f379b779b1f5ba68ec9a3b00add4e90142fdfc
5
5
  SHA512:
6
- metadata.gz: 90fda7a5cdf528fe0b9204735d11a493e7f6f73ed1a211140ab5561a1c99642c0fb6a2ac35ca035bfb329fd5595f86d70f723c55f17983582821cbb5dcc61061
7
- data.tar.gz: 178ca221ace71d37b099b41ceab29f8e0ad40f4c7931eaedaecd5df465469a2f7a807017175f7c851f672f8edd4e04bcae6d857838bf9fd1763d2179ba7bc871
6
+ metadata.gz: db6011b85a68c112ce7fa950c8c33dbf3a7229d3538d23fdf0093d72b3d74fe593cbe4d68c434a7231d937e21852a7ceb985f3dbacaa451db55c89e87a4c58fe
7
+ data.tar.gz: 3197a556775041572721f3a9bb4e6c84bf058deee78b5bc0f8a031e32d8ab5b87dc723a30991779cb85e41cea9bc404460367ea8062ffa39d077563fdc5f7055
data/.travis.yml CHANGED
@@ -1,14 +1,15 @@
1
1
  sudo: true
2
2
  language: ruby
3
3
  rvm:
4
- - '2.0'
5
4
  - 2.1.10
6
5
  - 2.2.5
7
6
  - 2.3.1
8
- - jruby-9.1.5.0
7
+ - 2.4.1
8
+ - 2.5.0
9
+ - jruby-9.1.15.0
9
10
  matrix:
10
11
  allow_failures:
11
- - rvm: jruby-9.1.5.0
12
+ - rvm: jruby-9.1.15.0
12
13
 
13
14
  cache: bundler
14
15
 
@@ -0,0 +1,25 @@
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+ {
8
+ "name": "Minitest - all",
9
+ "type": "Ruby",
10
+ "request": "launch",
11
+ "useBundler": true,
12
+ "cwd": "${workspaceRoot}",
13
+ "program": "/usr/bin/rake",
14
+ "args": ["test"]
15
+ },
16
+ {
17
+ "name": "Minitest - active tasks only",
18
+ "type": "Ruby",
19
+ "request": "launch",
20
+ "useBundler": true,
21
+ "cwd": "${workspaceRoot}",
22
+ "program": "${file}"
23
+ }
24
+ ]
25
+ }
data/Gemfile CHANGED
@@ -1,6 +1,13 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'pry'
4
- gem 'pry-byebug'
5
- gem 'autobuild', github: 'rock-core/autobuild', branch: 'master'
3
+ gem 'autobuild', git: 'https://github.com/rock-core/autobuild', branch: 'master'
4
+
5
+ group :vscode do
6
+ gem 'pry'
7
+ gem 'pry-byebug'
8
+ gem 'rubocop', '>= 0.6.0'
9
+ gem 'ruby-debug-ide', '>= 0.6.0'
10
+ gem 'debase', '>= 0.2.2.beta10'
11
+ gem 'solargraph'
12
+ end
6
13
  gemspec
data/autoproj.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.homepage = "http://rock-robotics.org"
16
16
  s.licenses = ["BSD"]
17
17
 
18
- s.required_ruby_version = ">= 2.0.0"
18
+ s.required_ruby_version = '>= 2.1.0'
19
19
  s.bindir = 'bin'
20
20
  s.executables = ['autoproj', 'aup', 'amake', 'alocate', 'alog']
21
21
  s.require_paths = ["lib"]
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
2
 
3
- if RUBY_VERSION < "2.0.0"
4
- STDERR.puts "autoproj requires Ruby >= 2.0.0"
3
+ if RUBY_VERSION < "2.1.0"
4
+ STDERR.puts "autoproj requires Ruby >= 2.1.0"
5
5
  exit 1
6
6
  elsif ENV['AUTOPROJ_CURRENT_ROOT'] && (ENV['AUTOPROJ_CURRENT_ROOT'] != Dir.pwd)
7
7
  STDERR.puts "it seems that you've already loaded an env.sh script in this console, open a new console and try again"
@@ -609,5 +609,7 @@ ops.stage1
609
609
  if !ops.skip_stage2?
610
610
  ops.call_stage2
611
611
  end
612
- ops.run_autoproj 'bootstrap', *bootstrap_options
612
+ if !ops.run_autoproj 'bootstrap', *bootstrap_options
613
+ exit 1
614
+ end
613
615
 
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
2
 
3
- if RUBY_VERSION < "2.0.0"
4
- STDERR.puts "autoproj requires Ruby >= 2.0.0"
3
+ if RUBY_VERSION < "2.1.0"
4
+ STDERR.puts "autoproj requires Ruby >= 2.1.0"
5
5
  exit 1
6
6
  elsif ENV['AUTOPROJ_CURRENT_ROOT'] && (ENV['AUTOPROJ_CURRENT_ROOT'] != Dir.pwd)
7
7
  STDERR.puts "it seems that you've already loaded an env.sh script in this console, open a new console and try again"
@@ -18,5 +18,7 @@ ops.stage1
18
18
  if !ops.skip_stage2?
19
19
  ops.call_stage2
20
20
  end
21
- ops.run_autoproj 'bootstrap', *bootstrap_options
21
+ if !ops.run_autoproj 'bootstrap', *bootstrap_options
22
+ exit 1
23
+ end
22
24
 
data/bin/autoproj_install CHANGED
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
2
 
3
- if RUBY_VERSION < "2.0.0"
4
- STDERR.puts "autoproj requires Ruby >= 2.0.0"
3
+ if RUBY_VERSION < "2.1.0"
4
+ STDERR.puts "autoproj requires Ruby >= 2.1.0"
5
5
  exit 1
6
6
  elsif ENV['AUTOPROJ_CURRENT_ROOT'] && (ENV['AUTOPROJ_CURRENT_ROOT'] != Dir.pwd)
7
7
  STDERR.puts "it seems that you've already loaded an env.sh script in this console, open a new console and try again"
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/ruby
2
2
 
3
- if RUBY_VERSION < "2.0.0"
4
- STDERR.puts "autoproj requires Ruby >= 2.0.0"
3
+ if RUBY_VERSION < "2.1.0"
4
+ STDERR.puts "autoproj requires Ruby >= 2.1.0"
5
5
  exit 1
6
6
  elsif ENV['AUTOPROJ_CURRENT_ROOT'] && (ENV['AUTOPROJ_CURRENT_ROOT'] != Dir.pwd)
7
7
  STDERR.puts "it seems that you've already loaded an env.sh script in this console, open a new console and try again"
data/lib/autoproj.rb CHANGED
@@ -31,7 +31,9 @@
31
31
  require 'autoproj/ops/import'
32
32
  # Required for auto-saving in import_packages
33
33
  require 'autoproj/ops/snapshot'
34
- require 'autoproj/query'
34
+ require 'autoproj/query_base'
35
+ require 'autoproj/source_package_query'
36
+ require 'autoproj/os_package_query'
35
37
 
36
38
  require 'autoproj/ops/tools'
37
39
  require 'autoproj/ops/loader'
@@ -47,10 +47,10 @@ def doc
47
47
 
48
48
  def ask(current_value, doc = nil)
49
49
  default_value =
50
- if !current_value.nil? then current_value.to_s
51
- elsif options[:default] then options[:default].to_str
52
- else ''
53
- end
50
+ if !current_value.nil? then current_value.to_s
51
+ elsif options[:default] then options[:default].to_str
52
+ else ''
53
+ end
54
54
 
55
55
  STDOUT.print " #{doc || self.doc} [#{default_value}] "
56
56
  STDOUT.flush
data/lib/autoproj/cli.rb CHANGED
@@ -1,6 +1,15 @@
1
1
  module Autoproj
2
2
  module CLI
3
- class InvalidArguments < Exception
3
+ class CLIException < RuntimeError
4
+ def fatal?
5
+ true
6
+ end
7
+ end
8
+ class CLIInvalidArguments < CLIException
9
+ end
10
+ class CLIAmbiguousArguments < CLIException
11
+ end
12
+ class CLIInvalidSelection < CLIException
4
13
  end
5
14
 
6
15
  def self.load_plugins
@@ -1,6 +1,7 @@
1
1
  require 'tty/color'
2
2
  require 'autoproj'
3
3
  require 'autoproj/autobuild'
4
+ require 'autoproj/cli'
4
5
 
5
6
  module Autoproj
6
7
  module CLI
@@ -57,7 +58,11 @@ def normalize_command_line_package_selection(selection)
57
58
  # resolved
58
59
  def resolve_user_selection(selected_packages, **options)
59
60
  if selected_packages.empty?
60
- selection = ws.manifest.default_packages
61
+ selection =
62
+ begin ws.manifest.default_packages
63
+ rescue ExcludedSelection => e
64
+ raise CLIInvalidSelection, e.message, e.backtrace
65
+ end
61
66
  if Autoproj.verbose
62
67
  Autoproj.message "selected packages: #{selection.each_package_name.to_a.sort.join(", ")}"
63
68
  end
@@ -65,8 +70,11 @@ def resolve_user_selection(selected_packages, **options)
65
70
  end
66
71
  selected_packages = selected_packages.to_set
67
72
 
68
- selected_packages, nonresolved = ws.manifest.
69
- expand_package_selection(selected_packages, **options)
73
+ selected_packages, nonresolved =
74
+ begin ws.manifest.expand_package_selection(selected_packages, **options)
75
+ rescue ExcludedSelection => e
76
+ raise CLIInvalidSelection, e.message, e.backtrace
77
+ end
70
78
 
71
79
  # Try to auto-add stuff if nonresolved
72
80
  nonresolved.delete_if do |sel|
@@ -144,6 +152,8 @@ def resolve_selection(user_selection, checkout_only: true, only_local: false, re
144
152
  auto_exclude: auto_exclude)
145
153
 
146
154
  return source_packages, osdep_packages, resolved_selection
155
+ rescue ExcludedSelection => e
156
+ raise CLIInvalidSelection, e.message, e.backtrace
147
157
  end
148
158
 
149
159
  def validate_user_selection(user_selection, resolved_selection)
@@ -151,7 +161,7 @@ def validate_user_selection(user_selection, resolved_selection)
151
161
  !resolved_selection.has_match_for?(pkg_name)
152
162
  end
153
163
  if !not_matched.empty?
154
- raise ConfigError.new, "autoproj: wrong package selection on command line, cannot find a match for #{not_matched.to_a.sort.join(", ")}"
164
+ raise CLIInvalidArguments, "autoproj: wrong package selection on command line, cannot find a match for #{not_matched.to_a.sort.join(", ")}"
155
165
  end
156
166
  end
157
167
 
@@ -12,7 +12,7 @@ class Bootstrap
12
12
 
13
13
  def initialize(root_dir = Dir.pwd)
14
14
  if File.exist?(File.join(root_dir, 'autoproj', "manifest"))
15
- raise ConfigError, "this installation is already bootstrapped. Remove the autoproj directory if it is not the case"
15
+ raise CLIException, "this installation is already bootstrapped. Remove the autoproj directory if it is not the case"
16
16
  end
17
17
  @root_dir = root_dir
18
18
  end
@@ -26,7 +26,7 @@ def validate_options(args, options)
26
26
 
27
27
  path = File.expand_path(path)
28
28
  if !File.directory?(path) || !File.directory?(File.join(path, 'autoproj'))
29
- raise ArgumentError, "#{path} does not look like an autoproj installation"
29
+ raise CLIInvalidArguments, "#{path} does not look like an autoproj installation"
30
30
  end
31
31
  options[:reuse] = [path]
32
32
  end
@@ -10,27 +10,21 @@ def validate_options(argv, options = Hash.new)
10
10
  if argv.empty?
11
11
  default_cache_dirs = Autobuild::Importer.default_cache_dirs
12
12
  if !default_cache_dirs || default_cache_dirs.empty?
13
- raise ArgumentError, "no cache directory defined with e.g. the AUTOBUILD_CACHE_DIR environment variable, expected one cache directory as argument"
13
+ raise CLIInvalidArguments, "no cache directory defined with e.g. the AUTOBUILD_CACHE_DIR environment variable, expected one cache directory as argument"
14
14
  end
15
15
  Autoproj.warn "using cache directory #{default_cache_dirs.first} from the autoproj configuration"
16
16
  argv << default_cache_dirs.first
17
- elsif argv.size > 1
18
- raise ArgumentError, "expected only one cache directory as argument"
19
17
  end
20
18
 
21
- return File.expand_path(argv.first, ws.root_dir), options
19
+ return File.expand_path(argv.first, ws.root_dir), *argv[1..-1], options
22
20
  end
23
21
 
24
- def run(cache_dir, options = Hash.new)
25
- options = Kernel.validate_options options,
26
- keep_going: false,
27
- checkout_only: false
28
-
22
+ def run(cache_dir, *package_names, all: true, keep_going: false, checkout_only: false)
29
23
  initialize_and_load
30
24
  finalize_setup
31
25
 
32
26
  cache_op = Autoproj::Ops::Cache.new(cache_dir, ws.manifest)
33
- cache_op.create_or_update(options)
27
+ cache_op.create_or_update(*package_names, all: all, keep_going: keep_going, checkout_only: checkout_only)
34
28
  end
35
29
  end
36
30
  end
@@ -29,7 +29,7 @@ def run(selection, options = Hash.new)
29
29
  packages,
30
30
  recursive: deps)
31
31
  if source_packages.empty?
32
- raise ArgumentError, "no packages or OS packages match #{selection.join(" ")}"
32
+ raise CLIInvalidArguments, "no packages or OS packages match #{selection.join(" ")}"
33
33
  end
34
34
 
35
35
  source_packages.each do |pkg_name|
@@ -9,7 +9,7 @@ def run(*user_selection, options = Hash.new)
9
9
  pkg = manifest.main_package_set.create_autobuild_package
10
10
  importer = pkg.importer
11
11
  if !importer || !importer.kind_of?(Autobuild::Git)
12
- raise ConfigError, "cannot use autoproj tag if the main configuration is not managed by git"
12
+ raise CLIInvalidArguments, "cannot use autoproj tag if the main configuration is not managed by git"
13
13
  end
14
14
 
15
15
  versions_file = File.join(
@@ -6,12 +6,18 @@ def run(cmd, *args)
6
6
  initialize_and_load
7
7
  finalize_setup(Array.new)
8
8
 
9
- # Resolve the command using the PATH if present
10
- env = ws.full_env
11
- if !File.file?(cmd)
12
- cmd = env.find_in_path(cmd) || cmd
9
+ program =
10
+ begin ws.which(cmd)
11
+ rescue ::Exception => e
12
+ raise CLIInvalidArguments, e.message, e.backtrace
13
+ end
14
+ env = ws.full_env.resolved_env
15
+
16
+ begin
17
+ ::Process.exec(env, program, *args)
18
+ rescue ::Exception => e
19
+ raise CLIInvalidArguments, e.message, e.backtrace
13
20
  end
14
- exec(env.resolved_env, cmd, *args)
15
21
  end
16
22
  end
17
23
  end
@@ -9,11 +9,11 @@ module CLI
9
9
  # list that information and thus avoid loading the Autoproj
10
10
  # configuration (which takes fairly long).
11
11
  class Locate < InspectionTool
12
- class NotFound < RuntimeError; end
13
- class AmbiguousSelection < RuntimeError; end
14
-
15
12
  attr_reader :packages
16
13
  attr_reader :package_sets
14
+
15
+ class NotFound < CLIException; end
16
+ class NoSuchDir < CLIException; end
17
17
 
18
18
  # Create the locate CLI interface
19
19
  #
@@ -167,7 +167,7 @@ def run(selections, cache: !!packages, mode: :source_dir, log: nil)
167
167
  # Resolve the package that matches a given selection
168
168
  #
169
169
  # @return [PackageDefinition]
170
- # @raise [NotFound] if nothing matches
170
+ # @raise [CLIInvalidArguments] if nothing matches
171
171
  # @raise [AmbiguousSelection] if the selection is ambiguous
172
172
  def resolve_package(selection)
173
173
  matching_packages = find_packages(selection)
@@ -185,9 +185,9 @@ def resolve_package(selection)
185
185
  end
186
186
 
187
187
  if matching_packages.empty?
188
- raise NotFound, "cannot find '#{selection}' in the current autoproj installation"
188
+ raise CLIInvalidArguments, "cannot find '#{selection}' in the current autoproj installation"
189
189
  elsif matching_packages.size > 1
190
- raise AmbiguousSelection, "multiple packages match '#{selection}' in the current autoproj installation: #{matching_packages.map(&:name).sort.join(", ")}"
190
+ raise CLIAmbiguousArguments, "multiple packages match '#{selection}' in the current autoproj installation: #{matching_packages.map(&:name).sort.join(", ")}"
191
191
  else
192
192
  return matching_packages.first
193
193
  end
@@ -212,12 +212,12 @@ def source_dir_of(selection)
212
212
 
213
213
  # Returns the prefix directory for a given selection
214
214
  #
215
- # @raise [ArgumentError] if the selection points to a package set
215
+ # @raise [NoSuchDir] if the selection points to a package set
216
216
  def prefix_dir_of(selection)
217
217
  if workspace_dir?(selection)
218
218
  ws.prefix_dir
219
219
  elsif find_package_set(selection)
220
- raise ArgumentError, "#{selection} is a package set, and package sets do not have prefixes"
220
+ raise NoSuchDir, "#{selection} is a package set, and package sets do not have prefixes"
221
221
  else
222
222
  resolve_package(selection).prefix
223
223
  end
@@ -225,19 +225,19 @@ def prefix_dir_of(selection)
225
225
 
226
226
  # Returns the build directory for a given selection
227
227
  #
228
- # @raise [ArgumentError] if the selection points to a package set,
228
+ # @raise [NoSuchDir] if the selection points to a package set,
229
229
  # or to a package that has no build directory
230
230
  def build_dir_of(selection)
231
231
  if workspace_dir?(selection)
232
- raise ArgumentError, "#{selection} points to the workspace itself, which has no build dir"
232
+ raise NoSuchDir, "#{selection} points to the workspace itself, which has no build dir"
233
233
  elsif find_package_set(selection)
234
- raise ArgumentError, "#{selection} is a package set, and package sets do not have build directories"
234
+ raise NoSuchDir, "#{selection} is a package set, and package sets do not have build directories"
235
235
  else
236
236
  pkg = resolve_package(selection)
237
237
  if pkg.respond_to?(:builddir) && pkg.builddir
238
238
  pkg.builddir
239
239
  else
240
- raise ArgumentError, "#{selection} resolves to the package #{pkg.name}, which does not have a build directory"
240
+ raise NoSuchDir, "#{selection} resolves to the package #{pkg.name}, which does not have a build directory"
241
241
  end
242
242
  end
243
243
  end
@@ -4,7 +4,6 @@ module Autoproj
4
4
  module CLI
5
5
  class Log < Base
6
6
  def run(args, options = Hash.new)
7
- ws = Workspace.from_environment
8
7
  ws.load_config
9
8
 
10
9
  if !ws.config.import_log_enabled?
@@ -34,7 +33,7 @@ def parse_log_entry(entry)
34
33
  elsif entry =~ /^\d+$/
35
34
  "autoproj@{#{entry}}"
36
35
  else
37
- raise ArgumentError, "unexpected revision name '#{entry}', expected either autoproj@{ID} or ID ('ID' being a number). Run 'autoproj log' without arguments for a list of known entries"
36
+ raise CLIInvalidArguments, "unexpected revision name '#{entry}', expected either autoproj@{ID} or ID ('ID' being a number). Run 'autoproj log' without arguments for a list of known entries"
38
37
  end
39
38
  end
40
39
  end
@@ -22,7 +22,18 @@ class Main < Thor
22
22
  class_option :progress, type: :boolean, default: TTY::Color.color?,
23
23
  desc: 'enables or disables progress display (enabled by default if the terminal supports it)'
24
24
 
25
+ stop_on_unknown_option! :exec
26
+ check_unknown_options! except: :exec
27
+
25
28
  no_commands do
29
+ def default_report_on_package_failures
30
+ if options[:debug]
31
+ :raise
32
+ else
33
+ :exit
34
+ end
35
+ end
36
+
26
37
  def run_autoproj_cli(filename, classname, report_options, *args, **extra_options)
27
38
  require "autoproj/cli/#{filename}"
28
39
  if Autobuild::Subprocess.transparent_mode = options[:tool]
@@ -139,7 +150,7 @@ def doc(*packages)
139
150
  option :auto_exclude, type: :boolean,
140
151
  desc: 'if true, packages that fail to import will be excluded from the build'
141
152
  def update(*packages)
142
- report_options = Hash[silent: false, on_package_failures: :exit]
153
+ report_options = Hash[silent: false, on_package_failures: default_report_on_package_failures]
143
154
  if options[:auto_exclude]
144
155
  report_options[:on_package_failures] = :report
145
156
  end
@@ -179,7 +190,7 @@ def update(*packages)
179
190
  option :confirm, type: :boolean, default: nil,
180
191
  desc: '--force and --rebuild will ask confirmation if applied to the whole workspace. Use --no-confirm to disable this confirmation'
181
192
  def build(*packages)
182
- report_options = Hash[silent: false, on_package_failures: :exit]
193
+ report_options = Hash[silent: false, on_package_failures: default_report_on_package_failures]
183
194
  if options[:auto_exclude]
184
195
  report_options[:on_package_failures] = :report
185
196
  end
@@ -192,8 +203,10 @@ def build(*packages)
192
203
  desc: 'do not stop on errors'
193
204
  option :checkout_only, aliases: :c, type: :boolean, default: false,
194
205
  desc: "only checkout packages, do not update already-cached ones"
195
- def cache(*cache_dir)
196
- run_autoproj_cli(:cache, :Cache, Hash[], *cache_dir)
206
+ option :all, type: :boolean, default: true,
207
+ desc: "cache all defined packages (the default) or only the selected ones"
208
+ def cache(*args)
209
+ run_autoproj_cli(:cache, :Cache, Hash[], *args)
197
210
  end
198
211
 
199
212
  desc 'clean [PACKAGES]', 'remove build byproducts for the given packages'
@@ -444,6 +457,12 @@ def exec(*args)
444
457
  require 'autoproj/cli/exec'
445
458
  CLI::Exec.new.run(*args)
446
459
  end
460
+
461
+ desc 'which', "resolves the full path to a command within the Autoproj workspace"
462
+ def which(cmd)
463
+ require 'autoproj/cli/which'
464
+ CLI::Which.new.run(cmd)
465
+ end
447
466
  end
448
467
  end
449
468
  end