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
@@ -15,7 +15,7 @@ def filter_uptodate_packages(packages)
|
|
15
15
|
# somewhere else
|
16
16
|
packages = packages.uniq
|
17
17
|
command_line = "brew info --json=v1 #{packages.join(' ')}"
|
18
|
-
result =
|
18
|
+
result = Autoproj.bundler_with_unbundled_env do
|
19
19
|
(Autobuild::Subprocess.run 'autoproj', 'osdeps', command_line).first
|
20
20
|
end
|
21
21
|
|
@@ -30,7 +30,7 @@ def filter_uptodate_packages(packages)
|
|
30
30
|
end
|
31
31
|
return packages
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
# fall back if something else went wrong
|
35
35
|
if packages.size != result.size
|
36
36
|
Autoproj.warn "brew info returns less or more packages when requested. Falling back to install all 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,
|
34
|
-
|
33
|
+
def self.parse(package, contents,
|
34
|
+
path: '<loaded from string>', loader_class: Loader)
|
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,8 @@ def self.parse(package, contents, path: '
|
|
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
|
51
|
+
attr_reader :path
|
49
52
|
attr_accessor :description
|
50
53
|
attr_accessor :brief_description
|
51
54
|
attr_reader :dependencies
|
@@ -63,7 +66,7 @@ def add_dependency(name, optional: false, modes: [])
|
|
63
66
|
end
|
64
67
|
|
65
68
|
def has_documentation?
|
66
|
-
|
69
|
+
description
|
67
70
|
end
|
68
71
|
|
69
72
|
def documentation
|
@@ -71,16 +74,18 @@ def documentation
|
|
71
74
|
end
|
72
75
|
|
73
76
|
def has_short_documentation?
|
74
|
-
|
77
|
+
brief_description
|
75
78
|
end
|
76
79
|
|
77
80
|
def short_documentation
|
78
81
|
brief_description ||
|
79
|
-
"no documentation available for package '#{package.name}'
|
82
|
+
"no documentation available for package '#{package.name}' "\
|
83
|
+
"in its manifest.xml file"
|
80
84
|
end
|
81
85
|
|
82
|
-
def initialize(package, null: false)
|
86
|
+
def initialize(package, path = nil, null: false)
|
83
87
|
@package = package
|
88
|
+
@path = path
|
84
89
|
@dependencies = []
|
85
90
|
@authors = []
|
86
91
|
@maintainers = []
|
@@ -92,11 +97,12 @@ def initialize(package, null: false)
|
|
92
97
|
# Whether this is a null manifest (used for packages that have actually
|
93
98
|
# no manifest) or not
|
94
99
|
def null?
|
95
|
-
|
100
|
+
@null
|
96
101
|
end
|
97
102
|
|
98
|
-
def each_dependency(in_modes =
|
99
|
-
return enum_for(__method__, in_modes)
|
103
|
+
def each_dependency(in_modes = [])
|
104
|
+
return enum_for(__method__, in_modes) unless block_given?
|
105
|
+
|
100
106
|
dependencies.each do |dep|
|
101
107
|
if dep.modes.empty? || in_modes.any? { |m| dep.modes.include?(m) }
|
102
108
|
yield(dep.name, dep.optional)
|
@@ -105,24 +111,28 @@ def each_dependency(in_modes = Array.new, &block)
|
|
105
111
|
end
|
106
112
|
|
107
113
|
def each_os_dependency(modes = Array.new, &block)
|
108
|
-
Autoproj.warn_deprecated "#{self.class}##{__method__}",
|
109
|
-
|
114
|
+
Autoproj.warn_deprecated "#{self.class}##{__method__}",
|
115
|
+
"call #each_dependency instead"
|
116
|
+
each_dependency(modes, &block)
|
110
117
|
end
|
111
118
|
|
112
119
|
def each_package_dependency(modes = Array.new, &block)
|
113
|
-
Autoproj.warn_deprecated "#{self.class}##{__method__}",
|
114
|
-
|
120
|
+
Autoproj.warn_deprecated "#{self.class}##{__method__}",
|
121
|
+
"call #each_dependency instead"
|
122
|
+
each_dependency(modes, &block)
|
115
123
|
end
|
116
124
|
|
117
125
|
def each_rock_maintainer
|
118
|
-
return enum_for(__method__)
|
126
|
+
return enum_for(__method__) unless block_given?
|
127
|
+
|
119
128
|
rock_maintainers.each do |m|
|
120
129
|
yield(m.name, m.email)
|
121
130
|
end
|
122
131
|
end
|
123
132
|
|
124
133
|
def each_maintainer
|
125
|
-
return enum_for(__method__)
|
134
|
+
return enum_for(__method__) unless block_given?
|
135
|
+
|
126
136
|
maintainers.each do |m|
|
127
137
|
yield(m.name, m.email)
|
128
138
|
end
|
@@ -131,7 +141,8 @@ def each_maintainer
|
|
131
141
|
# Enumerates the name and email of each author. If no email is present,
|
132
142
|
# yields (name, nil)
|
133
143
|
def each_author
|
134
|
-
return enum_for(__method__)
|
144
|
+
return enum_for(__method__) unless block_given?
|
145
|
+
|
135
146
|
authors.each do |m|
|
136
147
|
yield(m.name, m.email)
|
137
148
|
end
|
@@ -175,11 +186,13 @@ def initialize(path, manifest)
|
|
175
186
|
|
176
187
|
def parse_depend_tag(tag_name, attributes, modes: [], optional: false)
|
177
188
|
package = attributes['package'] || attributes['name']
|
178
|
-
|
179
|
-
raise InvalidPackageManifest,
|
189
|
+
unless package
|
190
|
+
raise InvalidPackageManifest,
|
191
|
+
"found '#{tag_name}' tag in #{path} "\
|
192
|
+
"without a 'package' attribute"
|
180
193
|
end
|
181
194
|
|
182
|
-
if tag_modes = attributes['modes']
|
195
|
+
if (tag_modes = attributes['modes'])
|
183
196
|
modes += tag_modes.split(',')
|
184
197
|
end
|
185
198
|
|
@@ -192,7 +205,7 @@ def parse_depend_tag(tag_name, attributes, modes: [], optional: false)
|
|
192
205
|
def parse_contact_field(text)
|
193
206
|
text.strip.split(',').map do |str|
|
194
207
|
name, email = str.split('/').map(&:strip)
|
195
|
-
email = nil if email
|
208
|
+
email = nil if email&.empty?
|
196
209
|
ContactInfo.new(name, email)
|
197
210
|
end
|
198
211
|
end
|
@@ -210,7 +223,7 @@ def toplevel_tag_start(name, attributes)
|
|
210
223
|
elsif name =~ /^(\w+)_depend$/
|
211
224
|
parse_depend_tag(name, attributes, modes: [$1])
|
212
225
|
elsif name == 'description'
|
213
|
-
if brief = attributes['brief']
|
226
|
+
if (brief = attributes['brief'])
|
214
227
|
manifest.brief_description = brief
|
215
228
|
end
|
216
229
|
@tag_text = ''
|
@@ -222,14 +235,13 @@ def toplevel_tag_start(name, attributes)
|
|
222
235
|
@tag_text = nil
|
223
236
|
end
|
224
237
|
end
|
238
|
+
|
225
239
|
def toplevel_tag_end(name)
|
226
240
|
if AUTHOR_FIELDS.include?(name)
|
227
241
|
manifest.send("#{name}s").concat(parse_contact_field(@tag_text))
|
228
242
|
elsif TEXT_FIELDS.include?(name)
|
229
243
|
field = @tag_text.strip
|
230
|
-
|
231
|
-
manifest.send("#{name}=", field)
|
232
|
-
end
|
244
|
+
manifest.send("#{name}=", field) unless field.empty?
|
233
245
|
elsif name == 'tags'
|
234
246
|
manifest.tags.concat(@tag_text.strip.split(',').map(&:strip))
|
235
247
|
end
|
@@ -242,10 +254,10 @@ def toplevel_tag_end(name)
|
|
242
254
|
# REXML stream parser object used to load the XML contents into a
|
243
255
|
# {PackageManifest} object
|
244
256
|
class RosLoader < Loader
|
245
|
-
SUPPORTED_MODES = [
|
246
|
-
DEPEND_TAGS =
|
247
|
-
|
248
|
-
|
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
|
249
261
|
|
250
262
|
def toplevel_tag_start(name, attributes)
|
251
263
|
if DEPEND_TAGS.include?(name)
|
@@ -262,18 +274,21 @@ def toplevel_tag_start(name, attributes)
|
|
262
274
|
|
263
275
|
def toplevel_tag_end(name)
|
264
276
|
if DEPEND_TAGS.include?(name)
|
265
|
-
|
277
|
+
if @tag_text.strip.empty?
|
278
|
+
raise InvalidPackageManifest, "found '#{name}' tag in #{path} "\
|
279
|
+
"without content"
|
280
|
+
end
|
266
281
|
|
267
282
|
mode = []
|
268
|
-
if
|
269
|
-
mode = SUPPORTED_MODES & [
|
283
|
+
if (m = /^(\w+)_depend$/.match(name))
|
284
|
+
mode = SUPPORTED_MODES & [m[1]]
|
270
285
|
end
|
271
286
|
|
272
287
|
manifest.add_dependency(@tag_text, modes: mode)
|
273
288
|
elsif AUTHOR_FIELDS.include?(name)
|
274
289
|
author_name = @tag_text.strip
|
275
290
|
email = @author_email ? @author_email.strip : nil
|
276
|
-
email = nil if email
|
291
|
+
email = nil if email&.empty?
|
277
292
|
contact = ContactInfo.new(author_name, email)
|
278
293
|
manifest.send("#{name}s").concat([contact])
|
279
294
|
elsif TEXT_FIELDS.include?(name)
|
data/lib/autoproj/package_set.rb
CHANGED
@@ -168,7 +168,7 @@ def initialize(
|
|
168
168
|
@version_control = Array.new
|
169
169
|
@overrides = Array.new
|
170
170
|
@raw_local_dir = raw_local_dir
|
171
|
-
@default_importer = VCSDefinition.from_raw(type: 'none')
|
171
|
+
@default_importer = VCSDefinition.from_raw({ type: 'none' })
|
172
172
|
|
173
173
|
@imports = Set.new
|
174
174
|
@imports_vcs = Array.new
|
@@ -239,7 +239,7 @@ def snapshot(target_dir, options = Hash.new)
|
|
239
239
|
else
|
240
240
|
package = create_autobuild_package
|
241
241
|
if package.importer.respond_to?(:snapshot)
|
242
|
-
package.importer.snapshot(package, target_dir, options)
|
242
|
+
package.importer.snapshot(package, target_dir, **options)
|
243
243
|
end
|
244
244
|
end
|
245
245
|
end
|
@@ -535,7 +535,9 @@ def parse_source_definition(source_definition)
|
|
535
535
|
|
536
536
|
Autoproj.in_file(source_file) do
|
537
537
|
default_vcs_spec, raw = version_control_field(
|
538
|
-
'default', version_control,
|
538
|
+
'default', version_control,
|
539
|
+
file: source_file, section: 'version_control'
|
540
|
+
)
|
539
541
|
if default_vcs_spec
|
540
542
|
@default_importer = VCSDefinition.from_raw(default_vcs_spec,
|
541
543
|
raw: raw, from: self)
|
@@ -653,28 +655,30 @@ def normalize_vcs_list(section_name, file, list)
|
|
653
655
|
# package in the form (PackageSet,Hash), where PackageSet is self.
|
654
656
|
# The Hash part is nil if there are no matching entries. Hash keys are
|
655
657
|
# normalized to symbols
|
656
|
-
def version_control_field(package_name, entry_list, validate: true,
|
658
|
+
def version_control_field(package_name, entry_list, validate: true,
|
659
|
+
file: source_file, section: nil)
|
657
660
|
raw = []
|
658
|
-
vcs_spec =
|
661
|
+
vcs_spec = entry_list.inject({}) do |resolved_spec, (name_match, spec)|
|
662
|
+
next(resolved_spec) unless name_match === package_name
|
659
663
|
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
664
|
+
raw << VCSDefinition::RawEntry.new(self, file, spec)
|
665
|
+
begin
|
666
|
+
VCSDefinition.update_raw_vcs_spec(resolved_spec, spec)
|
667
|
+
rescue ArgumentError => e
|
668
|
+
raise ConfigError.new,
|
669
|
+
'invalid VCS definition while resolving package '\
|
670
|
+
"'#{package_name}', entry '#{name_match}' of "\
|
671
|
+
"#{section ? "section '#{section}'" : ''}: "\
|
672
|
+
"#{e.message}", e.backtrace
|
669
673
|
end
|
670
674
|
end
|
671
675
|
|
672
|
-
if vcs_spec.empty?
|
673
|
-
return nil, []
|
674
|
-
end
|
676
|
+
return nil, [] if vcs_spec.empty?
|
675
677
|
|
676
|
-
expansions =
|
677
|
-
|
678
|
+
expansions = {
|
679
|
+
'PACKAGE' => package_name,
|
680
|
+
'PACKAGE_BASENAME' => File.basename(package_name)
|
681
|
+
}
|
678
682
|
|
679
683
|
vcs_spec = expand(vcs_spec, expansions)
|
680
684
|
vcs_spec.dup.each do |name, value|
|
@@ -682,7 +686,7 @@ def version_control_field(package_name, entry_list, validate: true, file: source
|
|
682
686
|
end
|
683
687
|
|
684
688
|
# Resolve relative paths w.r.t. the workspace root dir
|
685
|
-
if url = (vcs_spec.delete('url') || vcs_spec.delete(:url))
|
689
|
+
if (url = (vcs_spec.delete('url') || vcs_spec.delete(:url)))
|
686
690
|
vcs_spec[:url] = VCSDefinition.to_absolute_url(url, ws.root_dir)
|
687
691
|
end
|
688
692
|
|
@@ -691,11 +695,14 @@ def version_control_field(package_name, entry_list, validate: true, file: source
|
|
691
695
|
if validate
|
692
696
|
begin
|
693
697
|
VCSDefinition.from_raw(vcs_spec)
|
694
|
-
rescue
|
695
|
-
raise ConfigError.new,
|
698
|
+
rescue ArgumentError => e
|
699
|
+
raise ConfigError.new,
|
700
|
+
'invalid resulting VCS definition for package '\
|
701
|
+
"'#{package_name}': #{e.message}",
|
702
|
+
e.backtrace
|
696
703
|
end
|
697
704
|
end
|
698
|
-
|
705
|
+
[vcs_spec, raw]
|
699
706
|
end
|
700
707
|
|
701
708
|
# @api private
|
@@ -706,15 +713,20 @@ def invalidate_importer_definitions_cache
|
|
706
713
|
end
|
707
714
|
|
708
715
|
# Returns the VCS definition for +package_name+ as defined in this
|
709
|
-
#
|
716
|
+
# package set, or nil if the source does not have any.
|
710
717
|
#
|
711
718
|
# @param [PackageDefinition] package
|
712
719
|
# @return [VCSDefinition] the importer definition, or nil if none
|
713
720
|
# could be found
|
714
721
|
def importer_definition_for(package, default: default_importer, require_existing: true)
|
715
|
-
package_name = manifest.validate_package_name_argument(
|
722
|
+
package_name = manifest.validate_package_name_argument(
|
723
|
+
package, require_existing: require_existing
|
724
|
+
)
|
716
725
|
importer_definitions_cache[package_name] ||= Autoproj.in_file source_file do
|
717
|
-
vcs_spec, raw = version_control_field(
|
726
|
+
vcs_spec, raw = version_control_field(
|
727
|
+
package_name, version_control,
|
728
|
+
file: source_file, section: 'version_control'
|
729
|
+
)
|
718
730
|
if vcs_spec
|
719
731
|
VCSDefinition.from_raw(vcs_spec, raw: raw, from: self)
|
720
732
|
else
|
@@ -729,7 +741,9 @@ def importer_definition_for(package, default: default_importer, require_existing
|
|
729
741
|
# @param [VCSDefinition] the vcs to be updated
|
730
742
|
# @return [VCSDefinition] the new, updated vcs object
|
731
743
|
def overrides_for(package, vcs, require_existing: true)
|
732
|
-
package_name = manifest.validate_package_name_argument(
|
744
|
+
package_name = manifest.validate_package_name_argument(
|
745
|
+
package, require_existing: require_existing
|
746
|
+
)
|
733
747
|
resolve_overrides(package_name, vcs)
|
734
748
|
end
|
735
749
|
|
@@ -742,7 +756,10 @@ def resolve_overrides(key, vcs)
|
|
742
756
|
overrides.each do |file, file_overrides|
|
743
757
|
new_spec, new_raw_entry =
|
744
758
|
Autoproj.in_file file do
|
745
|
-
version_control_field(
|
759
|
+
version_control_field(
|
760
|
+
key, file_overrides,
|
761
|
+
validate: false, file: file, section: 'overrides'
|
762
|
+
)
|
746
763
|
end
|
747
764
|
|
748
765
|
if new_spec
|
@@ -750,7 +767,9 @@ def resolve_overrides(key, vcs)
|
|
750
767
|
begin
|
751
768
|
vcs = vcs.update(new_spec, raw: new_raw_entry, from: self)
|
752
769
|
rescue ConfigError => e
|
753
|
-
raise ConfigError.new, "invalid resulting VCS specification
|
770
|
+
raise ConfigError.new, "invalid resulting VCS specification "\
|
771
|
+
"in the overrides section for "\
|
772
|
+
"#{key}: #{e.message}"
|
754
773
|
end
|
755
774
|
end
|
756
775
|
end
|