autoproj 2.0.0.b6 → 2.0.0.b7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/autoproj +3 -0
- data/bin/autoproj_bootstrap +22 -3
- data/lib/autoproj/autobuild.rb +94 -11
- data/lib/autoproj/cli.rb +6 -0
- data/lib/autoproj/cli/build.rb +5 -2
- data/lib/autoproj/cli/locate.rb +2 -2
- data/lib/autoproj/cli/main.rb +7 -0
- data/lib/autoproj/cli/osdeps.rb +1 -12
- data/lib/autoproj/cli/status.rb +49 -16
- data/lib/autoproj/cli/versions.rb +5 -6
- data/lib/autoproj/configuration.rb +9 -0
- data/lib/autoproj/ops/build.rb +2 -2
- data/lib/autoproj/ops/configuration.rb +38 -32
- data/lib/autoproj/ops/import.rb +3 -2
- data/lib/autoproj/ops/snapshot.rb +23 -7
- data/lib/autoproj/osdeps.rb +13 -3
- data/lib/autoproj/package_set.rb +7 -2
- data/lib/autoproj/reporter.rb +0 -3
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +6 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e73644d1f3143dffe36b4af50d2f9dbdc348e8a3
|
4
|
+
data.tar.gz: 0ec902c6207a631ff578403a74e39eb6b72413ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4374b8c9855e3a85af8e1d0eb36d233e56d592ff046adc9eeb6405d2b229f0aa60221bdbc5e5f70a6e73ff67c0ec1c2064d3931dda661e9e5f32817f888bff76
|
7
|
+
data.tar.gz: d99c1417e26934cc5ebd0d2c55c1102a99e89ba10800aa593dbc21cbbc49deeb54ca0a9bcf3f714c62fe80e62b7b3ff342b3bda6ca31ad1691f687be718726d3
|
data/bin/autoproj
CHANGED
data/bin/autoproj_bootstrap
CHANGED
@@ -385,6 +385,15 @@ module Autoproj
|
|
385
385
|
set('import_log_enabled', !!value)
|
386
386
|
end
|
387
387
|
|
388
|
+
def parallel_build_level
|
389
|
+
get('parallel_build_level', nil) || Autobuild.parallel_build_level
|
390
|
+
end
|
391
|
+
|
392
|
+
def parallel_build_level=(level)
|
393
|
+
set('parallel_build_level', level)
|
394
|
+
Autobuild.parallel_build_level = level
|
395
|
+
end
|
396
|
+
|
388
397
|
def parallel_import_level
|
389
398
|
get('parallel_import_level', 10)
|
390
399
|
end
|
@@ -1253,11 +1262,21 @@ fi
|
|
1253
1262
|
end
|
1254
1263
|
|
1255
1264
|
ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
1265
|
+
ruby_bindir = RbConfig::CONFIG['bindir']
|
1266
|
+
|
1267
|
+
candidates = ['gem']
|
1256
1268
|
if ruby_bin =~ /^ruby(.+)$/
|
1257
|
-
|
1258
|
-
else
|
1259
|
-
Autobuild.programs['gem'] = "gem"
|
1269
|
+
candidates << "gem#{$1}"
|
1260
1270
|
end
|
1271
|
+
|
1272
|
+
candidates.each do |gem_name|
|
1273
|
+
if File.file?(gem_full_path = File.join(ruby_bindir, gem_name))
|
1274
|
+
Autobuild.programs['gem'] = gem_full_path
|
1275
|
+
return
|
1276
|
+
end
|
1277
|
+
end
|
1278
|
+
|
1279
|
+
raise ArgumentError, "cannot find a gem program (tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
|
1261
1280
|
end
|
1262
1281
|
|
1263
1282
|
def build_gem_cmdlines(gems)
|
data/lib/autoproj/autobuild.rb
CHANGED
@@ -538,8 +538,88 @@ def user_config(key)
|
|
538
538
|
end
|
539
539
|
|
540
540
|
class Autobuild::Git
|
541
|
-
#
|
542
|
-
|
541
|
+
# Get version information
|
542
|
+
#
|
543
|
+
# @option options [Boolean] local (true) whether the snapshot should access
|
544
|
+
# the remote repository to determine if the local commit is there, and
|
545
|
+
# determine what would be the best remote branch, or stick to information
|
546
|
+
# that is present locally
|
547
|
+
# @option options [Boolean] exact_state (true) whether the snapshot should
|
548
|
+
# point to a specific commit (either with a tag or with a commit ID), or
|
549
|
+
# only override the branch
|
550
|
+
# @return [Hash] the snapshot information, in a format that can be used by
|
551
|
+
# {#relocate}
|
552
|
+
def snapshot(package, target_dir = nil, options = Hash.new)
|
553
|
+
options = Kernel.validate_options options,
|
554
|
+
local: true,
|
555
|
+
exact_state: true
|
556
|
+
|
557
|
+
if options[:local]
|
558
|
+
snapshot_local(package, exact_state: options[:exact_state])
|
559
|
+
else
|
560
|
+
snapshot_against_remote(package, exact_state: options[:exact_state])
|
561
|
+
end
|
562
|
+
end
|
563
|
+
|
564
|
+
def normalize_branch_name(name)
|
565
|
+
if name =~ /^refs\/heads\//
|
566
|
+
return name
|
567
|
+
else
|
568
|
+
"refs/heads/#{name}"
|
569
|
+
end
|
570
|
+
end
|
571
|
+
|
572
|
+
# Returns true if the given snapshot information is different from the
|
573
|
+
# configured importer state
|
574
|
+
#
|
575
|
+
# It tests only against the parameters returned by {#snapshot}
|
576
|
+
def snapshot_overrides?(snapshot)
|
577
|
+
# We have to normalize the branch and tag names
|
578
|
+
if snapshot_local = (snapshot['local_branch'] || snapshot['branch'])
|
579
|
+
snapshot_local = normalize_branch_name(snapshot_local)
|
580
|
+
local_branch = normalize_branch_name(self.local_branch)
|
581
|
+
return true if snapshot_local != local_branch
|
582
|
+
end
|
583
|
+
if snapshot_remote = (snapshot['remote_branch'] || snapshot['branch'])
|
584
|
+
snapshot_remote = normalize_branch_name(snapshot_remote)
|
585
|
+
remote_branch = normalize_branch_name(self.remote_branch)
|
586
|
+
return true if snapshot_remote != remote_branch
|
587
|
+
end
|
588
|
+
if snapshot_id = snapshot['commit']
|
589
|
+
return true if self.commit != snapshot_id
|
590
|
+
end
|
591
|
+
false
|
592
|
+
end
|
593
|
+
|
594
|
+
# @api private
|
595
|
+
def snapshot_against_remote(package, options = Hash.new)
|
596
|
+
info = Hash['tag' => nil, 'commit' => nil]
|
597
|
+
remote_revname = describe_commit_on_remote(package, 'HEAD', tags: options[:exact_state])
|
598
|
+
|
599
|
+
case remote_revname
|
600
|
+
when /^refs\/heads\/(.*)/
|
601
|
+
remote_branch = $1
|
602
|
+
if local_branch == remote_branch
|
603
|
+
info['branch'] = local_branch
|
604
|
+
else
|
605
|
+
info['local_branch'] = local_branch
|
606
|
+
info['remote_branch'] = remote_branch
|
607
|
+
end
|
608
|
+
when /^refs\/tags\/(.*)/
|
609
|
+
info['tag'] = $1
|
610
|
+
else
|
611
|
+
info['local_branch'] = local_branch
|
612
|
+
info['remote_branch'] = remote_revname
|
613
|
+
end
|
614
|
+
|
615
|
+
if options[:exact_state] && !info['tag']
|
616
|
+
info['commit'] = rev_parse(package, 'HEAD')
|
617
|
+
end
|
618
|
+
info
|
619
|
+
end
|
620
|
+
|
621
|
+
# @api private
|
622
|
+
def snapshot_local(package, options = Hash.new)
|
543
623
|
info = Hash.new
|
544
624
|
if local_branch != remote_branch
|
545
625
|
info['local_branch'] = local_branch
|
@@ -547,26 +627,29 @@ class Autobuild::Git
|
|
547
627
|
else
|
548
628
|
info['branch'] = branch
|
549
629
|
end
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
630
|
+
|
631
|
+
if options[:exact_state]
|
632
|
+
has_tag, described = describe_rev(package, 'HEAD')
|
633
|
+
if has_tag
|
634
|
+
info.merge('tag' => described, 'commit' => nil)
|
635
|
+
else
|
636
|
+
info.merge('tag' => nil, 'commit' => described)
|
637
|
+
end
|
638
|
+
else
|
639
|
+
info
|
557
640
|
end
|
558
641
|
end
|
559
642
|
end
|
560
643
|
|
561
644
|
class Autobuild::SVN
|
562
|
-
def snapshot(package, target_dir = nil)
|
645
|
+
def snapshot(package, target_dir = nil, options = Hash.new)
|
563
646
|
version = svn_revision(package)
|
564
647
|
Hash['revision' => version]
|
565
648
|
end
|
566
649
|
end
|
567
650
|
|
568
651
|
class Autobuild::ArchiveImporter
|
569
|
-
def snapshot(package, target_dir = nil)
|
652
|
+
def snapshot(package, target_dir = nil, options = Hash.new)
|
570
653
|
result = Hash[
|
571
654
|
'mode' => mode,
|
572
655
|
'no_subdirectory' => !has_subdirectory?,
|
data/lib/autoproj/cli.rb
CHANGED
data/lib/autoproj/cli/build.rb
CHANGED
@@ -20,13 +20,16 @@ module Autoproj
|
|
20
20
|
def run(selected_packages, options)
|
21
21
|
build_options, options = filter_options options,
|
22
22
|
force: false,
|
23
|
-
rebuild: false
|
23
|
+
rebuild: false,
|
24
|
+
parallel: nil
|
24
25
|
|
25
26
|
Autobuild.ignore_errors = options[:keep_going]
|
26
27
|
|
27
28
|
command_line_selection, source_packages, osdep_packages =
|
28
29
|
super(selected_packages, options.merge(checkout_only: true))
|
29
30
|
|
31
|
+
parallel = build_options[:parallel] || ws.config.parallel_build_level
|
32
|
+
|
30
33
|
return if source_packages.empty?
|
31
34
|
|
32
35
|
# Disable all packages that are not selected
|
@@ -70,7 +73,7 @@ module Autoproj
|
|
70
73
|
end
|
71
74
|
|
72
75
|
Autobuild.do_build = true
|
73
|
-
ops.build_packages(source_packages)
|
76
|
+
ops.build_packages(source_packages, parallel: parallel)
|
74
77
|
Autobuild.apply(source_packages, "autoproj-build", ['install'])
|
75
78
|
end
|
76
79
|
end
|
data/lib/autoproj/cli/locate.rb
CHANGED
@@ -58,7 +58,7 @@ module Autoproj
|
|
58
58
|
if name == selection || pkg.srcdir == selection
|
59
59
|
puts result_value(pkg, options)
|
60
60
|
return
|
61
|
-
elsif name =~ selection_rx
|
61
|
+
elsif name =~ selection_rx || selection.start_with?(pkg.srcdir)
|
62
62
|
candidates << pkg
|
63
63
|
end
|
64
64
|
end
|
@@ -104,7 +104,7 @@ module Autoproj
|
|
104
104
|
if candidates.empty?
|
105
105
|
raise ArgumentError, "cannot find #{selection} in the current autoproj installation"
|
106
106
|
elsif candidates.size > 1
|
107
|
-
raise ArgumentError, "multiple packages match #{selection} in the current autoproj installation: #{candidates.join(", ")}"
|
107
|
+
raise ArgumentError, "multiple packages match #{selection} in the current autoproj installation: #{candidates.map(&:name).sort.join(", ")}"
|
108
108
|
else
|
109
109
|
puts result_value(candidates.first, options)
|
110
110
|
end
|
data/lib/autoproj/cli/main.rb
CHANGED
@@ -58,6 +58,8 @@ module Autoproj
|
|
58
58
|
desc: 'only use locally available information (mainly for distributed version control systems such as git)'
|
59
59
|
option :mainline, type: :string,
|
60
60
|
desc: "compare to the given baseline. if 'true', the comparison will ignore any override, otherwise it will take into account overrides only up to the given package set"
|
61
|
+
option :snapshot, type: :boolean, default: false,
|
62
|
+
desc: "use the VCS information as 'versions --no-local' would detect it instead of the one in the configuration"
|
61
63
|
def status(*packages)
|
62
64
|
run_autoproj_cli(:status, :Status, Hash[], *packages)
|
63
65
|
end
|
@@ -197,6 +199,11 @@ are given, the packages will not be versioned. In other words,
|
|
197
199
|
option :replace, type: :boolean,
|
198
200
|
default: false,
|
199
201
|
desc: 'in combination with --save, controls whether an existing file should be updated or replaced'
|
202
|
+
option :deps, type: :boolean,
|
203
|
+
default: false,
|
204
|
+
desc: 'whether both packages and their dependencies should be versioned, or only the selected packages (the latter is the default)'
|
205
|
+
option :local, type: :boolean, default: false,
|
206
|
+
desc: 'whether we should access the remote server to verify that the snapshotted state is present'
|
200
207
|
option :save, type: :string,
|
201
208
|
desc: 'save to the given file instead of displaying it on the standard output'
|
202
209
|
def versions(*packages)
|
data/lib/autoproj/cli/osdeps.rb
CHANGED
@@ -3,21 +3,10 @@ require 'autoproj/cli/inspection_tool'
|
|
3
3
|
module Autoproj
|
4
4
|
module CLI
|
5
5
|
class OSDeps < InspectionTool
|
6
|
-
def validate_options(package_names, options = Hash.new)
|
7
|
-
package_names, options = super
|
8
|
-
|
9
|
-
initialize_and_load
|
10
|
-
if package_names.empty?
|
11
|
-
package_names = ws.manifest.default_packages(false)
|
12
|
-
end
|
13
|
-
|
14
|
-
return package_names, options
|
15
|
-
end
|
16
|
-
|
17
6
|
def run(user_selection, options = Hash.new)
|
7
|
+
initialize_and_load
|
18
8
|
_, osdep_packages, resolved_selection, _ =
|
19
9
|
finalize_setup(user_selection,
|
20
|
-
recursive: false,
|
21
10
|
ignore_non_imported_packages: true)
|
22
11
|
|
23
12
|
ws.osdeps.install(
|
data/lib/autoproj/cli/status.rb
CHANGED
@@ -28,32 +28,59 @@ module Autoproj
|
|
28
28
|
end
|
29
29
|
|
30
30
|
if options[:config]
|
31
|
-
pkg_sets = ws.manifest.each_package_set.
|
31
|
+
pkg_sets = ws.manifest.each_package_set.to_a
|
32
32
|
if !pkg_sets.empty?
|
33
33
|
Autoproj.message("autoproj: displaying status of configuration", :bold)
|
34
|
-
display_status(pkg_sets, only_local: options[:only_local])
|
34
|
+
display_status(pkg_sets, snapshot: options[:snapshot], only_local: options[:only_local])
|
35
35
|
STDERR.puts
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
Autoproj.message("autoproj: displaying status of packages", :bold)
|
40
40
|
packages = packages.sort.map do |pkg_name|
|
41
|
-
ws.manifest.
|
41
|
+
ws.manifest.find_package(pkg_name)
|
42
|
+
end
|
43
|
+
display_status(packages, snapshot: options[:snapshot], only_local: options[:only_local])
|
44
|
+
end
|
45
|
+
|
46
|
+
def snapshot_overrides_vcs?(importer, vcs, snapshot)
|
47
|
+
if importer.respond_to?(:snapshot_overrides?)
|
48
|
+
importer.snapshot_overrides?(snapshot)
|
49
|
+
else
|
50
|
+
vcs = vcs.to_hash
|
51
|
+
snapshot.any? { |k, v| vcs[k] != v }
|
42
52
|
end
|
43
|
-
display_status(packages, only_local: options[:only_local])
|
44
53
|
end
|
45
54
|
|
46
55
|
PackageStatus = Struct.new :msg, :sync, :uncommitted, :local, :remote
|
47
|
-
def status_of_package(
|
56
|
+
def status_of_package(package_description, options = Hash.new)
|
57
|
+
pkg = package_description.autobuild
|
58
|
+
importer = pkg.importer
|
48
59
|
package_status = PackageStatus.new(Array.new, false, false, false, false)
|
49
|
-
if !
|
60
|
+
if !importer
|
50
61
|
package_status.msg << Autoproj.color(" is a local-only package (no VCS)", :bold, :red)
|
51
|
-
elsif !
|
52
|
-
package_status.msg << Autoproj.color(" the #{
|
62
|
+
elsif !importer.respond_to?(:status)
|
63
|
+
package_status.msg << Autoproj.color(" the #{importer.class.name.gsub(/.*::/, '')} importer does not support status display", :bold, :red)
|
53
64
|
elsif !File.directory?(pkg.srcdir)
|
54
65
|
package_status.msg << Autoproj.color(" is not imported yet", :magenta)
|
55
66
|
else
|
56
|
-
|
67
|
+
if importer.respond_to?(:snapshot)
|
68
|
+
snapshot =
|
69
|
+
begin importer.snapshot(pkg, nil, exact_state: false, local: options[:only_local])
|
70
|
+
rescue Autobuild::PackageException
|
71
|
+
Hash.new
|
72
|
+
end
|
73
|
+
if snapshot_overrides_vcs?(importer, package_description.vcs, snapshot)
|
74
|
+
non_nil_values = snapshot.delete_if { |k, v| !v }
|
75
|
+
package_status.msg << Autoproj.color(" found configuration that contains all local changes: #{non_nil_values.sort_by(&:first).map { |k, v| "#{k}: #{v}" }.join(", ")}", :light_green)
|
76
|
+
package_status.msg << Autoproj.color(" consider adding this to your overrides, or use autoproj versions to do it for you", :light_green)
|
77
|
+
if options[:snapshot]
|
78
|
+
importer.relocate(importer.repository, snapshot)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
begin status = importer.status(pkg, options[:only_local])
|
57
84
|
rescue Interrupt
|
58
85
|
raise
|
59
86
|
rescue Exception => e
|
@@ -61,6 +88,10 @@ module Autoproj
|
|
61
88
|
return package_status
|
62
89
|
end
|
63
90
|
|
91
|
+
status.unexpected_working_copy_state.each do |msg|
|
92
|
+
package_status.msg << Autoproj.color(" #{msg}", :red, :bold)
|
93
|
+
end
|
94
|
+
|
64
95
|
if status.uncommitted_code
|
65
96
|
package_status.msg << Autoproj.color(" contains uncommitted modifications", :red)
|
66
97
|
package_status.uncommitted = true
|
@@ -103,26 +134,27 @@ module Autoproj
|
|
103
134
|
result = StatusResult.new
|
104
135
|
|
105
136
|
executor = Concurrent::FixedThreadPool.new(ws.config.parallel_import_level, max_length: 0)
|
106
|
-
interactive, noninteractive = packages.partition
|
137
|
+
interactive, noninteractive = packages.partition do |pkg|
|
138
|
+
pkg.autobuild.importer && pkg.autobuild.importer.interactive?
|
139
|
+
end
|
107
140
|
noninteractive = noninteractive.map do |pkg|
|
108
|
-
[pkg, Concurrent::Future.execute(executor: executor) { status_of_package(pkg, only_local: options[:only_local]) }]
|
141
|
+
[pkg, Concurrent::Future.execute(executor: executor) { status_of_package(pkg, snapshot: options[:snapshot], only_local: options[:only_local]) }]
|
109
142
|
end
|
110
143
|
|
111
144
|
sync_packages = ""
|
112
145
|
(noninteractive + interactive).each do |pkg, future|
|
113
146
|
if future
|
114
|
-
if
|
115
|
-
raise
|
147
|
+
if !(status = future.value)
|
148
|
+
raise future.reason
|
116
149
|
end
|
117
|
-
|
118
|
-
else status = status_of_package(pkg, only_local: options[:only_local])
|
150
|
+
else status = status_of_package(pkg, snapshot: options[:snapshot], only_local: options[:only_local])
|
119
151
|
end
|
120
152
|
|
121
153
|
result.uncommitted ||= status.uncommitted
|
122
154
|
result.local ||= status.local
|
123
155
|
result.remote ||= status.remote
|
124
156
|
|
125
|
-
pkg_name = pkg.
|
157
|
+
pkg_name = pkg.name
|
126
158
|
if status.sync && status.msg.empty?
|
127
159
|
if sync_packages.size > 80
|
128
160
|
Autoproj.message "#{sync_packages},"
|
@@ -161,6 +193,7 @@ module Autoproj
|
|
161
193
|
|
162
194
|
rescue Interrupt
|
163
195
|
Autoproj.warn "Interrupted, waiting for pending jobs to finish"
|
196
|
+
raise
|
164
197
|
rescue Exception => e
|
165
198
|
Autoproj.error "internal error: #{e}, waiting for pending jobs to finish"
|
166
199
|
raise
|
@@ -29,21 +29,20 @@ module Autoproj
|
|
29
29
|
|
30
30
|
def run(user_selection, options)
|
31
31
|
initialize_and_load
|
32
|
-
|
33
|
-
normalize_command_line_package_selection(user_selection)
|
34
|
-
packages, * =
|
32
|
+
packages, *, config_selected =
|
35
33
|
finalize_setup(user_selection,
|
34
|
+
recursive: options[:deps],
|
36
35
|
ignore_non_imported_packages: true)
|
37
36
|
|
38
37
|
|
39
38
|
ops = Ops::Snapshot.new(ws.manifest, ignore_errors: options[:keep_going])
|
40
39
|
|
41
40
|
versions = Array.new
|
42
|
-
if config_selected
|
43
|
-
versions += ops.snapshot_package_sets
|
41
|
+
if (config_selected && options[:config] != false) || user_selection.empty?
|
42
|
+
versions += ops.snapshot_package_sets(nil, local: options[:local])
|
44
43
|
end
|
45
44
|
if (!config_selected && !options[:config]) || !user_selection.empty?
|
46
|
-
versions += ops.snapshot_packages(packages)
|
45
|
+
versions += ops.snapshot_packages(packages, nil, local: options[:local])
|
47
46
|
end
|
48
47
|
|
49
48
|
if output_file = options[:save]
|
@@ -189,6 +189,15 @@ module Autoproj
|
|
189
189
|
set('import_log_enabled', !!value)
|
190
190
|
end
|
191
191
|
|
192
|
+
def parallel_build_level
|
193
|
+
get('parallel_build_level', nil) || Autobuild.parallel_build_level
|
194
|
+
end
|
195
|
+
|
196
|
+
def parallel_build_level=(level)
|
197
|
+
set('parallel_build_level', level)
|
198
|
+
Autobuild.parallel_build_level = level
|
199
|
+
end
|
200
|
+
|
192
201
|
def parallel_import_level
|
193
202
|
get('parallel_import_level', 10)
|
194
203
|
end
|
data/lib/autoproj/ops/build.rb
CHANGED
@@ -82,10 +82,10 @@ module Autoproj
|
|
82
82
|
# @param [Array<String>] all_enabled_packages the list of package
|
83
83
|
# names of the packages that should be rebuilt
|
84
84
|
# @return [void]
|
85
|
-
def build_packages(all_enabled_packages)
|
85
|
+
def build_packages(all_enabled_packages, options = Hash.new)
|
86
86
|
Autobuild.do_rebuild = false
|
87
87
|
Autobuild.do_forced_build = false
|
88
|
-
Autobuild.apply(all_enabled_packages, "autoproj-build", ['build'])
|
88
|
+
Autobuild.apply(all_enabled_packages, "autoproj-build", ['build'], options)
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
@@ -304,46 +304,52 @@ module Autoproj
|
|
304
304
|
end
|
305
305
|
end
|
306
306
|
|
307
|
-
def
|
308
|
-
# We do not consider the 'standalone' package sets while sorting.
|
309
|
-
# They are taken care of later, as we need to maintain the order the
|
310
|
-
# user defined in the package_sets section of the manifest
|
311
|
-
queue = package_sets.flat_map do |pkg_set|
|
312
|
-
if (!pkg_set.imports.empty? || !pkg_set.explicit?) && !(pkg_set == root_pkg_set)
|
313
|
-
[pkg_set] + pkg_set.imports.to_a
|
314
|
-
else []
|
315
|
-
end
|
316
|
-
end.to_set.to_a
|
307
|
+
def inspect; to_s end
|
317
308
|
|
318
|
-
|
309
|
+
def sort_package_sets_by_import_order(package_sets, root_pkg_set)
|
310
|
+
# The sorting is done in two steps:
|
311
|
+
# - first, we build a topological order of the package sets
|
312
|
+
# - then, we insert the auto-imported packages, following this
|
313
|
+
# topological order, in the user-provided order. Each package is
|
314
|
+
# considered in turn, and added at the earliest place that fits
|
315
|
+
# the dependencies
|
316
|
+
topological = Array.new
|
317
|
+
queue = package_sets.to_a
|
319
318
|
while !queue.empty?
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
319
|
+
last_size = queue.size
|
320
|
+
pending = queue.dup
|
321
|
+
queue = Array.new
|
322
|
+
while !pending.empty?
|
323
|
+
pkg_set = pending.shift
|
324
|
+
if not_processed_yet = pkg_set.imports.find { |imported_set| !topological.include?(imported_set) }
|
325
|
+
queue.push(pkg_set)
|
326
|
+
else
|
327
|
+
topological << pkg_set
|
328
|
+
end
|
329
|
+
end
|
330
|
+
if queue.size == last_size
|
331
|
+
raise ArgumentError, "cannot resolve the dependencies between package sets. There seem to be a cycle amongst #{queue.map(&:name).sort.join(", ")}"
|
325
332
|
end
|
326
333
|
end
|
327
334
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
if
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
335
|
+
result = root_pkg_set.imports.to_a.dup
|
336
|
+
to_insert = topological.dup.
|
337
|
+
find_all { |pkg_set| !result.include?(pkg_set) }
|
338
|
+
while !to_insert.empty?
|
339
|
+
pkg_set = to_insert.shift
|
340
|
+
dependencies = pkg_set.imports.dup
|
341
|
+
if dependencies.empty?
|
342
|
+
result.unshift(pkg_set)
|
343
|
+
else
|
344
|
+
i = result.find_index do |p|
|
345
|
+
dependencies.delete(p)
|
346
|
+
dependencies.empty?
|
340
347
|
end
|
348
|
+
result.insert(i + 1, pkg_set)
|
341
349
|
end
|
342
|
-
previous = pkg_set
|
343
350
|
end
|
344
|
-
|
345
|
-
|
346
|
-
sorted
|
351
|
+
result << root_pkg_set
|
352
|
+
result
|
347
353
|
end
|
348
354
|
|
349
355
|
def load_package_sets(options = Hash.new)
|
data/lib/autoproj/ops/import.rb
CHANGED
@@ -243,7 +243,8 @@ module Autoproj
|
|
243
243
|
manifest = ws.manifest
|
244
244
|
|
245
245
|
all = Set.new
|
246
|
-
package_queue = manifest.all_layout_packages(false).each_source_package_name.to_a
|
246
|
+
package_queue = manifest.all_layout_packages(false).each_source_package_name.to_a +
|
247
|
+
processed_packages.map(&:name).to_a
|
247
248
|
while !package_queue.empty?
|
248
249
|
pkg_name = package_queue.shift
|
249
250
|
next if all.include?(pkg_name)
|
@@ -252,7 +253,7 @@ module Autoproj
|
|
252
253
|
next if manifest.ignored?(pkg_name) || manifest.excluded?(pkg_name)
|
253
254
|
|
254
255
|
pkg = manifest.find_autobuild_package(pkg_name)
|
255
|
-
if !processed_packages.include?(pkg)
|
256
|
+
if !processed_packages.include?(pkg) && File.directory?(pkg.srcdir)
|
256
257
|
manifest.load_package_manifest(pkg.name)
|
257
258
|
Autoproj.each_post_import_block(pkg) do |block|
|
258
259
|
block.call(pkg)
|
@@ -89,22 +89,34 @@ module Autoproj
|
|
89
89
|
@ignore_errors = options[:ignore_errors]
|
90
90
|
end
|
91
91
|
|
92
|
-
def snapshot_package_sets(target_dir = nil)
|
92
|
+
def snapshot_package_sets(target_dir = nil, options = Hash.new)
|
93
|
+
options = Kernel.validate_options options,
|
94
|
+
local: true
|
95
|
+
|
93
96
|
result = Array.new
|
94
97
|
manifest.each_package_set do |pkg_set|
|
95
98
|
next if pkg_set.local?
|
96
99
|
|
97
|
-
|
100
|
+
vcs_info =
|
101
|
+
begin pkg_set.snapshot(target_dir, local: options[:local])
|
102
|
+
rescue Exception => e
|
103
|
+
error_or_warn(pkg_set, e)
|
104
|
+
next
|
105
|
+
end
|
106
|
+
|
107
|
+
if vcs_info
|
98
108
|
result << Hash["pkg_set:#{pkg_set.repository_id}", vcs_info]
|
99
109
|
else
|
100
|
-
error_or_warn(pkg_set, "cannot snapshot #{
|
110
|
+
error_or_warn(pkg_set, "cannot snapshot package set #{pkg_set.name}: importer snapshot failed")
|
101
111
|
end
|
102
112
|
end
|
103
113
|
result
|
104
114
|
end
|
105
115
|
|
106
116
|
def error_or_warn(package, error)
|
107
|
-
if
|
117
|
+
if error.kind_of?(Interrupt)
|
118
|
+
raise
|
119
|
+
elsif ignore_errors?
|
108
120
|
if !error.respond_to?(:to_str)
|
109
121
|
error = error.message
|
110
122
|
end
|
@@ -116,7 +128,10 @@ module Autoproj
|
|
116
128
|
end
|
117
129
|
end
|
118
130
|
|
119
|
-
def snapshot_packages(packages, target_dir = nil)
|
131
|
+
def snapshot_packages(packages, target_dir = nil, options = Hash.new)
|
132
|
+
options = Kernel.validate_options options,
|
133
|
+
local: true
|
134
|
+
|
120
135
|
result = Array.new
|
121
136
|
packages.each do |package_name|
|
122
137
|
package = manifest.packages[package_name]
|
@@ -133,9 +148,10 @@ module Autoproj
|
|
133
148
|
end
|
134
149
|
|
135
150
|
vcs_info =
|
136
|
-
begin importer.snapshot(package.autobuild, target_dir)
|
151
|
+
begin importer.snapshot(package.autobuild, target_dir, local: options[:local])
|
137
152
|
rescue Exception => e
|
138
|
-
error_or_warn(package,
|
153
|
+
error_or_warn(package, e)
|
154
|
+
next
|
139
155
|
end
|
140
156
|
|
141
157
|
if vcs_info
|
data/lib/autoproj/osdeps.rb
CHANGED
@@ -647,11 +647,21 @@ fi
|
|
647
647
|
end
|
648
648
|
|
649
649
|
ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
650
|
+
ruby_bindir = RbConfig::CONFIG['bindir']
|
651
|
+
|
652
|
+
candidates = ['gem']
|
650
653
|
if ruby_bin =~ /^ruby(.+)$/
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
+
candidates << "gem#{$1}"
|
655
|
+
end
|
656
|
+
|
657
|
+
candidates.each do |gem_name|
|
658
|
+
if File.file?(gem_full_path = File.join(ruby_bindir, gem_name))
|
659
|
+
Autobuild.programs['gem'] = gem_full_path
|
660
|
+
return
|
661
|
+
end
|
654
662
|
end
|
663
|
+
|
664
|
+
raise ArgumentError, "cannot find a gem program (tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
|
655
665
|
end
|
656
666
|
|
657
667
|
def build_gem_cmdlines(gems)
|
data/lib/autoproj/package_set.rb
CHANGED
@@ -131,17 +131,22 @@ module Autoproj
|
|
131
131
|
!File.exists?(File.join(raw_local_dir, "init.rb"))
|
132
132
|
end
|
133
133
|
|
134
|
+
# Defined for coherence with the API on {PackageDefinition}
|
135
|
+
def autobuild
|
136
|
+
create_autobuild_package
|
137
|
+
end
|
138
|
+
|
134
139
|
def create_autobuild_package
|
135
140
|
Ops::Tools.create_autobuild_package(vcs, name, raw_local_dir)
|
136
141
|
end
|
137
142
|
|
138
|
-
def snapshot(target_dir)
|
143
|
+
def snapshot(target_dir, options = Hash.new)
|
139
144
|
if local?
|
140
145
|
Hash.new
|
141
146
|
else
|
142
147
|
package = create_autobuild_package
|
143
148
|
if package.importer.respond_to?(:snapshot)
|
144
|
-
package.importer.snapshot(package, target_dir)
|
149
|
+
package.importer.snapshot(package, target_dir, options)
|
145
150
|
end
|
146
151
|
end
|
147
152
|
end
|
data/lib/autoproj/reporter.rb
CHANGED
@@ -2,7 +2,6 @@ require 'autobuild/reporting'
|
|
2
2
|
module Autoproj
|
3
3
|
class << self
|
4
4
|
attr_accessor :verbose
|
5
|
-
attr_reader :console
|
6
5
|
def silent?
|
7
6
|
Autobuild.silent?
|
8
7
|
end
|
@@ -11,8 +10,6 @@ module Autoproj
|
|
11
10
|
end
|
12
11
|
end
|
13
12
|
@verbose = false
|
14
|
-
@console = HighLine.new
|
15
|
-
|
16
13
|
|
17
14
|
def self.silent(&block)
|
18
15
|
Autobuild.silent(&block)
|
data/lib/autoproj/version.rb
CHANGED
data/lib/autoproj/workspace.rb
CHANGED
@@ -140,7 +140,12 @@ module Autoproj
|
|
140
140
|
@config = Configuration.new(config_path)
|
141
141
|
if File.file?(config_path)
|
142
142
|
config.load(reconfigure: reconfigure)
|
143
|
-
|
143
|
+
if raw_vcs = config.get('manifest_source', nil)
|
144
|
+
manifest.vcs = VCSDefinition.from_raw(raw_vcs)
|
145
|
+
else
|
146
|
+
manifest.vcs = VCSDefinition.from_raw(
|
147
|
+
type: 'local', url: config_dir)
|
148
|
+
end
|
144
149
|
end
|
145
150
|
end
|
146
151
|
|
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.0.0.
|
4
|
+
version: 2.0.0.b7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Joyeux
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: autobuild
|