autoproj 2.12.0 → 2.12.1
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/bin/autoproj +1 -1
- data/lib/autoproj/autobuild_extensions/dsl.rb +21 -8
- data/lib/autoproj/cli/base.rb +1 -1
- data/lib/autoproj/cli/build.rb +8 -3
- data/lib/autoproj/cli/cache.rb +46 -3
- data/lib/autoproj/cli/inspection_tool.rb +5 -6
- data/lib/autoproj/cli/show.rb +12 -18
- data/lib/autoproj/cli/update.rb +7 -8
- data/lib/autoproj/manifest.rb +7 -4
- data/lib/autoproj/ops/cache.rb +25 -12
- data/lib/autoproj/ops/cached_env.rb +2 -2
- data/lib/autoproj/ops/import.rb +9 -3
- data/lib/autoproj/package_managers/apt_dpkg_manager.rb +38 -23
- data/lib/autoproj/package_managers/bundler_manager.rb +1 -0
- data/lib/autoproj/package_managers/shell_script_manager.rb +44 -24
- data/lib/autoproj/package_manifest.rb +43 -31
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +19 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 214fd95f143468744f972355eefe4d626db36b1b9682c47998fc33373f1e5af5
|
4
|
+
data.tar.gz: 7fc8e361877c7ae1a66da15c00661e858cde213e6cf152c83799a7af71d910bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75a492d69d8b5902468f0a21c20bf1b4cbfe19c86d438f879094d3684c31da6a14fa184aa839fe1607dad086bf3210fe43a572d488f99e1ecb85c56be04f9489
|
7
|
+
data.tar.gz: d65b0bbbce89c696c913cddb23241b40a8d3acad47aabe7b93e9283701d3e7c1a82fde6544924d7b3f209a855aa9d065218303701c809b7a15e4fba3837193f6
|
data/bin/autoproj
CHANGED
@@ -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
|
|
@@ -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
|
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
|
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,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
|
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(
|
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
|
|
data/lib/autoproj/cli/cache.rb
CHANGED
@@ -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
|
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
|
-
|
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 =
|
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
|
-
|
43
|
+
[source_packages, osdep_packages, resolved_selection, config_selected]
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|
data/lib/autoproj/cli/show.rb
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/autoproj/cli/update.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
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)
|
data/lib/autoproj/manifest.rb
CHANGED
@@ -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
|
-
|
54
|
-
raise ConfigError.new(File.dirname(file)),
|
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.
|
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 =
|
86
|
+
@constant_definitions =
|
87
|
+
Autoproj.resolve_constant_definitions(data['constants'])
|
85
88
|
end
|
86
89
|
end
|
87
90
|
|
data/lib/autoproj/ops/cache.rb
CHANGED
@@ -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
|
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
|
115
|
+
Autoproj.message(
|
116
|
+
" [#{i}/#{total}] caching #{pkg.name} (archive)"
|
117
|
+
)
|
114
118
|
cache_archive(pkg)
|
115
119
|
else
|
116
|
-
Autoproj.message
|
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(
|
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,
|
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
|
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.
|
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.
|
23
|
+
YAML.safe_load(File.read(path))
|
24
24
|
rescue Exception
|
25
25
|
end
|
26
26
|
|
data/lib/autoproj/ops/import.rb
CHANGED
@@ -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(
|
292
|
-
|
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,
|
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
|
18
|
-
%w
|
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
|
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
|
-
|
62
|
-
raise ArgumentError, "expected #{status_file} to have Package:
|
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
|
78
|
-
package_name =
|
79
|
-
|
80
|
-
|
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
|
-
|
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(
|
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
|
106
|
-
# Ideally, we should check the version
|
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,
|
115
|
-
|
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
|
-
|
128
|
-
|
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)
|
@@ -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
|
-
|
11
|
-
Autoproj.message " waiting for other autoproj
|
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
|
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
|
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,
|
92
|
+
def initialize(ws, needs_locking, user_install_cmd,
|
93
|
+
auto_install_cmd, needs_root = true)
|
87
94
|
super(ws)
|
88
|
-
@needs_locking
|
89
|
-
|
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,
|
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,
|
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(
|
143
|
-
#{Autoproj.color(
|
144
|
-
#{Autoproj.color(
|
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
|
-
|
156
|
-
print " #{Autoproj.color(
|
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,
|
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(
|
181
|
-
|
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:
|
200
|
+
Autoproj.message " installing OS packages: "\
|
201
|
+
"#{packages.sort.join(', ')}"
|
185
202
|
|
186
203
|
if Autoproj.verbose
|
187
|
-
Autoproj.message "Generating installation script for
|
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(
|
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,
|
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'),
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
100
|
+
@null
|
99
101
|
end
|
100
102
|
|
101
|
-
def each_dependency(in_modes =
|
102
|
-
return enum_for(__method__, in_modes)
|
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__}",
|
112
|
-
|
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__}",
|
117
|
-
|
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__)
|
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__)
|
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__)
|
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
|
-
|
182
|
-
raise InvalidPackageManifest,
|
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
|
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
|
-
|
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 = [
|
249
|
-
DEPEND_TAGS =
|
250
|
-
|
251
|
-
|
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
|
-
|
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
|
272
|
-
mode = SUPPORTED_MODES & [
|
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
|
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)
|
data/lib/autoproj/version.rb
CHANGED
data/lib/autoproj/workspace.rb
CHANGED
@@ -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
|
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
|
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
|
-
|
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(
|
822
|
-
|
823
|
-
|
824
|
-
|
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.
|
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-
|
11
|
+
date: 2020-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|