autoproj 2.10.1 → 2.13.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -8
  3. data/.travis.yml +5 -3
  4. data/autoproj.gemspec +7 -6
  5. data/bin/alog +1 -0
  6. data/bin/autoproj +1 -1
  7. data/bin/autoproj_bootstrap +149 -86
  8. data/bin/autoproj_bootstrap.in +9 -7
  9. data/bin/autoproj_install +148 -82
  10. data/bin/autoproj_install.in +8 -3
  11. data/lib/autoproj.rb +3 -0
  12. data/lib/autoproj/aruba_minitest.rb +15 -0
  13. data/lib/autoproj/autobuild_extensions/dsl.rb +61 -27
  14. data/lib/autoproj/base.rb +35 -6
  15. data/lib/autoproj/cli/base.rb +1 -1
  16. data/lib/autoproj/cli/build.rb +9 -3
  17. data/lib/autoproj/cli/cache.rb +79 -7
  18. data/lib/autoproj/cli/doc.rb +4 -18
  19. data/lib/autoproj/cli/inspection_tool.rb +5 -6
  20. data/lib/autoproj/cli/main.rb +41 -18
  21. data/lib/autoproj/cli/main_doc.rb +86 -0
  22. data/lib/autoproj/cli/main_plugin.rb +3 -0
  23. data/lib/autoproj/cli/main_test.rb +15 -0
  24. data/lib/autoproj/cli/show.rb +12 -18
  25. data/lib/autoproj/cli/status.rb +15 -9
  26. data/lib/autoproj/cli/test.rb +13 -84
  27. data/lib/autoproj/cli/update.rb +77 -19
  28. data/lib/autoproj/cli/utility.rb +136 -0
  29. data/lib/autoproj/configuration.rb +28 -4
  30. data/lib/autoproj/default.osdeps +18 -0
  31. data/lib/autoproj/installation_manifest.rb +7 -5
  32. data/lib/autoproj/manifest.rb +15 -21
  33. data/lib/autoproj/ops/build.rb +23 -27
  34. data/lib/autoproj/ops/cache.rb +151 -33
  35. data/lib/autoproj/ops/cached_env.rb +2 -2
  36. data/lib/autoproj/ops/import.rb +146 -80
  37. data/lib/autoproj/ops/install.rb +140 -79
  38. data/lib/autoproj/ops/phase_reporting.rb +49 -0
  39. data/lib/autoproj/ops/snapshot.rb +2 -1
  40. data/lib/autoproj/ops/tools.rb +2 -2
  41. data/lib/autoproj/os_package_installer.rb +19 -11
  42. data/lib/autoproj/package_definition.rb +29 -10
  43. data/lib/autoproj/package_managers/apt_dpkg_manager.rb +49 -28
  44. data/lib/autoproj/package_managers/bundler_manager.rb +257 -87
  45. data/lib/autoproj/package_managers/homebrew_manager.rb +2 -2
  46. data/lib/autoproj/package_managers/shell_script_manager.rb +44 -24
  47. data/lib/autoproj/package_manifest.rb +49 -34
  48. data/lib/autoproj/package_set.rb +48 -29
  49. data/lib/autoproj/repository_managers/apt.rb +0 -1
  50. data/lib/autoproj/test.rb +29 -10
  51. data/lib/autoproj/variable_expansion.rb +3 -1
  52. data/lib/autoproj/vcs_definition.rb +30 -15
  53. data/lib/autoproj/version.rb +1 -1
  54. data/lib/autoproj/workspace.rb +55 -13
  55. metadata +32 -28
@@ -25,6 +25,17 @@ def teardown
25
25
  super
26
26
  end
27
27
 
28
+ def generate_local_gemfile
29
+ path = expand_path("Gemfile.local")
30
+ File.open(path, 'w') do |io|
31
+ io.write <<~GEMFILE
32
+ source "https://rubygems.org"
33
+ gem "autoproj", path: "#{File.expand_path("../../", __dir__)}"
34
+ GEMFILE
35
+ end
36
+ path
37
+ end
38
+
28
39
  def run_command_and_stop(*args, fail_on_error: true, **kwargs)
29
40
  cmd = run_command(*args, **kwargs)
30
41
  cmd.stop
@@ -38,6 +49,10 @@ def run_command(*args, **kwargs)
38
49
  @aruba_api.run_command(*args, **kwargs)
39
50
  end
40
51
 
52
+ def cd(*args) # also defined by Rake
53
+ @aruba_api.cd(*args)
54
+ end
55
+
41
56
  def chmod(*args) # also defined by Rake
42
57
  @aruba_api.chmod(*args)
43
58
  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
 
@@ -149,11 +160,13 @@ def ignore(*paths)
149
160
 
150
161
  # Adds a new setup block to an existing package
151
162
  def setup_package(package_name, workspace: Autoproj.workspace, &block)
152
- raise ConfigError.new, "you must give a block to #setup_package" unless block
163
+ unless block
164
+ raise Autoproj::ConfigError.new, 'you must give a block to #setup_package'
165
+ end
153
166
 
154
167
  package_definition = workspace.manifest.find_package_definition(package_name)
155
168
  if !package_definition
156
- raise ConfigError.new, "#{package_name} is not a known package"
169
+ raise Autoproj::ConfigError.new, "#{package_name} is not a known package"
157
170
  elsif package_definition.autobuild.kind_of?(Autobuild::DummyPackage)
158
171
  # Nothing to do!
159
172
  else
@@ -185,10 +198,24 @@ def import_package(name, workspace: Autoproj.workspace, &block)
185
198
  def python_package(name, workspace: Autoproj.workspace)
186
199
  package_common(:python, name, workspace: workspace) do |pkg|
187
200
  pkg.internal_dependency 'python'
201
+ pkg.post_import do
202
+ pkg.depends_on 'python-setuptools' if pkg.install_mode?
203
+ end
188
204
  yield(pkg) if block_given?
189
205
  end
190
206
  end
191
207
 
208
+ def common_make_default_test_task(pkg)
209
+ unless pkg.test_utility.source_dir
210
+ test_dir = File.join(pkg.srcdir, 'test')
211
+ if File.directory?(test_dir)
212
+ pkg.test_utility.source_dir = File.join(pkg.builddir, 'test', 'results')
213
+ end
214
+ end
215
+
216
+ pkg.with_tests if pkg.test_utility.source_dir
217
+ end
218
+
192
219
  def common_make_based_package_setup(pkg)
193
220
  unless pkg.has_doc? && pkg.doc_dir
194
221
  pkg.with_doc do
@@ -198,14 +225,11 @@ def common_make_based_package_setup(pkg)
198
225
  end
199
226
 
200
227
  unless pkg.test_utility.has_task?
201
- unless pkg.test_utility.source_dir
202
- test_dir = File.join(pkg.srcdir, 'test')
203
- if File.directory?(test_dir)
204
- pkg.test_utility.source_dir = File.join(pkg.builddir, 'test', 'results')
205
- end
228
+ pkg.post_import do
229
+ common_make_default_test_task(pkg)
206
230
  end
207
-
208
- pkg.with_tests if pkg.test_utility.source_dir
231
+ # BACKWARD COMPATIBILITY ONLY. REMOVE FOR AUTOPROJ 3.0
232
+ common_make_default_test_task(pkg)
209
233
  end
210
234
  end
211
235
 
@@ -264,6 +288,18 @@ def env_add(name, value)
264
288
  Autoproj.env.add(name, value)
265
289
  end
266
290
 
291
+ def ruby_package_default_test_task(pkg)
292
+ unless pkg.test_utility.source_dir
293
+ test_dir = File.join(pkg.srcdir, 'test')
294
+ if File.directory?(test_dir)
295
+ pkg.test_utility.source_dir = File.join(pkg.srcdir, '.test-results')
296
+ FileUtils.mkdir_p pkg.test_utility.source_dir
297
+ end
298
+ end
299
+
300
+ pkg.with_tests if pkg.test_utility.source_dir
301
+ end
302
+
267
303
  # Defines a Ruby package
268
304
  #
269
305
  # Example:
@@ -284,15 +320,11 @@ def ruby_package(name, workspace: Autoproj.workspace)
284
320
  pkg.with_doc if !pkg.has_doc? && pkg.rake_doc_task
285
321
 
286
322
  unless pkg.test_utility.has_task?
287
- unless pkg.test_utility.source_dir
288
- test_dir = File.join(pkg.srcdir, 'test')
289
- if File.directory?(test_dir)
290
- pkg.test_utility.source_dir = File.join(pkg.srcdir, '.test-results')
291
- FileUtils.mkdir_p pkg.test_utility.source_dir
292
- end
323
+ pkg.post_import do
324
+ ruby_package_default_test_task(pkg)
293
325
  end
294
-
295
- pkg.with_tests if pkg.test_utility.source_dir
326
+ # BACKWARD COMPATIBILITY ONLY. REMOVE FOR AUTOPROJ 3.0
327
+ ruby_package_default_test_task(pkg)
296
328
  end
297
329
 
298
330
  yield(pkg) if block_given?
@@ -389,9 +421,9 @@ def source_package(options, workspace: Autoproj.workspace)
389
421
  end
390
422
 
391
423
  # @deprecated use Autoproj.config.declare instead
392
- def configuration_option(*opts, &block)
424
+ def configuration_option(*opts, **kw, &block)
393
425
  Autoproj.warn_deprecated __method__, "use Autoproj.config.declare instead"
394
- Autoproj.config.declare(*opts, &block)
426
+ Autoproj.config.declare(*opts, **kw, &block)
395
427
  end
396
428
 
397
429
  # @deprecated use Autoproj.config.get instead
@@ -469,11 +501,13 @@ def renamed_package(current_name, old_name, options)
469
501
  explicitely_selected_in_layout?(old_name)
470
502
  if options[:obsolete] && !explicit_selection
471
503
  import_package old_name
472
- Autoproj.workspace.manifest.exclude_package old_name,
504
+ Autoproj.workspace.manifest.exclude_package(
505
+ old_name,
473
506
  "#{old_name} has been renamed to #{current_name}, you still have "\
474
507
  "the option of using the old name by adding '- #{old_name}' explicitely "\
475
508
  "in the layout in autoproj/manifest, but be warned that the name will "\
476
509
  "stop being usable at all in the near future"
510
+ )
477
511
  else
478
512
  metapackage old_name, current_name
479
513
  end
@@ -6,12 +6,11 @@ module Autoproj
6
6
  else
7
7
  ArgumentError
8
8
  end
9
-
9
+
10
10
  # Yields, and if the given block raises a ConfigError with no file assigned,
11
11
  # add that file to both the object and the exception message
12
12
  def self.in_file(file, exception_t = ConfigError)
13
13
  yield
14
-
15
14
  rescue exception_t => e
16
15
  if exception_t != ConfigError
17
16
  raise ConfigError.new(file), "in #{file}: #{e.message}", e.backtrace
@@ -28,21 +27,51 @@ class << self
28
27
  attr_reader :post_import_blocks
29
28
  end
30
29
 
30
+ # Enumerate the post-import blocks registered for the given package
31
+ #
32
+ # @param [PackageDefinition] pkg
33
+ # @see post_import
31
34
  def self.each_post_import_block(pkg, &block)
35
+ # We use Autobuild packages as keys
36
+ pkg = pkg.autobuild if pkg.respond_to?(:autobuild)
37
+
32
38
  @post_import_blocks[nil].each(&block)
33
- if @post_import_blocks.has_key?(pkg)
34
- @post_import_blocks[pkg].each(&block)
35
- end
39
+ @post_import_blocks[pkg]&.each(&block)
36
40
  end
37
41
 
42
+ # Register a block that should be called after a set of package(s) have
43
+ # been imported
44
+ #
45
+ # @overload post_import(&block) register the block for all packages
46
+ # @overload post_import(*packages, &block)
47
+ # @param [Array<Autobuild::Package,PackageDefinition>] packages
38
48
  def self.post_import(*packages, &block)
39
49
  if packages.empty?
40
50
  @post_import_blocks[nil] << block
41
51
  else
42
52
  packages.each do |pkg|
53
+ # We use Autobuild packages as keys
54
+ pkg = pkg.autobuild if pkg.respond_to?(:autobuild)
43
55
  @post_import_blocks[pkg] << block
44
56
  end
45
57
  end
46
58
  end
47
- end
48
59
 
60
+ # Shim for a smooth upgrade path to bundler 2.1+
61
+ def self.bundler_unbundled_system(*args, **options)
62
+ if Bundler.respond_to?(:unbundled_system)
63
+ Bundler.unbundled_system(*args, **options)
64
+ else
65
+ Bundler.clean_system(*args, **options)
66
+ end
67
+ end
68
+
69
+ # Shim for a smooth upgrade path to bundler 2.1+
70
+ def self.bundler_with_unbundled_env(&block)
71
+ if Bundler.respond_to?(:with_unbundled_env)
72
+ Bundler.with_unbundled_env(&block)
73
+ else
74
+ Bundler.with_clean_env(&block)
75
+ end
76
+ end
77
+ 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,17 +18,20 @@ 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,
30
32
  ignore_errors: options[:keep_going],
31
33
  checkout_only: true,
34
+ report: false,
32
35
  **options)
33
36
 
34
37
  parallel = build_options[:parallel] || ws.config.parallel_build_level
@@ -40,6 +43,7 @@ def run(selected_packages, **options)
40
43
  # Disable all packages that are not selected
41
44
  ws.manifest.each_autobuild_package do |pkg|
42
45
  next if active_packages.include?(pkg.name)
46
+
43
47
  pkg.disable
44
48
  end
45
49
 
@@ -60,11 +64,13 @@ def run(selected_packages, **options)
60
64
  else 'force-build'
61
65
  end
62
66
  if build_options[:confirm] != false
63
- opt = BuildOption.new("", "boolean",
67
+ opt = BuildOption.new(
68
+ "", "boolean",
64
69
  {
65
70
  doc: "this is going to trigger a #{mode_name} "\
66
71
  "of all packages. Is that really what you want ?"
67
- }, nil)
72
+ }, nil
73
+ )
68
74
  raise Interrupt unless opt.ask(false)
69
75
  end
70
76
 
@@ -1,32 +1,104 @@
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
 
10
55
  if argv.empty?
11
56
  default_cache_dirs = Autobuild::Importer.default_cache_dirs
12
57
  if !default_cache_dirs || default_cache_dirs.empty?
13
- raise CLIInvalidArguments, "no cache directory defined with e.g. the AUTOBUILD_CACHE_DIR environment variable, expected one cache directory as argument"
58
+ raise CLIInvalidArguments,
59
+ "no cache directory defined with e.g. the "\
60
+ "AUTOBUILD_CACHE_DIR environment variable, "\
61
+ "expected one cache directory as argument"
14
62
  end
15
- Autoproj.warn "using cache directory #{default_cache_dirs.first} from the autoproj configuration"
63
+ Autoproj.warn "using cache directory #{default_cache_dirs.first} "\
64
+ "from the autoproj configuration"
16
65
  argv << default_cache_dirs.first
17
66
  end
18
67
 
19
- return File.expand_path(argv.first, ws.root_dir), *argv[1..-1], options
68
+ if (compile = options[:gems_compile])
69
+ options[:gems_compile] = compile.map do |name|
70
+ parse_gem_compile(name)
71
+ end
72
+ end
73
+
74
+ [File.expand_path(argv.first, ws.root_dir), *argv[1..-1], options]
20
75
  end
21
76
 
22
- def run(cache_dir, *package_names, all: true, keep_going: false, checkout_only: false)
77
+ def run(cache_dir, *package_names,
78
+ keep_going: false,
79
+ packages: true, all: true, checkout_only: false,
80
+ gems: false, gems_compile: [], gems_compile_force: false)
23
81
  initialize_and_load
24
82
  finalize_setup
25
83
 
26
- cache_op = Autoproj::Ops::Cache.new(cache_dir, ws.manifest)
27
- cache_op.create_or_update(*package_names, all: all, keep_going: keep_going, checkout_only: checkout_only)
84
+ cache_op = Autoproj::Ops::Cache.new(cache_dir, ws)
85
+ if packages
86
+ cache_op.create_or_update(
87
+ *package_names,
88
+ all: all, keep_going: keep_going,
89
+ checkout_only: checkout_only
90
+ )
91
+ end
92
+
93
+ if gems
94
+ Autoproj.message "caching gems in #{cache_op.gems_cache_dir}"
95
+ cache_op.create_or_update_gems(
96
+ keep_going: keep_going,
97
+ compile: gems_compile,
98
+ compile_force: gems_compile_force
99
+ )
100
+ end
28
101
  end
29
102
  end
30
103
  end
31
104
  end
32
-