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.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -8
- data/.travis.yml +5 -3
- data/autoproj.gemspec +7 -6
- data/bin/alog +1 -0
- data/bin/autoproj +1 -1
- data/bin/autoproj_bootstrap +149 -86
- data/bin/autoproj_bootstrap.in +9 -7
- data/bin/autoproj_install +148 -82
- data/bin/autoproj_install.in +8 -3
- data/lib/autoproj.rb +3 -0
- data/lib/autoproj/aruba_minitest.rb +15 -0
- data/lib/autoproj/autobuild_extensions/dsl.rb +61 -27
- data/lib/autoproj/base.rb +35 -6
- data/lib/autoproj/cli/base.rb +1 -1
- data/lib/autoproj/cli/build.rb +9 -3
- data/lib/autoproj/cli/cache.rb +79 -7
- data/lib/autoproj/cli/doc.rb +4 -18
- data/lib/autoproj/cli/inspection_tool.rb +5 -6
- data/lib/autoproj/cli/main.rb +41 -18
- data/lib/autoproj/cli/main_doc.rb +86 -0
- data/lib/autoproj/cli/main_plugin.rb +3 -0
- data/lib/autoproj/cli/main_test.rb +15 -0
- data/lib/autoproj/cli/show.rb +12 -18
- data/lib/autoproj/cli/status.rb +15 -9
- data/lib/autoproj/cli/test.rb +13 -84
- data/lib/autoproj/cli/update.rb +77 -19
- data/lib/autoproj/cli/utility.rb +136 -0
- data/lib/autoproj/configuration.rb +28 -4
- data/lib/autoproj/default.osdeps +18 -0
- data/lib/autoproj/installation_manifest.rb +7 -5
- data/lib/autoproj/manifest.rb +15 -21
- data/lib/autoproj/ops/build.rb +23 -27
- data/lib/autoproj/ops/cache.rb +151 -33
- data/lib/autoproj/ops/cached_env.rb +2 -2
- data/lib/autoproj/ops/import.rb +146 -80
- data/lib/autoproj/ops/install.rb +140 -79
- data/lib/autoproj/ops/phase_reporting.rb +49 -0
- data/lib/autoproj/ops/snapshot.rb +2 -1
- data/lib/autoproj/ops/tools.rb +2 -2
- data/lib/autoproj/os_package_installer.rb +19 -11
- data/lib/autoproj/package_definition.rb +29 -10
- data/lib/autoproj/package_managers/apt_dpkg_manager.rb +49 -28
- data/lib/autoproj/package_managers/bundler_manager.rb +257 -87
- data/lib/autoproj/package_managers/homebrew_manager.rb +2 -2
- data/lib/autoproj/package_managers/shell_script_manager.rb +44 -24
- data/lib/autoproj/package_manifest.rb +49 -34
- data/lib/autoproj/package_set.rb +48 -29
- data/lib/autoproj/repository_managers/apt.rb +0 -1
- data/lib/autoproj/test.rb +29 -10
- data/lib/autoproj/variable_expansion.rb +3 -1
- data/lib/autoproj/vcs_definition.rb +30 -15
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +55 -13
- 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
|
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
|
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
|
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
|
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
|
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
|
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
|
-
|
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
|
-
|
202
|
-
|
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
|
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
|
-
|
288
|
-
|
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
|
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
|
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
|
data/lib/autoproj/base.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/autoproj/cli/base.rb
CHANGED
@@ -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
|
-
|
154
|
+
[source_packages, osdep_packages, resolved_selection]
|
155
155
|
rescue ExcludedSelection => e
|
156
156
|
raise CLIInvalidSelection, e.message, e.backtrace
|
157
157
|
end
|
data/lib/autoproj/cli/build.rb
CHANGED
@@ -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
|
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(
|
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
|
|
data/lib/autoproj/cli/cache.rb
CHANGED
@@ -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,
|
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}
|
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
|
-
|
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,
|
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
|
27
|
-
|
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
|
-
|