autoproj 2.8.8 → 2.9.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/bin/alog +5 -3
- data/lib/autoproj.rb +2 -0
- data/lib/autoproj/cli/base.rb +8 -1
- data/lib/autoproj/cli/build.rb +5 -3
- data/lib/autoproj/cli/locate.rb +5 -1
- data/lib/autoproj/cli/osdeps.rb +1 -0
- data/lib/autoproj/cli/status.rb +13 -4
- data/lib/autoproj/cli/update.rb +9 -5
- data/lib/autoproj/default.osdeps +14 -0
- data/lib/autoproj/manifest.rb +7 -9
- data/lib/autoproj/ops/build.rb +48 -2
- data/lib/autoproj/ops/configuration.rb +18 -0
- data/lib/autoproj/os_package_installer.rb +27 -0
- data/lib/autoproj/os_repository_installer.rb +53 -0
- data/lib/autoproj/os_repository_resolver.rb +137 -0
- data/lib/autoproj/package_managers/apt_dpkg_manager.rb +70 -10
- data/lib/autoproj/package_managers/bundler_manager.rb +9 -2
- data/lib/autoproj/package_managers/debian_version.rb +123 -0
- data/lib/autoproj/package_managers/manager.rb +9 -0
- data/lib/autoproj/package_managers/pip_manager.rb +4 -0
- data/lib/autoproj/package_selection.rb +36 -10
- data/lib/autoproj/package_set.rb +39 -4
- data/lib/autoproj/repository_managers/apt.rb +289 -0
- data/lib/autoproj/repository_managers/manager.rb +26 -0
- data/lib/autoproj/repository_managers/unknown_os_manager.rb +30 -0
- data/lib/autoproj/test.rb +1 -0
- data/lib/autoproj/version.rb +1 -1
- data/lib/autoproj/workspace.rb +21 -7
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a79f0dc8faf8c992dedb96e65c997ab35f41d62107845dd9dd20bc260630f0a2
|
4
|
+
data.tar.gz: 2e3db38917f2cefa9defa70fa248ced0c05ad909817003b135d9b7f6179ca8bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 346bdce3bf52c42187143908ef04767a03e1e71b24738b0c333591bd73d113355a871ccdf67bec9b69018d30e3302e6a53946e007922a4a3e01fb82fa371eae8
|
7
|
+
data.tar.gz: 470faaa51b2d58609f70e794173d07d41003feee472c3c9e3dd9bb8024e66746403a480becad1dc0222066084e76c0205104465e138afc714d8555fc32d60d55
|
data/bin/alog
CHANGED
@@ -24,10 +24,12 @@ Autoproj.report(silent: true) do
|
|
24
24
|
if log_files.size == 1
|
25
25
|
logfile = log_files.first
|
26
26
|
elsif log_files.size > 1
|
27
|
-
|
27
|
+
begin
|
28
|
+
logfile = cli.select_log_file(log_files)
|
29
|
+
puts File.read(logfile)
|
30
|
+
rescue Interrupt
|
31
|
+
end
|
28
32
|
elsif log_files.empty?
|
29
33
|
raise "no logs found for #{string}"
|
30
34
|
end
|
31
|
-
|
32
|
-
puts File.read(logfile)
|
33
35
|
end
|
data/lib/autoproj.rb
CHANGED
@@ -30,6 +30,8 @@
|
|
30
30
|
require 'autoproj/installation_manifest'
|
31
31
|
require 'autoproj/os_package_installer'
|
32
32
|
require 'autoproj/os_package_resolver'
|
33
|
+
require 'autoproj/os_repository_resolver'
|
34
|
+
require 'autoproj/os_repository_installer'
|
33
35
|
require 'autoproj/system'
|
34
36
|
require 'autoproj/build_option'
|
35
37
|
require 'autoproj/configuration'
|
data/lib/autoproj/cli/base.rb
CHANGED
@@ -206,7 +206,14 @@ def self.validate_options(args, options)
|
|
206
206
|
end
|
207
207
|
|
208
208
|
def export_env_sh(shell_helpers: ws.config.shell_helpers?)
|
209
|
-
@env_sh_updated
|
209
|
+
# @env_sh_updated == nil means "did not even export".
|
210
|
+
# make sure that it is set to 'true' or 'false'
|
211
|
+
@env_sh_updated =
|
212
|
+
if ws.export_env_sh(shell_helpers: shell_helpers)
|
213
|
+
true
|
214
|
+
else
|
215
|
+
false
|
216
|
+
end
|
210
217
|
end
|
211
218
|
|
212
219
|
def notify_env_sh_updated
|
data/lib/autoproj/cli/build.rb
CHANGED
@@ -27,7 +27,10 @@ def run(selected_packages, options)
|
|
27
27
|
confirm: true
|
28
28
|
|
29
29
|
command_line_selection, source_packages, _osdep_packages =
|
30
|
-
super(selected_packages,
|
30
|
+
super(selected_packages,
|
31
|
+
ignore_errors: options[:keep_going],
|
32
|
+
checkout_only: true,
|
33
|
+
**options)
|
31
34
|
|
32
35
|
parallel = build_options[:parallel] || ws.config.parallel_build_level
|
33
36
|
|
@@ -41,7 +44,7 @@ def run(selected_packages, options)
|
|
41
44
|
|
42
45
|
Autobuild.ignore_errors = options[:keep_going]
|
43
46
|
|
44
|
-
ops = Ops::Build.new(ws.manifest)
|
47
|
+
ops = Ops::Build.new(ws.manifest, report_dir: ws.log_dir)
|
45
48
|
if build_options[:rebuild] || build_options[:force]
|
46
49
|
packages_to_rebuild =
|
47
50
|
if options[:deps] || command_line_selection.empty?
|
@@ -77,7 +80,6 @@ def run(selected_packages, options)
|
|
77
80
|
|
78
81
|
Autobuild.do_build = true
|
79
82
|
ops.build_packages(source_packages, parallel: parallel)
|
80
|
-
Autobuild.apply(source_packages, "autoproj-build", ['install'])
|
81
83
|
Main.run_post_command_hook(:build, ws, source_packages: source_packages)
|
82
84
|
ensure
|
83
85
|
export_env_sh
|
data/lib/autoproj/cli/locate.rb
CHANGED
@@ -285,7 +285,11 @@ def select_log_file(log_files)
|
|
285
285
|
end
|
286
286
|
|
287
287
|
prompt = TTY::Prompt.new
|
288
|
-
|
288
|
+
begin
|
289
|
+
prompt.select("Select the log file", choices)
|
290
|
+
rescue TTY::Reader::InputInterrupt
|
291
|
+
raise Interrupt
|
292
|
+
end
|
289
293
|
end
|
290
294
|
end
|
291
295
|
end
|
data/lib/autoproj/cli/osdeps.rb
CHANGED
data/lib/autoproj/cli/status.rb
CHANGED
@@ -73,6 +73,15 @@ def snapshot_overrides_vcs?(importer, vcs, snapshot)
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
def report_exception(package_status, msg, e)
|
77
|
+
package_status.msg << Autoproj.color(" #{msg} (#{e})", :red)
|
78
|
+
if Autobuild.debug
|
79
|
+
package_status.msg.concat(e.backtrace.map do |line|
|
80
|
+
Autoproj.color(" #{line}", :red)
|
81
|
+
end)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
76
85
|
PackageStatus = Struct.new :msg, :sync, :uncommitted, :local, :remote
|
77
86
|
def status_of_package(package_description, only_local: false, snapshot: false)
|
78
87
|
pkg = package_description.autobuild
|
@@ -85,9 +94,9 @@ def status_of_package(package_description, only_local: false, snapshot: false)
|
|
85
94
|
elsif !File.directory?(pkg.srcdir)
|
86
95
|
package_status.msg << Autoproj.color(" is not imported yet", :magenta)
|
87
96
|
else
|
88
|
-
begin status = importer.status(pkg, only_local)
|
97
|
+
begin status = importer.status(pkg, only_local: only_local)
|
89
98
|
rescue StandardError => e
|
90
|
-
package_status
|
99
|
+
report_exception(package_status, "failed to fetch status information", e)
|
91
100
|
return package_status
|
92
101
|
end
|
93
102
|
|
@@ -99,7 +108,7 @@ def status_of_package(package_description, only_local: false, snapshot: false)
|
|
99
108
|
rescue Autobuild::PackageException
|
100
109
|
Hash.new
|
101
110
|
rescue StandardError => e
|
102
|
-
package_status
|
111
|
+
report_exception(package_status, "failed to fetch snapshotting information", e)
|
103
112
|
return package_status
|
104
113
|
end
|
105
114
|
if snapshot_overrides_vcs?(importer, package_description.vcs, snapshot_version)
|
@@ -227,7 +236,7 @@ def display_status(packages, parallel: ws.config.parallel_import_level, snapshot
|
|
227
236
|
end
|
228
237
|
end
|
229
238
|
|
230
|
-
result = each_package_status(packages, parallel: parallel, progress: progress) do |pkg, status|
|
239
|
+
result = each_package_status(packages, only_local: only_local, parallel: parallel, progress: progress) do |pkg, status|
|
231
240
|
if spinner
|
232
241
|
spinner.stop
|
233
242
|
spinner = nil
|
data/lib/autoproj/cli/update.rb
CHANGED
@@ -44,7 +44,7 @@ def validate_options(selection, options)
|
|
44
44
|
(options[:autoproj] || (
|
45
45
|
options[:autoproj] != false &&
|
46
46
|
!has_explicit_selection &&
|
47
|
-
!options[:config] &&
|
47
|
+
!options[:config] &&
|
48
48
|
!options[:checkout_only])
|
49
49
|
)
|
50
50
|
|
@@ -97,6 +97,8 @@ def run(selected_packages, run_hook: false, **options)
|
|
97
97
|
command_line_selection, selected_packages =
|
98
98
|
finish_loading_configuration(selected_packages)
|
99
99
|
else
|
100
|
+
ws.setup_all_package_directories
|
101
|
+
ws.finalize_package_setup
|
100
102
|
command_line_selection, selected_packages = [], PackageSelection.new
|
101
103
|
end
|
102
104
|
|
@@ -106,10 +108,11 @@ def run(selected_packages, run_hook: false, **options)
|
|
106
108
|
osdeps: options[:osdeps],
|
107
109
|
osdeps_filter_uptodate: options[:osdeps_filter_uptodate])
|
108
110
|
|
109
|
-
source_packages, osdep_packages, import_failure =
|
111
|
+
source_packages, osdep_packages, import_failure =
|
110
112
|
update_packages(
|
111
113
|
selected_packages,
|
112
|
-
osdeps: options[:osdeps],
|
114
|
+
osdeps: options[:osdeps],
|
115
|
+
osdeps_options: osdeps_options,
|
113
116
|
from: options[:from],
|
114
117
|
checkout_only: options[:checkout_only],
|
115
118
|
only_local: options[:only_local],
|
@@ -124,6 +127,7 @@ def run(selected_packages, run_hook: false, **options)
|
|
124
127
|
ws.export_installation_manifest
|
125
128
|
|
126
129
|
if options[:osdeps] && !osdep_packages.empty?
|
130
|
+
ws.install_os_repositories
|
127
131
|
ws.install_os_packages(osdep_packages, **osdeps_options)
|
128
132
|
end
|
129
133
|
|
@@ -141,7 +145,7 @@ def run(selected_packages, run_hook: false, **options)
|
|
141
145
|
|
142
146
|
export_env_sh
|
143
147
|
|
144
|
-
if !options[:auto_exclude]
|
148
|
+
if !options[:auto_exclude] && !options[:ignore_errors]
|
145
149
|
if import_failure && configuration_import_failure
|
146
150
|
raise ImportFailed.new(configuration_import_failure.original_errors + import_failure.original_errors)
|
147
151
|
elsif import_failure
|
@@ -198,7 +202,7 @@ def update_packages(selected_packages,
|
|
198
202
|
end
|
199
203
|
|
200
204
|
ops = Autoproj::Ops::Import.new(ws)
|
201
|
-
source_packages, osdep_packages =
|
205
|
+
source_packages, osdep_packages =
|
202
206
|
ops.import_packages(selected_packages,
|
203
207
|
checkout_only: checkout_only,
|
204
208
|
only_local: only_local,
|
data/lib/autoproj/default.osdeps
CHANGED
@@ -160,9 +160,23 @@ pip:
|
|
160
160
|
opensuse: python-pip
|
161
161
|
fedora: python-pip
|
162
162
|
freebsd: pip
|
163
|
+
default: ignore # assume pip will be installed by the user
|
163
164
|
|
164
165
|
sudo:
|
165
166
|
macos-brew: ignore
|
166
167
|
default: sudo
|
167
168
|
|
169
|
+
archive-keyring:
|
170
|
+
ubuntu: ubuntu-keyring
|
171
|
+
debian: debian-archive-keyring
|
172
|
+
default: ignore
|
173
|
+
|
174
|
+
gnupg:
|
175
|
+
ubuntu,debian: gnupg
|
176
|
+
default: ignore
|
177
|
+
|
178
|
+
apt-transport-https:
|
179
|
+
ubuntu,debian: apt-transport-https
|
180
|
+
default: ignore
|
181
|
+
|
168
182
|
# vim: expandtab
|
data/lib/autoproj/manifest.rb
CHANGED
@@ -892,16 +892,14 @@ def package_selected?(name, validate = true)
|
|
892
892
|
#
|
893
893
|
# @return [Array<PackageDefinition>]
|
894
894
|
def all_selected_source_packages(validate = true)
|
895
|
-
|
896
|
-
|
895
|
+
default_packages(validate).all_selected_source_packages(self)
|
896
|
+
end
|
897
897
|
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
find_package_definition(pkg_name)
|
904
|
-
end
|
898
|
+
# Returns the set of osdep packages that are selected by the layout
|
899
|
+
#
|
900
|
+
# @return [Array<String>]
|
901
|
+
def all_selected_osdep_packages(validate = true)
|
902
|
+
default_packages(validate).all_selected_osdep_packages(self)
|
905
903
|
end
|
906
904
|
|
907
905
|
# Returns the set of packages that are selected by the layout
|
data/lib/autoproj/ops/build.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'erb'
|
1
2
|
module Autoproj
|
2
3
|
module Ops
|
3
4
|
# Operations related to building packages
|
@@ -10,8 +11,11 @@ class Build
|
|
10
11
|
# @return [Manifest]
|
11
12
|
attr_reader :manifest
|
12
13
|
|
13
|
-
|
14
|
+
# @param [String] report_dir the log directory in which to build
|
15
|
+
# the build report. If left to nil, no report will be generated
|
16
|
+
def initialize(manifest, report_dir: nil)
|
14
17
|
@manifest = manifest
|
18
|
+
@report_dir = report_dir
|
15
19
|
end
|
16
20
|
|
17
21
|
# Triggers a rebuild of all packages
|
@@ -73,6 +77,7 @@ def force_build_packages(selected_packages, all_enabled_packages)
|
|
73
77
|
build_packages(all_enabled_packages)
|
74
78
|
end
|
75
79
|
|
80
|
+
|
76
81
|
# Builds the listed packages
|
77
82
|
#
|
78
83
|
# Only build steps that are actually needed will be performed. See
|
@@ -84,7 +89,48 @@ def force_build_packages(selected_packages, all_enabled_packages)
|
|
84
89
|
def build_packages(all_enabled_packages, options = Hash.new)
|
85
90
|
Autobuild.do_rebuild = false
|
86
91
|
Autobuild.do_forced_build = false
|
87
|
-
|
92
|
+
begin
|
93
|
+
Autobuild.apply(all_enabled_packages, "autoproj-build", ['build'], options)
|
94
|
+
ensure
|
95
|
+
build_report(all_enabled_packages) if @report_dir
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
REPORT_BASENAME = "build_report.json"
|
100
|
+
|
101
|
+
# The path to the report file
|
102
|
+
#
|
103
|
+
# @return [String,nil] the path, or nil if the report should not
|
104
|
+
# be generated
|
105
|
+
def report_path
|
106
|
+
File.join(@report_dir, REPORT_BASENAME) if @report_dir
|
107
|
+
end
|
108
|
+
|
109
|
+
def build_report(package_list)
|
110
|
+
FileUtils.mkdir_p @report_dir
|
111
|
+
|
112
|
+
packages = package_list.map do |pkg_name|
|
113
|
+
pkg = manifest.find_autobuild_package(pkg_name)
|
114
|
+
|
115
|
+
{
|
116
|
+
name: pkg.name,
|
117
|
+
import_invoked: pkg.import_invoked?,
|
118
|
+
prepare_invoked: pkg.prepare_invoked?,
|
119
|
+
build_invoked: pkg.build_invoked?,
|
120
|
+
failed: pkg.failed?,
|
121
|
+
imported: pkg.imported?,
|
122
|
+
prepared: pkg.prepared?,
|
123
|
+
built: pkg.built?
|
124
|
+
}
|
125
|
+
end
|
126
|
+
|
127
|
+
build_report = JSON.pretty_generate({
|
128
|
+
build_report: {
|
129
|
+
timestamp: Time.now,
|
130
|
+
packages: packages
|
131
|
+
}
|
132
|
+
})
|
133
|
+
IO.write(report_path, build_report)
|
88
134
|
end
|
89
135
|
end
|
90
136
|
end
|
@@ -464,6 +464,9 @@ def load_package_set_information(mainline: nil)
|
|
464
464
|
end
|
465
465
|
end
|
466
466
|
|
467
|
+
# Loads OS repository definitions once and for all
|
468
|
+
load_osrepos_from_package_sets
|
469
|
+
|
467
470
|
# Loads OS package definitions once and for all
|
468
471
|
load_osdeps_from_package_sets
|
469
472
|
|
@@ -580,6 +583,21 @@ def load_osdeps_from_package_sets
|
|
580
583
|
end
|
581
584
|
end
|
582
585
|
|
586
|
+
# Load OS repository information contained in our registered package
|
587
|
+
# sets into the provided osrepo object
|
588
|
+
#
|
589
|
+
# This is included in {load_package_sets}
|
590
|
+
#
|
591
|
+
# @return [void]
|
592
|
+
def load_osrepos_from_package_sets
|
593
|
+
ws.manifest.each_package_set do |pkg_set|
|
594
|
+
pkg_set.each_osrepos_file do |file|
|
595
|
+
file_osrepos = pkg_set.load_osrepos(file)
|
596
|
+
ws.os_repository_resolver.merge(file_osrepos)
|
597
|
+
end
|
598
|
+
end
|
599
|
+
end
|
600
|
+
|
583
601
|
def update_package_sets(only_local: false,
|
584
602
|
checkout_only: !Autobuild.do_update,
|
585
603
|
keep_going: false,
|
@@ -188,6 +188,10 @@ def osdeps_mode_string_to_value(string)
|
|
188
188
|
modes
|
189
189
|
end
|
190
190
|
|
191
|
+
def configure_manager
|
192
|
+
os_package_manager.configure_manager if osdeps_mode.include?('os')
|
193
|
+
end
|
194
|
+
|
191
195
|
# If set to true (the default), #install will try to remove the list of
|
192
196
|
# already uptodate packages from the installed packages. Set to false to
|
193
197
|
# install all packages regardless of their status
|
@@ -380,6 +384,29 @@ def resolve_and_partition_osdep_packages(osdep_packages, all_osdep_packages = ni
|
|
380
384
|
|
381
385
|
partitioned_packages[manager] = manager_packages
|
382
386
|
end
|
387
|
+
resolve_managers_dependencies(partitioned_packages)
|
388
|
+
end
|
389
|
+
|
390
|
+
def resolve_managers_dependencies(partitioned_packages)
|
391
|
+
partitioned_packages.clone.each do |manager, packages|
|
392
|
+
# Skip if the manager is not being used
|
393
|
+
next if packages&.empty?
|
394
|
+
|
395
|
+
manager_dependencies = os_package_resolver.resolve_os_packages(manager.os_dependencies)
|
396
|
+
manager_dependencies = resolve_package_managers_in_mapping(manager_dependencies)
|
397
|
+
manager_dependencies.each_key do |nested_manager|
|
398
|
+
deps = manager_dependencies.fetch(nested_manager, Set.new).to_set
|
399
|
+
next if deps.empty?
|
400
|
+
|
401
|
+
unless partitioned_packages[nested_manager]
|
402
|
+
partitioned_packages[nested_manager] = Set.new
|
403
|
+
enable_recursion = true
|
404
|
+
end
|
405
|
+
|
406
|
+
partitioned_packages[nested_manager] += deps
|
407
|
+
partitioned_packages = resolve_managers_dependencies(partitioned_packages) if enable_recursion
|
408
|
+
end
|
409
|
+
end
|
383
410
|
partitioned_packages
|
384
411
|
end
|
385
412
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'autoproj/repository_managers/manager'
|
2
|
+
require 'autoproj/repository_managers/unknown_os_manager'
|
3
|
+
require 'autoproj/repository_managers/apt'
|
4
|
+
|
5
|
+
module Autoproj
|
6
|
+
class OSRepositoryInstaller
|
7
|
+
# The workspace object
|
8
|
+
attr_reader :ws
|
9
|
+
|
10
|
+
# Returns the set of repository managers
|
11
|
+
attr_reader :repository_managers
|
12
|
+
|
13
|
+
OS_REPOSITORY_MANAGERS = {
|
14
|
+
'debian' => RepositoryManagers::APT
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
def initialize(ws)
|
18
|
+
@ws = ws
|
19
|
+
@repository_managers = {}
|
20
|
+
OS_REPOSITORY_MANAGERS.each do |name, klass|
|
21
|
+
@repository_managers[name] = klass.new(ws)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def os_repository_resolver
|
26
|
+
ws.os_repository_resolver
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the repository manager object for the current OS
|
30
|
+
def os_repository_manager
|
31
|
+
return @os_repository_manager if @os_repository_manager
|
32
|
+
|
33
|
+
os_names, = os_repository_resolver.operating_system
|
34
|
+
os_name = os_names.find { |name| OS_REPOSITORY_MANAGERS[name] }
|
35
|
+
|
36
|
+
@os_repository_manager =
|
37
|
+
repository_managers[os_name] ||
|
38
|
+
RepositoryManagers::UnknownOSManager.new(ws)
|
39
|
+
end
|
40
|
+
|
41
|
+
def each_manager(&block)
|
42
|
+
repository_managers.each_value(&block)
|
43
|
+
end
|
44
|
+
|
45
|
+
def install_os_repositories
|
46
|
+
return if os_repository_resolver.resolved_entries.empty?
|
47
|
+
|
48
|
+
deps = os_repository_manager.os_dependencies
|
49
|
+
ws.install_os_packages(deps, all: nil) unless deps.empty?
|
50
|
+
os_repository_manager.install(os_repository_resolver.resolved_entries)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|