autoproj 1.13.7 → 2.0.0.b1
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/.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
@@ -0,0 +1,50 @@
|
|
1
|
+
module Autoproj
|
2
|
+
class ConfigError < RuntimeError
|
3
|
+
attr_accessor :file
|
4
|
+
def initialize(file = nil)
|
5
|
+
super
|
6
|
+
@file = file
|
7
|
+
end
|
8
|
+
end
|
9
|
+
class InternalError < RuntimeError; end
|
10
|
+
|
11
|
+
# Exception raised when trying to resolve a package name and it failed
|
12
|
+
class PackageNotFound < ConfigError
|
13
|
+
end
|
14
|
+
|
15
|
+
class InputError < RuntimeError; end
|
16
|
+
|
17
|
+
# Exception raised when a caller requires to use an excluded package
|
18
|
+
class ExcludedPackage < ConfigError
|
19
|
+
attr_reader :name
|
20
|
+
def initialize(name)
|
21
|
+
@name = name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Exception raised when an unknown package is encountered
|
26
|
+
class UnknownPackage < ConfigError
|
27
|
+
attr_reader :name
|
28
|
+
def initialize(name)
|
29
|
+
@name = name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class MissingOSDep < ConfigError; end
|
34
|
+
|
35
|
+
# Exception raised by
|
36
|
+
# PackageSelection#filter_excluded_and_ignored_packages when a given
|
37
|
+
# selection is completely excluded
|
38
|
+
class ExcludedSelection < ConfigError
|
39
|
+
attr_reader :selection
|
40
|
+
def initialize(selection)
|
41
|
+
@selection = selection
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class UserError < RuntimeError; end
|
46
|
+
|
47
|
+
class WorkspaceAlreadyCreated < RuntimeError; end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
data/lib/autoproj/gitorious.rb
CHANGED
@@ -26,8 +26,10 @@ module Autoproj
|
|
26
26
|
:ssh_url => "git@#{base_url}:",
|
27
27
|
:fallback_to_http => true,
|
28
28
|
:default => 'http,ssh',
|
29
|
-
:disabled_methods => []
|
30
|
-
|
29
|
+
:disabled_methods => [],
|
30
|
+
config: Autoproj.config
|
31
|
+
|
32
|
+
config = options.delete(:config)
|
31
33
|
disabled_methods = Array(options[:disabled_methods])
|
32
34
|
|
33
35
|
access_methods = Hash[
|
@@ -58,17 +60,17 @@ module Autoproj
|
|
58
60
|
value
|
59
61
|
end
|
60
62
|
|
61
|
-
|
63
|
+
config.declare name, 'string',
|
62
64
|
:default => options[:default],
|
63
65
|
:doc => gitorious_long_doc, &validator
|
64
66
|
|
65
|
-
access_mode =
|
67
|
+
access_mode = config.get(name)
|
66
68
|
begin
|
67
69
|
validator[access_mode]
|
68
70
|
rescue Autoproj::InputError => e
|
69
71
|
Autoproj.warn e.message
|
70
|
-
|
71
|
-
access_mode =
|
72
|
+
config.reset(name)
|
73
|
+
access_mode = config.get(name)
|
72
74
|
end
|
73
75
|
access_mode = access_methods[access_mode] || access_mode
|
74
76
|
pull, push = access_mode.split(',')
|
@@ -77,7 +79,7 @@ module Autoproj
|
|
77
79
|
elsif method == "http" then options[:http_url]
|
78
80
|
elsif method == "ssh" then options[:ssh_url]
|
79
81
|
end
|
80
|
-
|
82
|
+
config.set("#{name}#{var_suffix}", url)
|
81
83
|
end
|
82
84
|
|
83
85
|
Autoproj.add_source_handler name.downcase do |url, vcs_options|
|
@@ -87,8 +89,8 @@ module Autoproj
|
|
87
89
|
if url !~ /^\//
|
88
90
|
url = "/#{url}"
|
89
91
|
end
|
90
|
-
pull_base_url =
|
91
|
-
push_base_url =
|
92
|
+
pull_base_url = config.get("#{name}_ROOT")
|
93
|
+
push_base_url = config.get("#{name}_PUSH_ROOT")
|
92
94
|
Hash[type: 'git',
|
93
95
|
url: "#{pull_base_url}#{url}",
|
94
96
|
push_to: "#{push_base_url}#{url}",
|
data/lib/autoproj/manifest.rb
CHANGED
@@ -7,31 +7,9 @@ require 'rexml/document'
|
|
7
7
|
require 'win32/dir' if RbConfig::CONFIG["host_os"] =~%r!(msdos|mswin|djgpp|mingw|[Ww]indows)!
|
8
8
|
|
9
9
|
module Autoproj
|
10
|
-
@build_system_dependencies = Set.new
|
11
|
-
|
12
|
-
# Declare OS packages that are required to import and build the packages
|
13
|
-
#
|
14
|
-
# It is used by autoproj itself to install the importers and/or the build
|
15
|
-
# systems for the packages.
|
16
|
-
def self.add_build_system_dependency(*names)
|
17
|
-
@build_system_dependencies |= names.to_set
|
18
|
-
end
|
19
|
-
|
20
|
-
class << self
|
21
|
-
# Returns the set of OS packages that are needed to build and/or import
|
22
|
-
# the packages
|
23
|
-
#
|
24
|
-
# See Autoproj.add_build_system_dependency
|
25
|
-
attr_reader :build_system_dependencies
|
26
|
-
end
|
27
|
-
|
28
10
|
# The Manifest class represents the information included in the main
|
29
11
|
# manifest file, and allows to manipulate it
|
30
12
|
class Manifest
|
31
|
-
# The set of packages that are selected by the user, either through the
|
32
|
-
# manifest file or through the command line, as a set of package names
|
33
|
-
attr_accessor :explicit_selection
|
34
|
-
|
35
13
|
# Set the package sets that are available on this manifest
|
36
14
|
#
|
37
15
|
# This is set externally at loading time. {load_and_update_package_sets}
|
@@ -40,12 +18,6 @@ module Autoproj
|
|
40
18
|
# @return [Array<PackageSet>]
|
41
19
|
attr_writer :package_sets
|
42
20
|
|
43
|
-
# Returns true if +pkg_name+ has been explicitely selected, either by
|
44
|
-
# the command line or through the layout
|
45
|
-
def explicitly_selected_package?(pkg_name)
|
46
|
-
explicit_selection && explicit_selection.include?(pkg_name)
|
47
|
-
end
|
48
|
-
|
49
21
|
# Loads the manifest file located at +file+ and returns the Manifest
|
50
22
|
# instance that represents it
|
51
23
|
def self.load(file)
|
@@ -138,10 +110,7 @@ module Autoproj
|
|
138
110
|
@manifest_exclusions = Set.new
|
139
111
|
|
140
112
|
@constant_definitions = Hash.new
|
141
|
-
|
142
|
-
@vcs = VCSDefinition.from_raw(Autoproj.user_config('manifest_source'))
|
143
|
-
end
|
144
|
-
@package_sets << LocalPackageSet.new(self, vcs)
|
113
|
+
@package_sets << LocalPackageSet.new(self)
|
145
114
|
end
|
146
115
|
|
147
116
|
|
@@ -167,16 +136,17 @@ module Autoproj
|
|
167
136
|
end
|
168
137
|
end
|
169
138
|
|
139
|
+
# Enumerates the package names of all ignored packages
|
140
|
+
def each_excluded_package
|
141
|
+
each_autobuild_package do |pkg|
|
142
|
+
yield(pkg) if excluded?(pkg.name)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
170
146
|
# Enumerates the package names of all ignored packages
|
171
147
|
def each_ignored_package
|
172
|
-
|
173
|
-
if
|
174
|
-
pkg_set.each_package do |pkg|
|
175
|
-
yield(pkg.name)
|
176
|
-
end
|
177
|
-
else
|
178
|
-
yield(l)
|
179
|
-
end
|
148
|
+
each_autobuild_package do |pkg|
|
149
|
+
yield(pkg) if ignored?(pkg.name)
|
180
150
|
end
|
181
151
|
end
|
182
152
|
|
@@ -346,7 +316,9 @@ module Autoproj
|
|
346
316
|
|
347
317
|
# Load the package set information
|
348
318
|
def load_and_update_package_sets
|
349
|
-
|
319
|
+
Autoproj.warn_deprecated __method__,
|
320
|
+
"use Ops::Configuration instead"
|
321
|
+
Ops::Configuration.new(Autoproj.workspace).load_and_update_package_sets
|
350
322
|
end
|
351
323
|
|
352
324
|
# Returns a package set that is used by autoproj for its own purposes
|
@@ -403,22 +375,26 @@ module Autoproj
|
|
403
375
|
end
|
404
376
|
end
|
405
377
|
|
406
|
-
def find_package_definition(name)
|
407
|
-
packages[name]
|
408
|
-
end
|
409
|
-
|
410
378
|
def find_package(name)
|
411
|
-
|
379
|
+
if name.respond_to?(:name)
|
380
|
+
name = name.name
|
381
|
+
end
|
382
|
+
|
383
|
+
packages[name.to_str]
|
412
384
|
end
|
413
385
|
|
414
386
|
def find_autobuild_package(name)
|
415
|
-
if
|
387
|
+
if name.respond_to?(:name)
|
388
|
+
name = name.name
|
389
|
+
end
|
390
|
+
|
391
|
+
if pkg = packages[name.to_str]
|
416
392
|
pkg.autobuild
|
417
393
|
end
|
418
394
|
end
|
419
395
|
|
420
396
|
def package(name)
|
421
|
-
|
397
|
+
find_package(name)
|
422
398
|
end
|
423
399
|
|
424
400
|
# @deprecated use {each_autobuild_package} instead
|
@@ -449,16 +425,19 @@ module Autoproj
|
|
449
425
|
# @deprecated use Ops::Tools.create_autobuild_package or include
|
450
426
|
# Ops::Tools into your class to get it as instance method
|
451
427
|
def self.create_autobuild_package(vcs, text_name, into)
|
428
|
+
Autoproj.warn_deprecated __method__, "use Ops::Tools.create_autobuild_package instead"
|
452
429
|
Ops::Tools.create_autobuild_package(vcs, text_name, into)
|
453
430
|
end
|
454
431
|
|
455
432
|
# @deprecated use Ops::Configuration#update_main_configuration
|
456
433
|
def update_yourself(only_local = false)
|
457
|
-
Ops::Configuration
|
434
|
+
Autoproj.warn_deprecated __method__, "use Ops::Configuration instead"
|
435
|
+
Ops::Configuration.new(Autoproj.workspace).update_main_configuration(only_local)
|
458
436
|
end
|
459
437
|
|
460
438
|
# @deprecated use Ops::Configuration.update_remote_package_set
|
461
439
|
def update_remote_set(vcs, only_local = false)
|
440
|
+
Autoproj.warn_deprecated __method__, "use Ops::Configuration instead"
|
462
441
|
Ops::Configuration.update_remote_package_set(vcs, only_local)
|
463
442
|
end
|
464
443
|
|
@@ -469,21 +448,34 @@ module Autoproj
|
|
469
448
|
# given package, defaults to the package's definition source (as
|
470
449
|
# returned by {definition_package_set}) if not given
|
471
450
|
# @return [VCSDefinition] the VCS definition object
|
472
|
-
def importer_definition_for(package_name,
|
473
|
-
|
451
|
+
def importer_definition_for(package_name, package_set = definition_package_set(package_name),
|
452
|
+
options = Hash.new)
|
453
|
+
options = validate_options options, mainline: nil
|
454
|
+
mainline =
|
455
|
+
if options[:mainline] == true
|
456
|
+
package_set
|
457
|
+
else
|
458
|
+
options[:mainline]
|
459
|
+
end
|
460
|
+
|
461
|
+
vcs = package_set.importer_definition_for(package_name)
|
474
462
|
return if !vcs
|
475
463
|
|
476
464
|
# Get the sets that come *after* the one that defines the package to
|
477
465
|
# apply the overrides
|
478
466
|
package_sets = each_package_set.to_a.dup
|
479
|
-
while !package_sets.empty? && package_sets.first !=
|
480
|
-
package_sets.shift
|
467
|
+
while !package_sets.empty? && package_sets.first != package_set
|
468
|
+
set = package_sets.shift
|
469
|
+
return vcs if set == mainline
|
481
470
|
end
|
482
|
-
package_sets.shift
|
471
|
+
set = package_sets.shift
|
472
|
+
return vcs if set == mainline
|
483
473
|
|
484
474
|
# Then apply the overrides
|
485
475
|
package_sets.inject(vcs) do |updated_vcs, pkg_set|
|
486
|
-
pkg_set.overrides_for(package_name, updated_vcs)
|
476
|
+
updated_vcs = pkg_set.overrides_for(package_name, updated_vcs)
|
477
|
+
return updated_vcs if pkg_set == mainline
|
478
|
+
updated_vcs
|
487
479
|
end
|
488
480
|
end
|
489
481
|
|
@@ -503,13 +495,13 @@ module Autoproj
|
|
503
495
|
# * S1 must have a VCS line for P
|
504
496
|
# * S0 can have a VCS line for P, which would override the one defined
|
505
497
|
# by S1
|
506
|
-
def load_importers
|
498
|
+
def load_importers(options = Hash.new)
|
507
499
|
packages.each_value do |pkg|
|
508
|
-
vcs = importer_definition_for(pkg.autobuild.name, pkg.package_set) ||
|
500
|
+
vcs = importer_definition_for(pkg.autobuild.name, pkg.package_set, options) ||
|
509
501
|
pkg.package_set.default_importer
|
510
502
|
|
503
|
+
|
511
504
|
if vcs
|
512
|
-
Autoproj.add_build_system_dependency vcs.type
|
513
505
|
pkg.vcs = vcs
|
514
506
|
pkg.autobuild.importer = vcs.create_autobuild_importer
|
515
507
|
else
|
@@ -535,7 +527,7 @@ module Autoproj
|
|
535
527
|
# Returns the PackageSet object for the given package set, or raises
|
536
528
|
# ArgumentError if none exists with that name
|
537
529
|
def package_set(name)
|
538
|
-
set = each_package_set
|
530
|
+
set = each_package_set.find { |set| set.name == name }
|
539
531
|
if !set
|
540
532
|
raise ArgumentError, "no package set called #{name} exists"
|
541
533
|
end
|
@@ -546,14 +538,6 @@ module Autoproj
|
|
546
538
|
each_package_set.find(&:main?)
|
547
539
|
end
|
548
540
|
|
549
|
-
# Exception raised when a caller requires to use an excluded package
|
550
|
-
class ExcludedPackage < ConfigError
|
551
|
-
attr_reader :name
|
552
|
-
def initialize(name)
|
553
|
-
@name = name
|
554
|
-
end
|
555
|
-
end
|
556
|
-
|
557
541
|
# Resolves the given +name+, where +name+ can either be the name of a
|
558
542
|
# source or the name of a package.
|
559
543
|
#
|
@@ -562,18 +546,20 @@ module Autoproj
|
|
562
546
|
# [type, package_name]
|
563
547
|
#
|
564
548
|
# where +type+ can either be :package or :osdeps (as symbols)
|
565
|
-
|
566
|
-
# The returned array can be empty if +name+ is an ignored package
|
567
|
-
def resolve_package_name(name, options = Hash.new)
|
549
|
+
def resolve_package_name(name)
|
568
550
|
if pkg_set = find_metapackage(name)
|
569
551
|
pkg_names = pkg_set.each_package.map(&:name)
|
570
552
|
else
|
571
|
-
pkg_names = [name]
|
553
|
+
pkg_names = [name.to_str]
|
572
554
|
end
|
573
555
|
|
574
556
|
result = []
|
575
557
|
pkg_names.each do |pkg|
|
576
|
-
|
558
|
+
begin
|
559
|
+
result.concat(resolve_single_package_name(pkg))
|
560
|
+
rescue PackageNotFound
|
561
|
+
raise PackageNotFound, "cannot resolve #{pkg}: it is not a package, not a metapackage and not an osdep"
|
562
|
+
end
|
577
563
|
end
|
578
564
|
result
|
579
565
|
end
|
@@ -591,7 +577,7 @@ module Autoproj
|
|
591
577
|
next if result.include?(pkg_name)
|
592
578
|
result << pkg_name
|
593
579
|
|
594
|
-
pkg =
|
580
|
+
pkg = find_autobuild_package(pkg_name)
|
595
581
|
pkg.dependencies.each do |dep_name|
|
596
582
|
queue << dep_name
|
597
583
|
end
|
@@ -604,83 +590,62 @@ module Autoproj
|
|
604
590
|
#
|
605
591
|
# This is a helper method for #resolve_package_name. Do not use
|
606
592
|
# directly
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
begin
|
619
|
-
source_packages = source_packages.inject([]) do |result, src_pkg_name|
|
620
|
-
result.concat(resolve_package_name(src_pkg_name))
|
621
|
-
end.uniq
|
622
|
-
available_as_source = true
|
623
|
-
rescue ExcludedPackage
|
624
|
-
force_source_usage = false
|
625
|
-
available_as_source = false
|
626
|
-
end
|
627
|
-
|
628
|
-
if source_packages.empty?
|
629
|
-
source_packages << [:package, name]
|
630
|
-
end
|
593
|
+
#
|
594
|
+
# @return [nil,Array] either nil if there is no such osdep, or a list of
|
595
|
+
# (type, package_name) pairs where type is either :package or :osdep and
|
596
|
+
# package_name the corresponding package name
|
597
|
+
def resolve_single_package_name(name)
|
598
|
+
resolve_package_name_as_osdep(name)
|
599
|
+
rescue PackageNotFound => osdep_error
|
600
|
+
begin
|
601
|
+
resolve_package_name_as_source_package(name)
|
602
|
+
rescue PackageNotFound
|
603
|
+
raise PackageNotFound, "#{osdep_error} and it cannot be resolved as a source package"
|
631
604
|
end
|
605
|
+
end
|
632
606
|
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
if osdeps_availability == Autoproj::OSDependencies::AVAILABLE
|
637
|
-
return [[:osdeps, name]]
|
638
|
-
elsif osdeps_availability == Autoproj::OSDependencies::IGNORE
|
639
|
-
return []
|
640
|
-
end
|
641
|
-
|
642
|
-
if osdeps_availability == Autoproj::OSDependencies::UNKNOWN_OS
|
643
|
-
# If we can't handle that OS, but other OSes have a
|
644
|
-
# definition for it, we assume that it can be installed as
|
645
|
-
# an external package. However, if it is also available as a
|
646
|
-
# source package, prompt the user
|
647
|
-
if !available_as_source || explicit_osdeps_selection(name)
|
648
|
-
return [[:osdeps, name]]
|
649
|
-
end
|
650
|
-
end
|
651
|
-
|
652
|
-
# No source, no osdeps.
|
653
|
-
# If the package is ignored by the manifest, just return empty.
|
654
|
-
# Otherwise, generate a proper error message
|
655
|
-
# Call osdeps again, but this time to get
|
656
|
-
# a proper error message.
|
657
|
-
if !available_as_source
|
658
|
-
if ignored?(name)
|
659
|
-
return []
|
660
|
-
end
|
661
|
-
begin
|
662
|
-
osdeps.resolve_os_dependencies([name].to_set)
|
663
|
-
rescue Autoproj::ConfigError => e
|
664
|
-
if osdeps_availability != Autoproj::OSDependencies::NO_PACKAGE && !osdeps.os_package_handler.enabled?
|
665
|
-
if !@ignored_os_dependencies.include?(name)
|
666
|
-
Autoproj.warn "some package depends on the #{name} osdep: #{e.message}"
|
667
|
-
Autoproj.warn "this osdeps dependency is simply ignored as you asked autoproj to not install osdeps packages"
|
668
|
-
@ignored_os_dependencies << name
|
669
|
-
end
|
670
|
-
# We are not asked to install OS packages, just ignore
|
671
|
-
return []
|
672
|
-
end
|
673
|
-
raise
|
674
|
-
end
|
675
|
-
# Should never reach further than that
|
676
|
-
end
|
677
|
-
elsif !available_as_source
|
678
|
-
raise ConfigError, "cannot resolve #{name}: it is not a package, not a metapackage and not an osdeps"
|
679
|
-
end
|
680
|
-
if source_packages
|
681
|
-
return source_packages
|
607
|
+
def resolve_package_name_as_source_package(name)
|
608
|
+
if pkg = find_autobuild_package(name)
|
609
|
+
return [[:package, pkg.name]]
|
682
610
|
else
|
683
|
-
|
611
|
+
raise PackageNotFound, "cannot resolve #{name}: it is neither a package nor an osdep"
|
612
|
+
end
|
613
|
+
end
|
614
|
+
|
615
|
+
# @api private
|
616
|
+
#
|
617
|
+
# Resolve a potential osdep name, either as the osdep itself, or as
|
618
|
+
# source packages that are used as osdep override
|
619
|
+
#
|
620
|
+
# @return [nil,Array] either nil if there is no such osdep, or a list of
|
621
|
+
# (type, package_name) pairs where type is either :package or :osdep and
|
622
|
+
# package_name the corresponding package name
|
623
|
+
def resolve_package_name_as_osdep(name)
|
624
|
+
osdeps_availability = osdeps.availability_of(name)
|
625
|
+
if osdeps_availability == Autoproj::OSDependencies::NO_PACKAGE
|
626
|
+
raise PackageNotFound, "cannot resolve #{name}: it is not an osdep"
|
627
|
+
end
|
628
|
+
|
629
|
+
# There is an osdep definition for this package, check the
|
630
|
+
# overrides
|
631
|
+
osdeps_available =
|
632
|
+
(osdeps_availability == OSDependencies::AVAILABLE) ||
|
633
|
+
(osdeps_availability == OSDependencies::IGNORE)
|
634
|
+
osdeps_overrides = self.osdeps_overrides[name]
|
635
|
+
if osdeps_overrides && (!osdeps_available || osdeps_overrides[:force])
|
636
|
+
source_packages = osdeps_overrides[:packages].inject([]) do |result, src_pkg_name|
|
637
|
+
result.concat(resolve_package_name_as_source_package(src_pkg_name))
|
638
|
+
end.uniq
|
639
|
+
elsif !osdeps_available && (pkg = find_autobuild_package(name))
|
640
|
+
return [[:package, pkg.name]]
|
641
|
+
elsif osdeps_available
|
642
|
+
return [[:osdeps, name]]
|
643
|
+
elsif osdeps_availability == OSDependencies::WRONG_OS
|
644
|
+
raise PackageNotFound, "#{name} is an osdep, but it is not available for this operating system"
|
645
|
+
elsif osdeps_availability == OSDependencies::UNKNOWN_OS
|
646
|
+
raise PackageNotFound, "#{name} is an osdep, but the local operating system is unavailable"
|
647
|
+
elsif osdeps_availability == OSDependencies::NONEXISTENT
|
648
|
+
raise PackageNotFound, "#{name} is an osdep, but it is explicitely marked as 'nonexistent' for this operating system"
|
684
649
|
end
|
685
650
|
end
|
686
651
|
|
@@ -688,7 +653,7 @@ module Autoproj
|
|
688
653
|
# the first case, we return all packages defined by that source. In the
|
689
654
|
# latter case, we return the singleton array [name]
|
690
655
|
def resolve_package_set(name)
|
691
|
-
if
|
656
|
+
if find_autobuild_package(name)
|
692
657
|
[name]
|
693
658
|
else
|
694
659
|
pkg_set = find_metapackage(name)
|
@@ -721,7 +686,7 @@ module Autoproj
|
|
721
686
|
packages.each do |pkg_name|
|
722
687
|
package_names = resolve_package_set(pkg_name)
|
723
688
|
package_names.each do |pkg_name|
|
724
|
-
meta.add(
|
689
|
+
meta.add(find_autobuild_package(pkg_name))
|
725
690
|
end
|
726
691
|
end
|
727
692
|
|
@@ -752,7 +717,7 @@ module Autoproj
|
|
752
717
|
end
|
753
718
|
|
754
719
|
|
755
|
-
result.select(pkg_or_set, resolve_package_set(pkg_or_set), weak)
|
720
|
+
result.select(pkg_or_set, resolve_package_set(pkg_or_set), weak: weak)
|
756
721
|
rescue UnknownPackage => e
|
757
722
|
raise e, "#{e.name}, which is selected in the layout, is unknown: #{e.message}", e.backtrace
|
758
723
|
end
|
@@ -787,7 +752,7 @@ module Autoproj
|
|
787
752
|
|
788
753
|
# Returns all defined package names, minus the excluded and ignored ones
|
789
754
|
def all_package_names
|
790
|
-
|
755
|
+
each_autobuild_package.map(&:name)
|
791
756
|
end
|
792
757
|
|
793
758
|
# Returns all the packages that can be built in this installation
|
@@ -808,7 +773,7 @@ module Autoproj
|
|
808
773
|
# If it is false, the method will simply return false on non-defined
|
809
774
|
# packages
|
810
775
|
def package_enabled?(name, validate = true)
|
811
|
-
if !
|
776
|
+
if !find_autobuild_package(name) && !osdeps.has?(name)
|
812
777
|
if validate
|
813
778
|
raise ArgumentError, "package #{name} does not exist"
|
814
779
|
end
|
@@ -835,9 +800,9 @@ module Autoproj
|
|
835
800
|
# Returns the set of packages that are selected by the layout
|
836
801
|
def all_selected_packages(validate = true)
|
837
802
|
result = Set.new
|
838
|
-
root = default_packages(validate).
|
803
|
+
root = default_packages(validate).source_packages.to_set
|
839
804
|
root.each do |pkg_name|
|
840
|
-
|
805
|
+
find_autobuild_package(pkg_name).all_dependencies(result)
|
841
806
|
end
|
842
807
|
result | root
|
843
808
|
end
|
@@ -971,7 +936,7 @@ module Autoproj
|
|
971
936
|
required_os_packages = Set.new
|
972
937
|
package_os_deps = Hash.new { |h, k| h[k] = Array.new }
|
973
938
|
packages.each do |pkg_name|
|
974
|
-
pkg =
|
939
|
+
pkg = find_autobuild_package(pkg_name)
|
975
940
|
if !pkg
|
976
941
|
raise InternalError, "internal error: #{pkg_name} is not a package"
|
977
942
|
end
|
@@ -1013,11 +978,11 @@ module Autoproj
|
|
1013
978
|
end
|
1014
979
|
|
1015
980
|
# Installs the OS dependencies that are required by the given packages
|
1016
|
-
def install_os_dependencies(packages)
|
981
|
+
def install_os_dependencies(packages, options = Hash.new)
|
1017
982
|
required_os_packages, package_os_deps = list_os_dependencies(packages)
|
1018
983
|
required_os_packages =
|
1019
984
|
filter_os_dependencies(required_os_packages, package_os_deps)
|
1020
|
-
osdeps.install(required_os_packages)
|
985
|
+
osdeps.install(required_os_packages, options)
|
1021
986
|
end
|
1022
987
|
|
1023
988
|
# The set of overrides added with #add_osdeps_overrides
|
@@ -1038,10 +1003,12 @@ module Autoproj
|
|
1038
1003
|
# The :force option allows to force the usage of the source package(s),
|
1039
1004
|
# regardless of the availability of the osdeps package.
|
1040
1005
|
def add_osdeps_overrides(osdeps_name, options)
|
1041
|
-
options = Kernel.validate_options options, :
|
1006
|
+
options = Kernel.validate_options options, package: osdeps_name, packages: [], force: false
|
1042
1007
|
if pkg = options.delete(:package)
|
1043
1008
|
options[:packages] << pkg
|
1044
1009
|
end
|
1010
|
+
packages = options[:packages]
|
1011
|
+
packages.each { |pkg_name| resolve_package_name(pkg_name) }
|
1045
1012
|
@osdeps_overrides[osdeps_name.to_s] = options
|
1046
1013
|
end
|
1047
1014
|
|
@@ -1051,95 +1018,99 @@ module Autoproj
|
|
1051
1018
|
@osdeps_overrides.delete(osdeps_name.to_s)
|
1052
1019
|
end
|
1053
1020
|
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1021
|
+
PackageSelection = Autoproj::PackageSelection
|
1022
|
+
|
1023
|
+
# @api private
|
1024
|
+
#
|
1025
|
+
# Helper for {#expand_package_selection}
|
1026
|
+
def update_selection(selection, user_selection_string, name, weak)
|
1027
|
+
source_packages, osdeps = Array.new, Array.new
|
1028
|
+
resolve_package_name(name).each do |type, resolved_name|
|
1029
|
+
if type == :package
|
1030
|
+
source_packages << resolved_name
|
1031
|
+
else
|
1032
|
+
osdeps << resolved_name
|
1033
|
+
end
|
1034
|
+
end
|
1035
|
+
if !source_packages.empty?
|
1036
|
+
selection.select(user_selection_string, source_packages, osdep: false, weak: weak)
|
1037
|
+
end
|
1038
|
+
if !osdeps.empty?
|
1039
|
+
selection.select(user_selection_string, osdeps, osdep: true, weak: weak)
|
1059
1040
|
end
|
1060
1041
|
end
|
1061
1042
|
|
1062
|
-
|
1063
|
-
|
1064
|
-
# Package selection can be done in three ways:
|
1065
|
-
# * as a subdirectory in the layout
|
1066
|
-
# * as a on-disk directory
|
1067
|
-
# * as a package name
|
1043
|
+
# Normalizes package selection strings into a PackageSelection object
|
1068
1044
|
#
|
1069
|
-
#
|
1045
|
+
# @param [Array<String>] selection the package selection strings. For
|
1046
|
+
# source packages, it can either be the package name, a package set
|
1047
|
+
# name, or a prefix of the package's source directory. For osdeps, it
|
1048
|
+
# has to be the plain package name
|
1049
|
+
# @return [PackageSelection, Array<String>]
|
1070
1050
|
def expand_package_selection(selection, options = Hash.new)
|
1071
1051
|
options = Kernel.validate_options options, filter: true
|
1072
|
-
|
1073
1052
|
result = PackageSelection.new
|
1074
1053
|
|
1075
|
-
# All the packages that are available on this installation
|
1076
|
-
all_layout_packages = self.all_selected_packages
|
1077
|
-
|
1078
1054
|
# First, remove packages that are directly referenced by name or by
|
1079
|
-
# package set names
|
1055
|
+
# package set names. When it comes to packages (NOT package sets),
|
1056
|
+
# we prefer the ones selected in the layout
|
1057
|
+
all_selected_packages = self.all_selected_packages
|
1058
|
+
candidates = all_selected_packages.to_a +
|
1059
|
+
each_metapackage.map { |metapkg| [metapkg.name, metapkg.weak_dependencies?] }
|
1080
1060
|
selection.each do |sel|
|
1081
1061
|
match_pkg_name = Regexp.new(Regexp.quote(sel))
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
to_set
|
1086
|
-
if !packages.empty?
|
1087
|
-
result.select(sel, packages, true)
|
1088
|
-
end
|
1089
|
-
|
1090
|
-
each_metapackage do |pkg|
|
1091
|
-
if pkg.name =~ match_pkg_name
|
1092
|
-
packages = resolve_package_set(pkg.name).to_set
|
1093
|
-
packages = (packages & all_layout_packages)
|
1094
|
-
result.select(sel, packages, pkg.weak_dependencies?)
|
1095
|
-
end
|
1062
|
+
candidates.each do |name, weak|
|
1063
|
+
next if name !~ match_pkg_name
|
1064
|
+
update_selection(result, sel, name, true)
|
1096
1065
|
end
|
1097
1066
|
end
|
1098
1067
|
|
1099
|
-
pending_selections = Hash.new
|
1100
|
-
|
1101
|
-
# Finally, check for package source directories
|
1102
|
-
all_packages = self.all_package_names
|
1103
|
-
all_osdeps_packages = osdeps.all_package_names
|
1068
|
+
pending_selections = Hash.new { |h, k| h[k] = Array.new }
|
1104
1069
|
|
1070
|
+
# Finally, check for partial matches
|
1071
|
+
all_source_package_names = self.all_package_names
|
1072
|
+
all_osdeps_package_names = osdeps.all_package_names
|
1105
1073
|
selection.each do |sel|
|
1106
1074
|
match_pkg_name = Regexp.new(Regexp.quote(sel))
|
1107
|
-
|
1108
|
-
|
1075
|
+
all_matches = Array.new
|
1076
|
+
all_source_package_names.each do |pkg_name|
|
1077
|
+
pkg = find_autobuild_package(pkg_name)
|
1109
1078
|
if pkg_name =~ match_pkg_name ||
|
1110
1079
|
"#{sel}/" =~ Regexp.new("^#{Regexp.quote(pkg.srcdir)}/") ||
|
1111
1080
|
pkg.srcdir =~ Regexp.new("^#{Regexp.quote(sel)}")
|
1112
|
-
[pkg_name, (pkg_name == sel || pkg.srcdir == sel)]
|
1081
|
+
all_matches << [pkg_name, (pkg_name == sel || pkg.srcdir == sel)]
|
1113
1082
|
end
|
1114
|
-
end
|
1115
|
-
|
1083
|
+
end
|
1084
|
+
all_osdeps_package_names.each do |pkg_name|
|
1116
1085
|
if pkg_name =~ match_pkg_name
|
1117
|
-
[pkg_name, pkg_name == sel]
|
1086
|
+
all_matches << [pkg_name, pkg_name == sel]
|
1118
1087
|
end
|
1119
|
-
end
|
1088
|
+
end
|
1120
1089
|
|
1121
|
-
|
1122
|
-
#
|
1090
|
+
all_matches.each do |pkg_name, exact_match|
|
1091
|
+
# Select packages that are not in the manifest only
|
1123
1092
|
# if they are explicitely selected. However, we do store
|
1124
1093
|
# them as "possible resolutions" for the user selection,
|
1125
1094
|
# and add them if -- at the end of the method -- nothing
|
1126
1095
|
# has been found for this particular selection
|
1127
|
-
if !
|
1128
|
-
pending_selections[sel]
|
1129
|
-
|
1096
|
+
if !all_selected_packages.include?(pkg_name) && !exact_match
|
1097
|
+
pending_selections[sel] << pkg_name
|
1098
|
+
else
|
1099
|
+
update_selection(result, sel, pkg_name, true)
|
1130
1100
|
end
|
1131
|
-
|
1132
|
-
result.select(sel, pkg_name, true)
|
1133
1101
|
end
|
1134
1102
|
end
|
1135
1103
|
|
1136
1104
|
if options[:filter]
|
1137
1105
|
result.filter_excluded_and_ignored_packages(self)
|
1138
1106
|
end
|
1107
|
+
|
1139
1108
|
nonresolved = selection - result.matches.keys
|
1140
1109
|
nonresolved.delete_if do |sel|
|
1141
|
-
if
|
1142
|
-
|
1110
|
+
if pending = pending_selections.fetch(sel, nil)
|
1111
|
+
pending.each do |name|
|
1112
|
+
update_selection(result, sel, name, true)
|
1113
|
+
end
|
1143
1114
|
true
|
1144
1115
|
end
|
1145
1116
|
end
|
@@ -1218,34 +1189,31 @@ module Autoproj
|
|
1218
1189
|
end
|
1219
1190
|
end
|
1220
1191
|
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
#
|
1225
|
-
# @return [Manifest]
|
1226
|
-
attr_accessor :manifest
|
1192
|
+
def self.manifest
|
1193
|
+
Autoproj.warn_deprecated(
|
1194
|
+
__method__, "use workspace.manifest instead")
|
1227
1195
|
|
1228
|
-
|
1229
|
-
|
1230
|
-
# @return [OSDependencies]
|
1231
|
-
# @see load_osdeps_from_package_sets
|
1232
|
-
def osdeps
|
1233
|
-
manifest.osdeps
|
1234
|
-
end
|
1196
|
+
workspace.manifest
|
1197
|
+
end
|
1235
1198
|
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1199
|
+
def self.osdeps
|
1200
|
+
Autoproj.warn_deprecated(
|
1201
|
+
__method__, "use workspace.osdeps instead")
|
1202
|
+
|
1203
|
+
workspace.osdeps
|
1204
|
+
end
|
1205
|
+
|
1206
|
+
def self.config
|
1207
|
+
Autoproj.warn_deprecated(
|
1208
|
+
__method__, "use workspace.config instead")
|
1239
1209
|
|
1240
|
-
|
1241
|
-
# @return [Configuration]
|
1242
|
-
attr_accessor :config
|
1210
|
+
workspace.config
|
1243
1211
|
end
|
1244
1212
|
|
1245
1213
|
# Load the osdeps files contained in {manifest} into {osdeps}
|
1246
1214
|
def self.load_osdeps_from_package_sets
|
1247
|
-
|
1248
|
-
osdeps
|
1215
|
+
workspace.load_osdeps_from_package_sets(osdeps)
|
1216
|
+
workspace.osdeps
|
1249
1217
|
end
|
1250
1218
|
|
1251
1219
|
def self.add_osdeps_overrides(*args, &block)
|