autoproj 2.11.0 → 2.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -8
  3. data/.travis.yml +5 -3
  4. data/autoproj.gemspec +6 -6
  5. data/bin/alog +1 -0
  6. data/bin/autoproj +1 -1
  7. data/bin/autoproj_bootstrap +130 -67
  8. data/bin/autoproj_bootstrap.in +9 -7
  9. data/bin/autoproj_install +129 -63
  10. data/bin/autoproj_install.in +8 -3
  11. data/lib/autoproj/autobuild_extensions/dsl.rb +27 -12
  12. data/lib/autoproj/base.rb +18 -0
  13. data/lib/autoproj/cli/base.rb +1 -1
  14. data/lib/autoproj/cli/build.rb +8 -3
  15. data/lib/autoproj/cli/cache.rb +79 -7
  16. data/lib/autoproj/cli/inspection_tool.rb +5 -6
  17. data/lib/autoproj/cli/main.rb +33 -9
  18. data/lib/autoproj/cli/show.rb +12 -18
  19. data/lib/autoproj/cli/status.rb +15 -9
  20. data/lib/autoproj/cli/test.rb +1 -1
  21. data/lib/autoproj/cli/update.rb +72 -17
  22. data/lib/autoproj/cli/utility.rb +25 -28
  23. data/lib/autoproj/configuration.rb +15 -4
  24. data/lib/autoproj/default.osdeps +29 -3
  25. data/lib/autoproj/environment.rb +17 -13
  26. data/lib/autoproj/installation_manifest.rb +7 -5
  27. data/lib/autoproj/manifest.rb +14 -6
  28. data/lib/autoproj/ops/build.rb +23 -21
  29. data/lib/autoproj/ops/cache.rb +151 -33
  30. data/lib/autoproj/ops/cached_env.rb +2 -2
  31. data/lib/autoproj/ops/import.rb +23 -4
  32. data/lib/autoproj/ops/install.rb +121 -60
  33. data/lib/autoproj/ops/phase_reporting.rb +49 -0
  34. data/lib/autoproj/ops/snapshot.rb +2 -1
  35. data/lib/autoproj/ops/tools.rb +2 -2
  36. data/lib/autoproj/os_package_installer.rb +19 -11
  37. data/lib/autoproj/package_definition.rb +1 -1
  38. data/lib/autoproj/package_managers/apt_dpkg_manager.rb +49 -28
  39. data/lib/autoproj/package_managers/bundler_manager.rb +102 -19
  40. data/lib/autoproj/package_managers/homebrew_manager.rb +2 -2
  41. data/lib/autoproj/package_managers/pip_manager.rb +34 -22
  42. data/lib/autoproj/package_managers/shell_script_manager.rb +44 -24
  43. data/lib/autoproj/package_manifest.rb +43 -31
  44. data/lib/autoproj/package_set.rb +2 -2
  45. data/lib/autoproj/python.rb +285 -0
  46. data/lib/autoproj/test.rb +26 -10
  47. data/lib/autoproj/variable_expansion.rb +3 -1
  48. data/lib/autoproj/vcs_definition.rb +25 -12
  49. data/lib/autoproj/version.rb +1 -1
  50. data/lib/autoproj/workspace.rb +60 -16
  51. data/lib/autoproj.rb +3 -0
  52. metadata +17 -28
@@ -10,7 +10,7 @@ module Autoproj
10
10
  end
11
11
 
12
12
  def package_metadata(package)
13
- u = package.autobuild.test_utility
13
+ u = package.test_utility
14
14
  super.merge(
15
15
  'coverage_available' => !!u.coverage_available?,
16
16
  'coverage_enabled' => !!u.coverage_enabled?,
@@ -1,5 +1,6 @@
1
1
  require 'autoproj/cli'
2
2
  require 'autoproj/cli/base'
3
+ require 'autoproj/cli/status'
3
4
  require 'autoproj/ops/import'
4
5
 
5
6
  module Autoproj
@@ -66,17 +67,20 @@ module Autoproj
66
67
  return selection, options
67
68
  end
68
69
 
69
- def run(selected_packages, run_hook: false, report: true, **options)
70
+ def run(selected_packages, run_hook: false, report: true, ask: false, **options)
70
71
  ws.manifest.accept_unavailable_osdeps = !options[:osdeps]
71
72
  ws.setup
72
73
  ws.autodetect_operating_system(force: true)
73
- if options[:bundler]
74
- ws.update_bundler
75
- end
76
- if options[:autoproj]
77
- ws.update_autoproj
74
+
75
+ if ask
76
+ prompt = TTY::Prompt.new
77
+ options[:bundler] &&= prompt.yes?("Update bundler ?")
78
+ options[:autoproj] &&= prompt.yes?("Update autoproj ?")
78
79
  end
79
80
 
81
+ ws.update_bundler if options[:bundler]
82
+ ws.update_autoproj if options[:autoproj]
83
+
80
84
  begin
81
85
  ws.load_package_sets(
82
86
  mainline: options[:mainline],
@@ -84,7 +88,8 @@ module Autoproj
84
88
  checkout_only: !options[:config] || options[:checkout_only],
85
89
  reset: options[:reset],
86
90
  keep_going: options[:keep_going],
87
- retry_count: options[:retry_count])
91
+ retry_count: options[:retry_count]
92
+ )
88
93
  rescue ImportFailed => configuration_import_failure
89
94
  if !options[:keep_going]
90
95
  raise
@@ -122,6 +127,7 @@ module Autoproj
122
127
  parallel: options[:parallel] || ws.config.parallel_import_level,
123
128
  retry_count: options[:retry_count],
124
129
  auto_exclude: options[:auto_exclude],
130
+ ask: ask,
125
131
  report: report)
126
132
 
127
133
  ws.finalize_setup
@@ -193,15 +199,62 @@ module Autoproj
193
199
  osdeps_options
194
200
  end
195
201
 
202
+ class AskUpdateFilter
203
+ def initialize(prompt, parallel: 1, only_local: false)
204
+ @prompt = prompt
205
+ @only_local = only_local
206
+ @executor = Concurrent::FixedThreadPool.new(parallel, max_length: 0)
207
+
208
+ @parallel = parallel
209
+ @futures = {}
210
+ @lookahead_queue = []
211
+ end
212
+
213
+ def call(pkg)
214
+ unless (status = @futures.delete(pkg).value)
215
+ raise v.reason
216
+ end
217
+
218
+ clean = !status.unexpected &&
219
+ (status.sync || (status.local && !status.remote))
220
+ if clean
221
+ msg = Autobuild.color('already up-to-date', :green)
222
+ pkg.autobuild.message "#{msg} %s"
223
+ return false
224
+ end
225
+
226
+ Autobuild.progress_display_synchronize do
227
+ status.msg.each { |m| puts m }
228
+ @prompt.yes?("Update #{pkg.name} ?")
229
+ end
230
+ end
231
+
232
+ def lookahead(pkg)
233
+ @futures[pkg] = Concurrent::Future.execute(executor: @executor) do
234
+ Status.status_of_package(
235
+ pkg, snapshot: false, only_local: @only_local
236
+ )
237
+ end
238
+ end
239
+ end
240
+
196
241
  def update_packages(selected_packages,
197
242
  from: nil, checkout_only: false, only_local: false, reset: false,
198
243
  deps: true, keep_going: false, parallel: 1,
199
244
  retry_count: 0, osdeps: true, auto_exclude: false, osdeps_options: Hash.new,
200
- report: true)
245
+ report: true, ask: false)
201
246
 
202
- if from
203
- setup_update_from(from)
204
- end
247
+ setup_update_from(from) if from
248
+
249
+ filter =
250
+ if ask
251
+ prompt = TTY::Prompt.new
252
+ filter = AskUpdateFilter.new(
253
+ prompt, parallel: parallel, only_local: only_local
254
+ )
255
+ else
256
+ ->(pkg) { true }
257
+ end
205
258
 
206
259
  ops = Autoproj::Ops::Import.new(
207
260
  ws, report_path: (ws.import_report_path if report))
@@ -215,15 +268,17 @@ module Autoproj
215
268
  parallel: parallel,
216
269
  retry_count: retry_count,
217
270
  install_vcs_packages: (osdeps_options if osdeps),
218
- auto_exclude: auto_exclude)
219
- return source_packages, osdep_packages, nil
271
+ auto_exclude: auto_exclude,
272
+ filter: filter)
273
+ [source_packages, osdep_packages, nil]
220
274
  rescue ExcludedSelection => e
221
275
  raise CLIInvalidSelection, e.message, e.backtrace
222
276
  rescue PackageImportFailed => import_failure
223
- if !keep_going
224
- raise
225
- end
226
- return import_failure.source_packages, import_failure.osdep_packages, import_failure
277
+ raise unless keep_going
278
+
279
+ [import_failure.source_packages,
280
+ import_failure.osdep_packages,
281
+ import_failure]
227
282
  end
228
283
 
229
284
  def setup_update_from(other_root)
@@ -70,7 +70,7 @@ module Autoproj
70
70
  out_format = "%-#{w}s %-7s %-9s"
71
71
  puts format(out_format, 'Package Name', 'Enabled', 'Available')
72
72
  lines.each do |name, enabled, available|
73
- puts(format(out_format, name, (!!enabled).to_s, (!!available).to_s))
73
+ puts(format(out_format, name, (!!enabled).to_s, (!!available).to_s)) # rubocop:disable Style/DoubleNegation
74
74
  end
75
75
  end
76
76
 
@@ -89,24 +89,37 @@ module Autoproj
89
89
  raise CLIInvalidArguments, "autoproj: the provided package "\
90
90
  "is not selected for build"
91
91
  end
92
+ return if package_names.empty?
92
93
 
93
94
  packages = package_names.map do |pkg_name|
94
95
  ws.manifest.find_package_definition(pkg_name)
95
96
  end
96
97
 
97
- Autobuild.apply(
98
- package_names,
99
- "autoproj-#{utility_name}",
100
- [utility_name],
101
- parallel: options[:parallel]
102
- )
98
+ apply_to_packages(packages, parallel: options[:parallel])
99
+ end
103
100
 
101
+ def apply_to_packages(packages, parallel: ws.config.parallel_build_level)
102
+ if @report_path
103
+ reporting = Ops::PhaseReporting.new(
104
+ @utility_name, @report_path,
105
+ method(:package_metadata)
106
+ )
107
+ end
108
+
109
+ reporting&.initialize_incremental_report
110
+ Autobuild.apply(
111
+ packages.map(&:name), "autoproj-#{@utility_name}",
112
+ [@utility_name], parallel: parallel
113
+ ) do |pkg, phase|
114
+ reporting&.report_incremental(pkg) if phase == utility_name
115
+ end
104
116
  ensure
105
- create_report(packages) if packages && @report_path
117
+ reporting&.create_report(packages.map(&:autobuild))
106
118
  end
107
119
 
108
- def package_metadata(package)
109
- u = package.autobuild.utility(@utility_name)
120
+ def package_metadata(autobuild_package)
121
+ # rubocop:disable Style/DoubleNegation
122
+ u = autobuild_package.utility(@utility_name)
110
123
  {
111
124
  'source_dir' => u.source_dir,
112
125
  'target_dir' => u.target_dir,
@@ -114,25 +127,9 @@ module Autoproj
114
127
  'enabled' => !!u.enabled?,
115
128
  'invoked' => !!u.invoked?,
116
129
  'success' => !!u.success?,
117
- 'installed' => !!u.installed?,
130
+ 'installed' => !!u.installed?
118
131
  }
119
- end
120
-
121
- def create_report(packages)
122
- info = packages.each_with_object({}) do |p, map|
123
- map[p.name] = package_metadata(p)
124
- end
125
-
126
- FileUtils.mkdir_p File.dirname(@report_path)
127
- File.open(@report_path, 'w') do |io|
128
- dump = JSON.dump(
129
- "#{@utility_name}_report" => {
130
- 'timestamp' => Time.now,
131
- 'packages' => info
132
- }
133
- )
134
- io.write dump
135
- end
132
+ # rubocop:enable Style/DoubleNegation
136
133
  end
137
134
  end
138
135
  end
@@ -196,7 +196,9 @@ module Autoproj
196
196
  Autoproj.info " using: #{value} (noninteractive mode)"
197
197
  end
198
198
  @modified = true
199
- if !is_default
199
+ if is_default
200
+ value = opt.validate(value)
201
+ else
200
202
  config[option_name] = [value, true]
201
203
  displayed_options[option_name] = value
202
204
  end
@@ -242,10 +244,10 @@ module Autoproj
242
244
  @modified = false
243
245
  end
244
246
 
245
- def each_reused_autoproj_installation
247
+ def each_reused_autoproj_installation(&block)
246
248
  if has_value_for?('reused_autoproj_installations')
247
- get('reused_autoproj_installations').each(&proc)
248
- else [].each(&proc)
249
+ get('reused_autoproj_installations').each(&block)
250
+ else [].each(&block)
249
251
  end
250
252
  end
251
253
 
@@ -353,6 +355,10 @@ module Autoproj
353
355
  set 'shell_helpers', flag, true
354
356
  end
355
357
 
358
+ def bundler_version
359
+ get 'bundler_version', nil
360
+ end
361
+
356
362
  def apply_autobuild_configuration
357
363
  if has_value_for?('autobuild')
358
364
  params = get('autobuild')
@@ -369,6 +375,11 @@ module Autoproj
369
375
  get('importer_cache_dir', nil)
370
376
  end
371
377
 
378
+ # Set import and gem cache directory
379
+ def importer_cache_dir=(path)
380
+ set('importer_cache_dir', path, true)
381
+ end
382
+
372
383
  # Sets the directory in which packages will be installed
373
384
  def prefix_dir=(path)
374
385
  set('prefix', path, true)
@@ -92,6 +92,12 @@ ruby24:
92
92
  ruby25:
93
93
  default: ignore # we assume that if the user has a ruby 2.5 runtime, it is usable
94
94
 
95
+ ruby26:
96
+ default: ignore # we assume that if the user has a ruby 2.5 runtime, it is usable
97
+
98
+ ruby27:
99
+ default: ignore # we assume that if the user has a ruby 2.5 runtime, it is usable
100
+
95
101
  build-essential:
96
102
  debian,ubuntu: build-essential
97
103
  gentoo: ignore
@@ -132,15 +138,19 @@ archive:
132
138
  debian,ubuntu:
133
139
  - tar
134
140
  - unzip
141
+ - ca-certificates
135
142
  gentoo:
136
143
  - app-arch/tar
137
144
  - app-arch/unzip
145
+ - app-misc/ca-certificates
138
146
  arch:
139
147
  - tar
140
148
  - unzip
149
+ - ca-certificates
141
150
  fedora:
142
151
  - tar
143
152
  - unzip
153
+ - ca-certificates
144
154
  macos-port:
145
155
  - gnutar
146
156
  - unzip
@@ -149,13 +159,19 @@ archive:
149
159
  opensuse:
150
160
  - tar
151
161
  - unzip
162
+ - ca-certificates
152
163
  default: ignore
153
164
 
154
165
  cvs:
155
166
  default: cvs
156
167
 
157
168
  pip:
158
- debian,ubuntu: python-pip
169
+ debian:
170
+ '8,jessie,9,stretch': python-pip
171
+ default: python3-pip
172
+ ubuntu:
173
+ '16.04,18.04': python-pip
174
+ default: python3-pip
159
175
  arch: python2-pip
160
176
  opensuse: python-pip
161
177
  fedora: python-pip
@@ -164,7 +180,12 @@ pip:
164
180
 
165
181
  python:
166
182
  arch: python2
167
- debian,ubuntu: python-dev
183
+ debian:
184
+ '8,jessie,9,stretch': python-dev
185
+ default: python3-dev
186
+ ubuntu:
187
+ '16.04,18.04': python-dev
188
+ default: python3-dev
168
189
  fedora: python-devel
169
190
  freebsd: python-devel
170
191
  gentoo: dev-lang/python
@@ -173,7 +194,12 @@ python:
173
194
 
174
195
  python-setuptools:
175
196
  arch: python2-distribute
176
- debian,ubuntu: python-setuptools
197
+ debian:
198
+ '8,jessie,9,stretch': python-setuptools
199
+ default: python3-setuptools
200
+ ubuntu:
201
+ '16.04,18.04': python-setuptools
202
+ default: python3-setuptools
177
203
  fedora: python-setuptools
178
204
  gentoo: dev-python/setuptools
179
205
  default: ignore # will be installed manually by the user
@@ -17,6 +17,22 @@ module Autoproj
17
17
  Autoproj.filter_out_paths_in_workspace(env)
18
18
  end
19
19
 
20
+ def env_filename(shell, *subdir)
21
+ env_filename = if shell == 'sh'
22
+ ENV_FILENAME
23
+ else
24
+ (Pathname(ENV_FILENAME).sub_ext '').to_s.concat(".#{shell}")
25
+ end
26
+
27
+ File.join(root_dir, *subdir, env_filename)
28
+ end
29
+
30
+ def each_env_filename(*subdir)
31
+ (['sh'] + Autoproj.workspace.config.user_shells).to_set.each do |shell|
32
+ yield shell, env_filename(shell, *subdir)
33
+ end
34
+ end
35
+
20
36
  def export_env_sh(subdir = nil, options = Hash.new)
21
37
  if subdir.kind_of?(Hash)
22
38
  subdir, options = nil, subdir
@@ -28,19 +44,7 @@ module Autoproj
28
44
  completion_dir = File.join(shell_dir, 'completion')
29
45
  env_updated = false
30
46
 
31
- (['sh'] + Autoproj.workspace.config.user_shells).to_set.each do |shell|
32
- env_filename = if shell == 'sh'
33
- ENV_FILENAME
34
- else
35
- (Pathname(ENV_FILENAME).sub_ext '').to_s.concat(".#{shell}")
36
- end
37
-
38
- filename = if subdir
39
- File.join(root_dir, subdir, env_filename)
40
- else
41
- File.join(root_dir, env_filename)
42
- end
43
-
47
+ each_env_filename(*[subdir].compact) do |shell, filename|
44
48
  helper = File.join(shell_dir, "autoproj_#{shell}")
45
49
  if options[:shell_helpers]
46
50
  source_after(helper, shell: shell) if File.file?(helper)
@@ -1,7 +1,8 @@
1
1
  module Autoproj
2
2
  # Manifest of installed packages imported from another autoproj installation
3
3
  class InstallationManifest
4
- Package = Struct.new :name, :type, :vcs, :srcdir, :prefix, :builddir, :logdir, :dependencies
4
+ Package = Struct.new :name, :type, :vcs, :srcdir, :importdir,
5
+ :prefix, :builddir, :logdir, :dependencies
5
6
  PackageSet = Struct.new :name, :vcs, :raw_local_dir, :user_local_dir
6
7
 
7
8
  attr_reader :path
@@ -28,11 +29,11 @@ module Autoproj
28
29
  def each_package_set(&block)
29
30
  package_sets.each_value(&block)
30
31
  end
31
-
32
+
32
33
  def each_package(&block)
33
34
  packages.each_value(&block)
34
35
  end
35
-
36
+
36
37
  def load
37
38
  @packages = Hash.new
38
39
  raw = YAML.load(File.open(path))
@@ -51,8 +52,8 @@ module Autoproj
51
52
  package_sets[pkg_set.name] = pkg_set
52
53
  else
53
54
  pkg = Package.new(
54
- entry['name'], entry['type'], entry['vcs'], entry['srcdir'], entry['prefix'],
55
- entry['builddir'], entry['logdir'], entry['dependencies'])
55
+ entry['name'], entry['type'], entry['vcs'], entry['srcdir'], entry['importdir'],
56
+ entry['prefix'], entry['builddir'], entry['logdir'], entry['dependencies'])
56
57
  packages[pkg.name] = pkg
57
58
  end
58
59
  end
@@ -74,6 +75,7 @@ module Autoproj
74
75
  'type' => v.class.name,
75
76
  'vcs' => package_def.vcs.to_hash,
76
77
  'srcdir' => v.srcdir,
78
+ 'importdir' => (v.importdir if v.respond_to?(:importdir)),
77
79
  'builddir' => (v.builddir if v.respond_to?(:builddir)),
78
80
  'logdir' => v.logdir,
79
81
  'prefix' => v.prefix,