autoproj 1.13.7 → 2.0.0.b1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gemtest +0 -0
- data/Manifest.txt +27 -21
- data/Rakefile +4 -6
- data/bin/alocate +5 -1
- data/bin/amake +3 -53
- data/bin/aup +3 -50
- data/bin/autoproj +3 -264
- data/bin/autoproj_bootstrap +294 -349
- data/bin/autoproj_bootstrap.in +27 -3
- data/lib/autoproj.rb +23 -1
- data/lib/autoproj/autobuild.rb +51 -89
- data/lib/autoproj/base.rb +0 -9
- data/lib/autoproj/build_option.rb +1 -3
- data/lib/autoproj/cli.rb +1 -0
- data/lib/autoproj/cli/base.rb +155 -0
- data/lib/autoproj/cli/bootstrap.rb +119 -0
- data/lib/autoproj/cli/build.rb +72 -0
- data/lib/autoproj/cli/cache.rb +31 -0
- data/lib/autoproj/cli/clean.rb +37 -0
- data/lib/autoproj/cli/commit.rb +41 -0
- data/lib/autoproj/cli/doc.rb +22 -0
- data/lib/autoproj/cli/envsh.rb +22 -0
- data/lib/autoproj/cli/inspection_tool.rb +73 -0
- data/lib/autoproj/cli/locate.rb +96 -0
- data/lib/autoproj/cli/log.rb +26 -0
- data/lib/autoproj/cli/main.rb +249 -0
- data/lib/autoproj/cli/main_test.rb +57 -0
- data/lib/autoproj/cli/osdeps.rb +30 -0
- data/lib/autoproj/cli/query.rb +43 -0
- data/lib/autoproj/cli/reconfigure.rb +19 -0
- data/lib/autoproj/cli/reset.rb +7 -32
- data/lib/autoproj/cli/show.rb +219 -0
- data/lib/autoproj/cli/snapshot.rb +1 -1
- data/lib/autoproj/cli/status.rb +149 -0
- data/lib/autoproj/cli/switch_config.rb +28 -0
- data/lib/autoproj/cli/tag.rb +9 -35
- data/lib/autoproj/cli/test.rb +34 -55
- data/lib/autoproj/cli/update.rb +158 -0
- data/lib/autoproj/cli/versions.rb +32 -69
- data/lib/autoproj/configuration.rb +95 -34
- data/lib/autoproj/default.osdeps +25 -35
- data/lib/autoproj/environment.rb +85 -63
- data/lib/autoproj/exceptions.rb +50 -0
- data/lib/autoproj/gitorious.rb +11 -9
- data/lib/autoproj/manifest.rb +199 -231
- data/lib/autoproj/metapackage.rb +0 -8
- data/lib/autoproj/ops/build.rb +1 -17
- data/lib/autoproj/ops/configuration.rb +92 -90
- data/lib/autoproj/ops/import.rb +222 -0
- data/lib/autoproj/ops/loader.rb +18 -8
- data/lib/autoproj/ops/main_config_switcher.rb +45 -73
- data/lib/autoproj/ops/snapshot.rb +5 -10
- data/lib/autoproj/ops/tools.rb +10 -44
- data/lib/autoproj/options.rb +35 -6
- data/lib/autoproj/osdeps.rb +97 -68
- data/lib/autoproj/package_selection.rb +39 -20
- data/lib/autoproj/package_set.rb +26 -24
- data/lib/autoproj/reporter.rb +91 -0
- data/lib/autoproj/system.rb +50 -149
- data/lib/autoproj/variable_expansion.rb +32 -6
- data/lib/autoproj/vcs_definition.rb +57 -17
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +550 -0
- data/test/ops/test_snapshot.rb +26 -0
- data/test/test_package.rb +30 -0
- data/test/test_vcs_definition.rb +46 -0
- metadata +55 -50
- data/bin/autolocate +0 -3
- data/bin/autoproj-bootstrap +0 -68
- data/bin/autoproj-cache +0 -18
- data/bin/autoproj-clean +0 -13
- data/bin/autoproj-commit +0 -10
- data/bin/autoproj-create-set +0 -118
- data/bin/autoproj-doc +0 -28
- data/bin/autoproj-envsh +0 -14
- data/bin/autoproj-list +0 -69
- data/bin/autoproj-locate +0 -85
- data/bin/autoproj-log +0 -5
- data/bin/autoproj-query +0 -82
- data/bin/autoproj-reset +0 -13
- data/bin/autoproj-show +0 -192
- data/bin/autoproj-snapshot +0 -27
- data/bin/autoproj-switch-config +0 -24
- data/bin/autoproj-tag +0 -13
- data/bin/autoproj-test +0 -31
- data/bin/autoproj-versions +0 -20
- data/bin/autoproj_stress_test +0 -40
- data/lib/autoproj/cmdline.rb +0 -1649
data/lib/autoproj/metapackage.rb
CHANGED
@@ -38,14 +38,6 @@ module Autoproj
|
|
38
38
|
@packages.each(&block)
|
39
39
|
end
|
40
40
|
|
41
|
-
# Filter this metapackage by removing some packages
|
42
|
-
def remove(pkg)
|
43
|
-
if !pkg.respond_to?(:to_str)
|
44
|
-
pkg = pkg.name
|
45
|
-
end
|
46
|
-
@packages.delete_if { |p| p.name == pkg }
|
47
|
-
end
|
48
|
-
|
49
41
|
# Tests if the given package is included in this metapackage
|
50
42
|
#
|
51
43
|
# @param [String,#name] pkg the package or package name
|
data/lib/autoproj/ops/build.rb
CHANGED
@@ -9,14 +9,9 @@ module Autoproj
|
|
9
9
|
# The manifest on which we operate
|
10
10
|
# @return [Manifest]
|
11
11
|
attr_reader :manifest
|
12
|
-
# Whether we should update the OS dependencies before building. It
|
13
|
-
# controls the behaviour of {rebuild_all} as well as
|
14
|
-
# {build_packages}
|
15
|
-
attr_predicate :update_os_dependencies?, true
|
16
12
|
|
17
|
-
def initialize(manifest
|
13
|
+
def initialize(manifest)
|
18
14
|
@manifest = manifest
|
19
|
-
self.update_os_dependencies = update_os_dependencies
|
20
15
|
end
|
21
16
|
|
22
17
|
# Triggers a rebuild of all packages
|
@@ -26,17 +21,6 @@ module Autoproj
|
|
26
21
|
# non-OS-specific managers that support it (e.g. RubyGems) if
|
27
22
|
# {update_os_dependencies?} is set to true (the default)
|
28
23
|
def rebuild_all
|
29
|
-
if update_os_dependencies?
|
30
|
-
# We also reinstall the osdeps that provide the
|
31
|
-
# functionality
|
32
|
-
managers = Autoproj.osdeps.setup_package_handlers
|
33
|
-
managers.each do |mng|
|
34
|
-
if mng.respond_to?(:reinstall)
|
35
|
-
mng.reinstall
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
24
|
packages = manifest.all_layout_packages
|
41
25
|
manifest.pristine_os_dependencies(packages)
|
42
26
|
rebuild_packages(packages, packages)
|
@@ -6,35 +6,19 @@ module Autoproj
|
|
6
6
|
|
7
7
|
# Implementation of the operations to manage the configuration
|
8
8
|
class Configuration
|
9
|
-
|
10
|
-
#
|
11
|
-
# @return [Manifest]
|
12
|
-
attr_reader :manifest
|
13
|
-
|
14
|
-
# The loader object that should be used to load files such as init.rb
|
15
|
-
attr_reader :loader
|
16
|
-
|
17
|
-
# The main configuration directory
|
18
|
-
#
|
19
|
-
# @return [String]
|
20
|
-
attr_reader :config_dir
|
9
|
+
attr_reader :ws
|
21
10
|
|
22
11
|
# The autoproj install we should update from (if any)
|
23
12
|
#
|
24
13
|
# @return [nil,InstallationManifest]
|
25
14
|
attr_reader :update_from
|
26
15
|
|
27
|
-
# The object that allows us to install OS dependencies
|
28
|
-
def osdeps
|
29
|
-
Autoproj.osdeps
|
30
|
-
end
|
31
|
-
|
32
16
|
# The path in which remote package sets should be exposed to the
|
33
17
|
# user
|
34
18
|
#
|
35
19
|
# @return [String]
|
36
20
|
def remotes_dir
|
37
|
-
|
21
|
+
ws.remotes_dir
|
38
22
|
end
|
39
23
|
|
40
24
|
# The path in which remote package sets should be exposed to the
|
@@ -42,45 +26,44 @@ module Autoproj
|
|
42
26
|
#
|
43
27
|
# @return [String]
|
44
28
|
def remotes_user_dir
|
45
|
-
File.join(config_dir, "remotes")
|
29
|
+
File.join(ws.config_dir, "remotes")
|
46
30
|
end
|
47
31
|
|
48
32
|
# The path to the main manifest file
|
49
33
|
#
|
50
34
|
# @return [String]
|
51
35
|
def manifest_path
|
52
|
-
File.join(config_dir, 'manifest')
|
36
|
+
File.join(ws.config_dir, 'manifest')
|
53
37
|
end
|
54
38
|
|
55
|
-
|
56
39
|
# @param [Manifest] manifest
|
57
40
|
# @param [Loader] loader
|
58
41
|
# @option options [InstallationManifest] :update_from
|
59
|
-
#
|
42
|
+
# another autoproj installation from which we
|
60
43
|
# should update (instead of the normal VCS)
|
61
|
-
def initialize(
|
62
|
-
options =
|
63
|
-
:
|
64
|
-
@
|
65
|
-
@loader = loader
|
44
|
+
def initialize(workspace, options = Hash.new)
|
45
|
+
options = validate_options options,
|
46
|
+
update_from: nil
|
47
|
+
@ws = workspace
|
66
48
|
@update_from = options[:update_from]
|
67
|
-
@config_dir = Autoproj.config_dir
|
68
49
|
@remote_update_message_displayed = false
|
69
50
|
end
|
70
51
|
|
71
52
|
# Imports or updates a source (remote or otherwise).
|
72
53
|
#
|
73
54
|
# See create_autobuild_package for informations about the arguments.
|
74
|
-
def
|
75
|
-
options = Kernel.validate_options options,
|
76
|
-
|
55
|
+
def update_configuration_repository(vcs, name, into, options = Hash.new)
|
56
|
+
options = Kernel.validate_options options,
|
57
|
+
only_local: false,
|
58
|
+
checkout_only: !Autobuild.do_update,
|
59
|
+
ignore_errors: false
|
77
60
|
|
78
61
|
fake_package = Tools.create_autobuild_package(vcs, name, into)
|
79
62
|
if update_from
|
80
63
|
# Define a package in the installation manifest that points to
|
81
64
|
# the desired folder in other_root
|
82
65
|
relative_path = Pathname.new(into).
|
83
|
-
relative_path_from(Pathname.new(
|
66
|
+
relative_path_from(Pathname.new(root_dir)).to_s
|
84
67
|
other_dir = File.join(update_from.path, relative_path)
|
85
68
|
if File.directory?(other_dir)
|
86
69
|
update_from.packages.unshift(
|
@@ -96,7 +79,7 @@ module Autoproj
|
|
96
79
|
fake_package.update = false
|
97
80
|
end
|
98
81
|
end
|
99
|
-
fake_package.import(
|
82
|
+
fake_package.import(options)
|
100
83
|
|
101
84
|
rescue Autobuild::ConfigException => e
|
102
85
|
raise ConfigError.new, "cannot import #{name}: #{e.message}", e.backtrace
|
@@ -106,13 +89,20 @@ module Autoproj
|
|
106
89
|
#
|
107
90
|
# @return [Boolean] true if something got updated or checked out,
|
108
91
|
# and false otherwise
|
109
|
-
def update_main_configuration(
|
110
|
-
|
111
|
-
|
92
|
+
def update_main_configuration(options = Hash.new)
|
93
|
+
if !options.kind_of?(Hash)
|
94
|
+
options = Hash[only_local: options]
|
95
|
+
end
|
96
|
+
options = validate_options options,
|
97
|
+
only_local: false,
|
98
|
+
checkout_only: !Autobuild.do_update,
|
99
|
+
ignore_errors: false
|
100
|
+
|
101
|
+
update_configuration_repository(
|
102
|
+
ws.manifest.vcs,
|
112
103
|
"autoproj main configuration",
|
113
|
-
config_dir,
|
114
|
-
|
115
|
-
only_local: only_local)
|
104
|
+
ws.config_dir,
|
105
|
+
options)
|
116
106
|
end
|
117
107
|
|
118
108
|
# Update or checkout a remote package set, based on its VCS definition
|
@@ -120,11 +110,20 @@ module Autoproj
|
|
120
110
|
# @param [VCSDefinition] vcs the package set VCS
|
121
111
|
# @return [Boolean] true if something got updated or checked out,
|
122
112
|
# and false otherwise
|
123
|
-
def update_remote_package_set(vcs,
|
124
|
-
|
113
|
+
def update_remote_package_set(vcs, options = Hash.new)
|
114
|
+
# BACKWARD
|
115
|
+
if !options.kind_of?(Hash)
|
116
|
+
options = Hash[only_local: options]
|
117
|
+
end
|
118
|
+
options = validate_options options,
|
119
|
+
only_local: false,
|
120
|
+
checkout_only: !Autobuild.do_update,
|
121
|
+
ignore_errors: false
|
122
|
+
|
123
|
+
name = PackageSet.name_of(ws.manifest, vcs)
|
125
124
|
raw_local_dir = PackageSet.raw_local_dir_of(vcs)
|
126
125
|
|
127
|
-
return if
|
126
|
+
return if options[:checkout_only] && File.exists?(raw_local_dir)
|
128
127
|
|
129
128
|
# YUK. I am stopping there in the refactoring
|
130
129
|
# TODO: figure out a better way
|
@@ -132,11 +131,9 @@ module Autoproj
|
|
132
131
|
Autoproj.message("autoproj: updating remote definitions of package sets", :bold)
|
133
132
|
@remote_update_message_displayed = true
|
134
133
|
end
|
135
|
-
osdeps.install([vcs.type])
|
136
|
-
|
137
|
-
vcs, name, raw_local_dir,
|
138
|
-
update_from: update_from,
|
139
|
-
only_local: only_local)
|
134
|
+
ws.osdeps.install([vcs.type])
|
135
|
+
update_configuration_repository(
|
136
|
+
vcs, name, raw_local_dir, options)
|
140
137
|
end
|
141
138
|
|
142
139
|
# Create the user-visible directory for a remote package set
|
@@ -144,7 +141,7 @@ module Autoproj
|
|
144
141
|
# @param [VCSDefinition] vcs the package set VCS
|
145
142
|
# @return [String] the full path to the created user dir
|
146
143
|
def create_remote_set_user_dir(vcs)
|
147
|
-
name = PackageSet.name_of(manifest, vcs)
|
144
|
+
name = PackageSet.name_of(ws.manifest, vcs)
|
148
145
|
raw_local_dir = PackageSet.raw_local_dir_of(vcs)
|
149
146
|
FileUtils.mkdir_p(remotes_user_dir)
|
150
147
|
symlink_dest = File.join(remotes_user_dir, name)
|
@@ -166,9 +163,9 @@ module Autoproj
|
|
166
163
|
end
|
167
164
|
|
168
165
|
def load_package_set(vcs, options, imported_from)
|
169
|
-
pkg_set = PackageSet.new(manifest, vcs)
|
166
|
+
pkg_set = PackageSet.new(ws.manifest, vcs)
|
170
167
|
pkg_set.auto_imports = options[:auto_imports]
|
171
|
-
|
168
|
+
ws.load_if_present(pkg_set, pkg_set.local_dir, 'init.rb')
|
172
169
|
pkg_set.load_description_file
|
173
170
|
if imported_from
|
174
171
|
pkg_set.imported_from << imported_from
|
@@ -204,16 +201,22 @@ module Autoproj
|
|
204
201
|
#
|
205
202
|
# @yieldparam [String] osdep the name of an osdep required to import the
|
206
203
|
# package sets
|
207
|
-
def load_and_update_package_sets(root_pkg_set,
|
204
|
+
def load_and_update_package_sets(root_pkg_set, options = Hash.new)
|
205
|
+
if !options.kind_of?(Hash)
|
206
|
+
options = Hash[only_local: options]
|
207
|
+
end
|
208
|
+
options = validate_options options,
|
209
|
+
only_local: false,
|
210
|
+
checkout_only: !Autobuild.do_update,
|
211
|
+
ignore_errors: false
|
212
|
+
|
208
213
|
package_sets = [root_pkg_set]
|
209
214
|
by_repository_id = Hash.new
|
210
215
|
by_name = Hash.new
|
211
216
|
|
212
|
-
required_remotes_dirs = Array.new
|
213
|
-
|
214
217
|
queue = queue_auto_imports_if_needed(Array.new, root_pkg_set, root_pkg_set)
|
215
218
|
while !queue.empty?
|
216
|
-
vcs,
|
219
|
+
vcs, import_options, imported_from = queue.shift
|
217
220
|
repository_id = repository_id_of(vcs)
|
218
221
|
if already_processed = by_repository_id[repository_id]
|
219
222
|
already_processed_vcs, already_processed_from, pkg_set = *already_processed
|
@@ -229,28 +232,17 @@ module Autoproj
|
|
229
232
|
end
|
230
233
|
by_repository_id[repository_id] = [vcs, imported_from]
|
231
234
|
|
232
|
-
# Make sure the package set has been already checked out to
|
233
|
-
# retrieve the actual name of the package set
|
234
235
|
if !vcs.local?
|
235
|
-
update_remote_package_set(vcs,
|
236
|
-
|
237
|
-
required_remotes_dirs << raw_local_dir
|
236
|
+
update_remote_package_set(vcs, options)
|
237
|
+
create_remote_set_user_dir(vcs)
|
238
238
|
end
|
239
|
-
name = PackageSet.name_of(manifest, vcs)
|
240
|
-
|
241
|
-
required_user_dirs = by_name.collect { |k,v| k }
|
242
|
-
Autoproj.debug "Trying to load package_set: #{name} from definition #{repository_id}"
|
243
|
-
Autoproj.debug "Already loaded package_sets are: #{required_user_dirs}"
|
244
239
|
|
240
|
+
name = PackageSet.name_of(ws.manifest, vcs)
|
245
241
|
if already_loaded = by_name[name]
|
246
242
|
already_loaded_pkg_set, already_loaded_vcs = *already_loaded
|
247
243
|
if already_loaded_vcs != vcs
|
248
244
|
if imported_from
|
249
|
-
Autoproj.warn "
|
250
|
-
Autoproj.warn " A package set with the same name (#{name}) has already been imported from"
|
251
|
-
Autoproj.warn " #{already_loaded_vcs}"
|
252
|
-
Autoproj.warn " Skipping the following one: "
|
253
|
-
Autoproj.warn " #{vcs}"
|
245
|
+
Autoproj.warn "#{imported_from.name} auto-imports a package set from #{vcs}, but a package set with the same name (#{name}) has already been imported from #{already_loaded_vcs}, I am skipping this one"
|
254
246
|
else
|
255
247
|
Autoproj.warn "the manifest refers to a package set from #{vcs}, but a package set with the same name (#{name}) has already been imported from #{already_loaded_vcs}, I am skipping this one"
|
256
248
|
end
|
@@ -261,11 +253,9 @@ module Autoproj
|
|
261
253
|
imported_from.imports << already_loaded_pkg_set
|
262
254
|
end
|
263
255
|
next
|
264
|
-
else
|
265
|
-
create_remote_set_user_dir(vcs)
|
266
256
|
end
|
267
257
|
|
268
|
-
pkg_set = load_package_set(vcs,
|
258
|
+
pkg_set = load_package_set(vcs, import_options, imported_from)
|
269
259
|
by_repository_id[repository_id][2] = pkg_set
|
270
260
|
package_sets << pkg_set
|
271
261
|
|
@@ -275,21 +265,18 @@ module Autoproj
|
|
275
265
|
queue_auto_imports_if_needed(queue, pkg_set, root_pkg_set)
|
276
266
|
end
|
277
267
|
|
278
|
-
|
279
|
-
|
280
|
-
cleanup_remotes_user_dir(package_sets, required_user_dirs)
|
268
|
+
cleanup_remotes_dir(package_sets)
|
269
|
+
cleanup_remotes_user_dir(package_sets)
|
281
270
|
package_sets
|
282
271
|
end
|
283
272
|
|
284
273
|
# Removes from {remotes_dir} the directories that do not match a package
|
285
274
|
# set
|
286
|
-
def cleanup_remotes_dir(package_sets = manifest.package_sets
|
275
|
+
def cleanup_remotes_dir(package_sets = ws.manifest.package_sets)
|
287
276
|
# Cleanup the .remotes and remotes_symlinks_dir directories
|
288
277
|
Dir.glob(File.join(remotes_dir, '*')).each do |dir|
|
289
278
|
dir = File.expand_path(dir)
|
290
|
-
|
291
|
-
# keep it -- so that it won't be checked out again
|
292
|
-
if File.directory?(dir) && !required_remotes_dirs.include?(dir)
|
279
|
+
if File.directory?(dir) && !package_sets.find { |pkg| pkg.raw_local_dir == dir }
|
293
280
|
FileUtils.rm_rf dir
|
294
281
|
end
|
295
282
|
end
|
@@ -297,11 +284,10 @@ module Autoproj
|
|
297
284
|
|
298
285
|
# Removes from {remotes_user_dir} the directories that do not match a
|
299
286
|
# package set
|
300
|
-
def cleanup_remotes_user_dir(package_sets = manifest.package_sets
|
287
|
+
def cleanup_remotes_user_dir(package_sets = ws.manifest.package_sets)
|
301
288
|
Dir.glob(File.join(remotes_user_dir, '*')).each do |file|
|
302
289
|
file = File.expand_path(file)
|
303
|
-
|
304
|
-
if File.symlink?(file) && !required_user_dirs.include?(user_dir)
|
290
|
+
if File.symlink?(file) && !package_sets.find { |pkg_set| pkg_set.user_local_dir == file }
|
305
291
|
FileUtils.rm_f file
|
306
292
|
end
|
307
293
|
end
|
@@ -349,26 +335,42 @@ module Autoproj
|
|
349
335
|
sorted
|
350
336
|
end
|
351
337
|
|
352
|
-
def
|
338
|
+
def load_package_sets(options = Hash.new)
|
339
|
+
options = validate_options options,
|
340
|
+
only_local: false,
|
341
|
+
checkout_only: true,
|
342
|
+
ignore_errors: false
|
343
|
+
update_configuration(options)
|
344
|
+
end
|
345
|
+
|
346
|
+
def update_configuration(options = Hash.new)
|
347
|
+
if !options.kind_of?(Hash)
|
348
|
+
options = Hash[only_local: options]
|
349
|
+
end
|
350
|
+
options = validate_options options,
|
351
|
+
only_local: false,
|
352
|
+
checkout_only: !Autobuild.do_update,
|
353
|
+
ignore_errors: false
|
354
|
+
|
353
355
|
# Load the installation's manifest a first time, to check if we should
|
354
356
|
# update it ... We assume that the OS dependencies for this VCS is already
|
355
357
|
# installed (i.e. that the user did not remove it)
|
356
|
-
if manifest.vcs && !manifest.vcs.local?
|
357
|
-
update_main_configuration(
|
358
|
+
if ws.manifest.vcs && !ws.manifest.vcs.local?
|
359
|
+
update_main_configuration(options)
|
358
360
|
end
|
359
|
-
|
360
|
-
manifest.load(manifest_path)
|
361
|
+
ws.load_main_initrb
|
362
|
+
ws.manifest.load(manifest_path)
|
361
363
|
|
362
|
-
root_pkg_set = manifest.local_package_set
|
364
|
+
root_pkg_set = ws.manifest.local_package_set
|
363
365
|
root_pkg_set.load_description_file
|
364
366
|
root_pkg_set.explicit = true
|
365
|
-
package_sets = load_and_update_package_sets(root_pkg_set,
|
367
|
+
package_sets = load_and_update_package_sets(root_pkg_set, options)
|
366
368
|
root_pkg_set.imports.each do |pkg_set|
|
367
369
|
pkg_set.explicit = true
|
368
370
|
end
|
369
371
|
package_sets = sort_package_sets_by_import_order(package_sets, root_pkg_set)
|
370
372
|
package_sets.each do |pkg_set|
|
371
|
-
manifest.register_package_set(pkg_set)
|
373
|
+
ws.manifest.register_package_set(pkg_set)
|
372
374
|
end
|
373
375
|
# YUK. I am stopping there in the refactoring
|
374
376
|
# TODO: figure out a better way
|
@@ -0,0 +1,222 @@
|
|
1
|
+
module Autoproj
|
2
|
+
module Ops
|
3
|
+
class Import
|
4
|
+
attr_reader :ws
|
5
|
+
def initialize(ws)
|
6
|
+
@ws = ws
|
7
|
+
end
|
8
|
+
|
9
|
+
def mark_exclusion_along_revdeps(pkg_name, revdeps, chain = [], reason = nil)
|
10
|
+
root = !reason
|
11
|
+
chain.unshift pkg_name
|
12
|
+
if root
|
13
|
+
reason = ws.manifest.exclusion_reason(pkg_name)
|
14
|
+
else
|
15
|
+
if chain.size == 1
|
16
|
+
ws.manifest.add_exclusion(pkg_name, "its dependency #{reason}")
|
17
|
+
else
|
18
|
+
ws.manifest.add_exclusion(pkg_name, "#{reason} (dependency chain: #{chain.join(">")})")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
return if !revdeps.has_key?(pkg_name)
|
23
|
+
revdeps[pkg_name].each do |dep_name|
|
24
|
+
if !ws.manifest.excluded?(dep_name)
|
25
|
+
mark_exclusion_along_revdeps(dep_name, revdeps, chain.dup, reason)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
VALID_OSDEP_AVAILABILITY =
|
31
|
+
[OSDependencies::AVAILABLE, OSDependencies::IGNORE]
|
32
|
+
|
33
|
+
def import_next_step(pkg, reverse_dependencies)
|
34
|
+
new_packages = []
|
35
|
+
pkg.dependencies.each do |dep_name|
|
36
|
+
reverse_dependencies[dep_name] << pkg.name
|
37
|
+
new_packages << ws.manifest.find_autobuild_package(dep_name)
|
38
|
+
end
|
39
|
+
pkg_opt_deps, pkg_opt_os_deps = pkg.partition_optional_dependencies
|
40
|
+
pkg_opt_deps.each do |dep_name|
|
41
|
+
new_packages << ws.manifest.find_autobuild_package(dep_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Handle OS dependencies, excluding the package if some
|
45
|
+
# dependencies are not available
|
46
|
+
pkg.os_packages.each do |dep_name|
|
47
|
+
reverse_dependencies[dep_name] << pkg.name
|
48
|
+
end
|
49
|
+
(pkg.os_packages | pkg_opt_os_deps).each do |dep_name|
|
50
|
+
if ws.manifest.excluded?(dep_name)
|
51
|
+
mark_exclusion_along_revdeps(dep_name, reverse_dependencies)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
new_packages.delete_if do |new_pkg|
|
56
|
+
if ws.manifest.excluded?(new_pkg.name)
|
57
|
+
mark_exclusion_along_revdeps(new_pkg.name, reverse_dependencies)
|
58
|
+
true
|
59
|
+
elsif ws.manifest.ignored?(new_pkg.name)
|
60
|
+
true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
new_packages
|
64
|
+
end
|
65
|
+
|
66
|
+
def import_packages(selection, options = Hash.new)
|
67
|
+
options, import_options = Kernel.filter_options options,
|
68
|
+
warn_about_ignored_packages: true,
|
69
|
+
warn_about_excluded_packages: true,
|
70
|
+
recursive: true
|
71
|
+
|
72
|
+
manifest = ws.manifest
|
73
|
+
|
74
|
+
updated_packages = Array.new
|
75
|
+
selected_packages = selection.each_source_package_name.map do |pkg_name|
|
76
|
+
manifest.find_autobuild_package(pkg_name)
|
77
|
+
end.to_set
|
78
|
+
|
79
|
+
# The set of all packages that are currently selected by +selection+
|
80
|
+
all_processed_packages = Set.new
|
81
|
+
# The reverse dependencies for the package tree. It is discovered as
|
82
|
+
# we go on with the import
|
83
|
+
#
|
84
|
+
# It only contains strong dependencies. Optional dependencies are
|
85
|
+
# not included, as we will use this only to take into account
|
86
|
+
# package exclusion (and that does not affect optional dependencies)
|
87
|
+
reverse_dependencies = Hash.new { |h, k| h[k] = Set.new }
|
88
|
+
|
89
|
+
package_queue = selected_packages.to_a.sort_by(&:name)
|
90
|
+
while !package_queue.empty?
|
91
|
+
pkg = package_queue.shift
|
92
|
+
# Remove packages that have already been processed
|
93
|
+
next if all_processed_packages.include?(pkg.name)
|
94
|
+
all_processed_packages << pkg.name
|
95
|
+
|
96
|
+
# Try to auto-exclude the package early. If the autobuild file
|
97
|
+
# contained some information that allows us to exclude it now,
|
98
|
+
# then let's just do it
|
99
|
+
import_next_step(pkg, reverse_dependencies)
|
100
|
+
if manifest.excluded?(pkg.name)
|
101
|
+
selection.filter_excluded_and_ignored_packages(manifest)
|
102
|
+
next
|
103
|
+
elsif manifest.ignored?(pkg.name)
|
104
|
+
next
|
105
|
+
end
|
106
|
+
|
107
|
+
# If the package has no importer, the source directory must
|
108
|
+
# be there
|
109
|
+
if !pkg.importer && !File.directory?(pkg.srcdir)
|
110
|
+
raise ConfigError.new, "#{pkg.name} has no VCS, but is not checked out in #{pkg.srcdir}"
|
111
|
+
end
|
112
|
+
|
113
|
+
## COMPLETELY BYPASS RAKE HERE
|
114
|
+
# The reason is that the ordering of import/prepare between
|
115
|
+
# packages is not important BUT the ordering of import vs.
|
116
|
+
# prepare in one package IS important: prepare is the method
|
117
|
+
# that takes into account dependencies.
|
118
|
+
pkg.import(import_options)
|
119
|
+
if pkg.updated?
|
120
|
+
updated_packages << pkg.name
|
121
|
+
end
|
122
|
+
Rake::Task["#{pkg.name}-import"].instance_variable_set(:@already_invoked, true)
|
123
|
+
manifest.load_package_manifest(pkg.name)
|
124
|
+
|
125
|
+
# The package setup mechanisms might have added an exclusion
|
126
|
+
# on this package. Handle this.
|
127
|
+
if manifest.excluded?(pkg.name)
|
128
|
+
mark_exclusion_along_revdeps(pkg.name, reverse_dependencies)
|
129
|
+
# Run a filter now, to have errors as early as possible
|
130
|
+
selection.filter_excluded_and_ignored_packages(manifest)
|
131
|
+
# Delete this package from the current_packages set
|
132
|
+
next
|
133
|
+
elsif manifest.ignored?(pkg.name)
|
134
|
+
next
|
135
|
+
end
|
136
|
+
|
137
|
+
Autoproj.each_post_import_block(pkg) do |block|
|
138
|
+
block.call(pkg)
|
139
|
+
end
|
140
|
+
pkg.update_environment
|
141
|
+
|
142
|
+
new_packages = import_next_step(pkg, reverse_dependencies)
|
143
|
+
|
144
|
+
# Excluded dependencies might have caused the package to be
|
145
|
+
# excluded as well ... do not add any dependency to the
|
146
|
+
# processing queue if it is the case
|
147
|
+
if !manifest.excluded?(pkg.name) && options[:recursive]
|
148
|
+
package_queue.concat(new_packages.sort_by(&:name))
|
149
|
+
end
|
150
|
+
|
151
|
+
# Verify that everything is still OK with the new
|
152
|
+
# exclusions/ignores
|
153
|
+
selection.filter_excluded_and_ignored_packages(manifest)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Now run optional dependency resolution. This is done now, as
|
157
|
+
# some optional dependencies might have been excluded during the
|
158
|
+
# resolution process above
|
159
|
+
all_enabled_sources, all_enabled_osdeps =
|
160
|
+
Set.new, selection.each_osdep_package_name.to_set
|
161
|
+
package_queue = selection.each_source_package_name.to_a
|
162
|
+
while !package_queue.empty?
|
163
|
+
pkg_name = package_queue.shift
|
164
|
+
next if all_enabled_sources.include?(pkg_name)
|
165
|
+
all_enabled_sources << pkg_name
|
166
|
+
|
167
|
+
pkg = manifest.find_autobuild_package(pkg_name)
|
168
|
+
packages, osdeps = pkg.partition_optional_dependencies
|
169
|
+
packages.each do |pkg_name|
|
170
|
+
if !manifest.ignored?(pkg_name) && !manifest.excluded?(pkg_name)
|
171
|
+
pkg.depends_on pkg_name
|
172
|
+
end
|
173
|
+
end
|
174
|
+
pkg.os_packages.merge(osdeps)
|
175
|
+
all_enabled_osdeps |= pkg.os_packages
|
176
|
+
|
177
|
+
pkg.prepare if !pkg.disabled?
|
178
|
+
Rake::Task["#{pkg.name}-prepare"].instance_variable_set(:@already_invoked, true)
|
179
|
+
|
180
|
+
if options[:recursive]
|
181
|
+
package_queue.concat(pkg.dependencies)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
if Autoproj.verbose
|
186
|
+
Autoproj.message "autoproj: finished importing packages"
|
187
|
+
end
|
188
|
+
|
189
|
+
if options[:warn_about_excluded_packages]
|
190
|
+
selection.exclusions.each do |sel, pkg_names|
|
191
|
+
pkg_names.sort.each do |pkg_name|
|
192
|
+
Autoproj.warn "#{pkg_name}, which was selected for #{sel}, cannot be built: #{manifest.exclusion_reason(pkg_name)}", :bold
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
if options[:warn_about_ignored_packages]
|
197
|
+
selection.ignores.each do |sel, pkg_names|
|
198
|
+
pkg_names.sort.each do |pkg_name|
|
199
|
+
Autoproj.warn "#{pkg_name}, which was selected for #{sel}, is ignored", :bold
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
return all_enabled_sources, all_enabled_osdeps
|
205
|
+
|
206
|
+
ensure
|
207
|
+
if ws.config.import_log_enabled? && !updated_packages.empty? && Autoproj::Ops::Snapshot.update_log_available?(manifest)
|
208
|
+
failure_message =
|
209
|
+
if $!
|
210
|
+
" (#{$!.message.split("\n").first})"
|
211
|
+
end
|
212
|
+
ops = Ops::Snapshot.new(ws.manifest, keep_going: true)
|
213
|
+
ops.update_package_import_state(
|
214
|
+
"#{$0} #{ARGV.join(" ")}#{failure_message}",
|
215
|
+
updated_packages)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
|