autobuild 1.18.1 → 1.22.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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/lint.yml +25 -0
  3. data/.github/workflows/test.yml +30 -0
  4. data/.rubocop.yml +14 -7
  5. data/autobuild.gemspec +8 -6
  6. data/bin/autobuild +1 -1
  7. data/lib/autobuild/build_logfile.rb +1 -2
  8. data/lib/autobuild/config.rb +18 -5
  9. data/lib/autobuild/configurable.rb +3 -1
  10. data/lib/autobuild/environment.rb +28 -45
  11. data/lib/autobuild/exceptions.rb +11 -5
  12. data/lib/autobuild/import/archive.rb +31 -22
  13. data/lib/autobuild/import/cvs.rb +6 -6
  14. data/lib/autobuild/import/darcs.rb +4 -4
  15. data/lib/autobuild/import/git-lfs.rb +4 -4
  16. data/lib/autobuild/import/git.rb +153 -68
  17. data/lib/autobuild/import/hg.rb +7 -7
  18. data/lib/autobuild/import/svn.rb +15 -9
  19. data/lib/autobuild/importer.rb +38 -38
  20. data/lib/autobuild/mail_reporter.rb +5 -2
  21. data/lib/autobuild/package.rb +45 -35
  22. data/lib/autobuild/packages/autotools.rb +3 -8
  23. data/lib/autobuild/packages/cmake.rb +16 -7
  24. data/lib/autobuild/packages/dummy.rb +0 -4
  25. data/lib/autobuild/packages/gnumake.rb +1 -1
  26. data/lib/autobuild/packages/orogen.rb +11 -4
  27. data/lib/autobuild/packages/pkgconfig.rb +2 -2
  28. data/lib/autobuild/packages/python.rb +6 -8
  29. data/lib/autobuild/packages/ruby.rb +5 -5
  30. data/lib/autobuild/parallel.rb +20 -21
  31. data/lib/autobuild/pkgconfig.rb +1 -0
  32. data/lib/autobuild/progress_display.rb +130 -49
  33. data/lib/autobuild/rake_task_extension.rb +16 -5
  34. data/lib/autobuild/reporting.rb +20 -7
  35. data/lib/autobuild/subcommand.rb +24 -23
  36. data/lib/autobuild/test_utility.rb +2 -1
  37. data/lib/autobuild/timestamps.rb +3 -3
  38. data/lib/autobuild/utility.rb +54 -8
  39. data/lib/autobuild/version.rb +1 -1
  40. data/lib/autobuild.rb +0 -3
  41. metadata +42 -26
  42. data/.travis.yml +0 -19
@@ -1,19 +1,30 @@
1
1
  module Autobuild
2
2
  module RakeTaskExtension
3
+ def initialize(*, **)
4
+ super
5
+ @disabled = false
6
+ end
7
+
3
8
  def already_invoked?
4
9
  @already_invoked
5
10
  end
6
11
 
7
12
  attr_writer :already_invoked
8
13
 
9
- def disable!
10
- @already_invoked = true
11
- singleton_class.class_eval do
12
- define_method(:needed?) { false }
13
- end
14
+ def disabled?
15
+ @disabled
16
+ end
17
+
18
+ def disabled!
19
+ disable
20
+ end
21
+
22
+ def disable
23
+ @disabled = true
14
24
  end
15
25
  end
16
26
  end
27
+
17
28
  class Rake::Task # rubocop:disable Style/ClassAndModuleChildren
18
29
  include Autobuild::RakeTaskExtension
19
30
  end
@@ -47,10 +47,23 @@ module Autobuild
47
47
  @display.progress_enabled?
48
48
  end
49
49
 
50
+ def self.progress_display_synchronize(&block)
51
+ @display.synchronize(&block)
52
+ end
53
+
54
+ # @deprecated use {progress_display_mode=} instead
50
55
  def self.progress_display_enabled=(value)
51
56
  @display.progress_enabled = value
52
57
  end
53
58
 
59
+ def self.progress_display_mode=(value)
60
+ @display.progress_mode = value
61
+ end
62
+
63
+ def self.progress_display_period=(value)
64
+ @display.progress_period = value
65
+ end
66
+
54
67
  def self.message(*args, **options)
55
68
  @display.message(*args, **options)
56
69
  end
@@ -92,8 +105,8 @@ module Autobuild
92
105
  interrupted = e
93
106
  rescue Autobuild::Exception => e
94
107
  return report_finish_on_error([e],
95
- on_package_failures: on_package_failures,
96
- interrupted_by: interrupted)
108
+ on_package_failures: on_package_failures,
109
+ interrupted_by: interrupted)
97
110
  end
98
111
 
99
112
  # If ignore_erorrs is true, check if some packages have failed
@@ -105,8 +118,8 @@ module Autobuild
105
118
  end
106
119
 
107
120
  report_finish_on_error(errors,
108
- on_package_failures: on_package_failures,
109
- interrupted_by: interrupted)
121
+ on_package_failures: on_package_failures,
122
+ interrupted_by: interrupted)
110
123
  end
111
124
 
112
125
  # @api private
@@ -157,7 +170,7 @@ module Autobuild
157
170
  if interrupted_by
158
171
  raise interrupted_by
159
172
  else
160
- return errors
173
+ errors
161
174
  end
162
175
  elsif %i[exit exit_silent].include?(on_package_failures)
163
176
  exit 1
@@ -231,8 +244,8 @@ module Autobuild
231
244
  scaled_size = (size / scale)
232
245
  if scaled_size > 1
233
246
  return format("%3.1<scaled>f%<scale_name>s",
234
- scaled: scaled_size,
235
- scale_name: name)
247
+ scaled: scaled_size,
248
+ scale_name: name)
236
249
  end
237
250
  end
238
251
  end
@@ -161,6 +161,7 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
161
161
  def initialize(status, do_retry)
162
162
  @status = status
163
163
  @retry = do_retry
164
+ super()
164
165
  end
165
166
  end
166
167
 
@@ -222,12 +223,14 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
222
223
 
223
224
  if command.last.kind_of?(Hash)
224
225
  options = command.pop
225
- options = Kernel.validate_options options,
226
+ options = Kernel.validate_options(
227
+ options,
226
228
  input: nil, working_directory: nil, retry: false,
227
229
  input_streams: [],
228
230
  env: ENV.to_hash,
229
231
  env_inherit: true,
230
232
  encoding: 'BINARY'
233
+ )
231
234
 
232
235
  input_streams << File.open(options[:input]) if options[:input]
233
236
  input_streams.concat(options[:input_streams]) if options[:input_streams]
@@ -255,8 +258,8 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
255
258
  options[:working_directory] ||= target.working_directory
256
259
  end
257
260
 
258
- logname = File.join(logdir, "#{target_name.gsub(/[:]/, '_')}-"\
259
- "#{phase.to_s.gsub(/[:]/, '_')}.log")
261
+ logname = File.join(logdir, "#{target_name.gsub(/:/, '_')}-"\
262
+ "#{phase.to_s.gsub(/:/, '_')}.log")
260
263
  unless File.directory?(File.dirname(logname))
261
264
  FileUtils.mkdir_p File.dirname(logname)
262
265
  end
@@ -312,8 +315,9 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
312
315
  if Autobuild.windows?
313
316
  Dir.chdir(options[:working_directory]) do
314
317
  unless system(*command)
315
- raise Failed.new($CHILD_STATUS.exitstatus, nil),
316
- "'#{command.join(' ')}' returned status #{status.exitstatus}"
318
+ exit_code = $CHILD_STATUS.exitstatus
319
+ raise Failed.new(exit_code, nil),
320
+ "'#{command.join(' ')}' returned status #{exit_code}"
317
321
  end
318
322
  end
319
323
  return # rubocop:disable Lint/NonLocalExitFromIterator
@@ -322,7 +326,6 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
322
326
  cwrite.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
323
327
 
324
328
  pid = fork do
325
- begin
326
329
  logfile.puts "in directory #{options[:working_directory] || Dir.pwd}"
327
330
 
328
331
  cwrite.sync = true
@@ -340,20 +343,19 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
340
343
  end
341
344
 
342
345
  exec(env, *command,
343
- chdir: options[:working_directory] || Dir.pwd,
344
- close_others: false)
345
- rescue Errno::ENOENT
346
+ chdir: options[:working_directory] || Dir.pwd,
347
+ close_others: false)
348
+ rescue Errno::ENOENT
346
349
  cwrite.write([CONTROL_COMMAND_NOT_FOUND].pack('I'))
347
350
  exit(100)
348
- rescue Interrupt
351
+ rescue Interrupt
349
352
  cwrite.write([CONTROL_INTERRUPT].pack('I'))
350
353
  exit(100)
351
- rescue ::Exception => e
354
+ rescue ::Exception => e
352
355
  STDERR.puts e
353
356
  STDERR.puts e.backtrace.join("\n ")
354
357
  cwrite.write([CONTROL_UNEXPECTED].pack('I'))
355
358
  exit(100)
356
- end
357
359
  end
358
360
 
359
361
  readbuffer = StringIO.new
@@ -372,7 +374,7 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
372
374
  end
373
375
  rescue Errno::ENOENT => e
374
376
  raise Failed.new(nil, false),
375
- "cannot open input files: #{e.message}", retry: false
377
+ "cannot open input files: #{e.message}", retry: false
376
378
  end
377
379
  pwrite.close
378
380
  end
@@ -382,15 +384,14 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
382
384
  value = cread.read(4)
383
385
  if value
384
386
  # An error occured
385
- value = value.unpack('I').first
386
- if value == CONTROL_COMMAND_NOT_FOUND
387
- raise Failed.new(nil, false),
388
- "command '#{command.first}' not found"
389
- elsif value == CONTROL_INTERRUPT
387
+ value = value.unpack1('I')
388
+ case value
389
+ when CONTROL_COMMAND_NOT_FOUND
390
+ raise Failed.new(nil, false), "command '#{command.first}' not found"
391
+ when CONTROL_INTERRUPT
390
392
  raise Interrupt, "command '#{command.first}': interrupted by user"
391
393
  else
392
- raise Failed.new(nil, false),
393
- "something unexpected happened"
394
+ raise Failed.new(nil, false), "something unexpected happened"
394
395
  end
395
396
  end
396
397
 
@@ -439,10 +440,10 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
439
440
 
440
441
  if status.termsig
441
442
  raise Failed.new(status.exitstatus, nil),
442
- "'#{command.join(' ')}' terminated by signal #{status.termsig}"
443
+ "'#{command.join(' ')}' terminated by signal #{status.termsig}"
443
444
  else
444
445
  raise Failed.new(status.exitstatus, nil),
445
- "'#{command.join(' ')}' returned status #{status.exitstatus}"
446
+ "'#{command.join(' ')}' returned status #{status.exitstatus}"
446
447
  end
447
448
  end
448
449
 
@@ -458,7 +459,7 @@ module Autobuild::Subprocess # rubocop:disable Style/ClassAndModuleChildren
458
459
  subcommand_output
459
460
  rescue Failed => e
460
461
  error = Autobuild::SubcommandFailed.new(target, command.join(" "),
461
- logname, e.status, subcommand_output)
462
+ logname, e.status, subcommand_output)
462
463
  error.retry = if e.retry?.nil? then options[:retry]
463
464
  else e.retry?
464
465
  end
@@ -73,7 +73,8 @@ module Autobuild
73
73
  def coverage_target_dir
74
74
  if @coverage_target_dir
75
75
  File.expand_path(@coverage_target_dir, package.prefix)
76
- else File.join(target_dir, 'coverage')
76
+ elsif (target_dir = self.target_dir)
77
+ File.join(target_dir, 'coverage')
77
78
  end
78
79
  end
79
80
 
@@ -58,8 +58,7 @@ module Autobuild
58
58
  class SourceTreeTask < Rake::Task
59
59
  attr_accessor :exclude
60
60
 
61
- attr_reader :newest_file
62
- attr_reader :newest_time
61
+ attr_reader :newest_file, :newest_time
63
62
 
64
63
  def initialize(*args, &block)
65
64
  @exclude = Autobuild.ignored_files.dup
@@ -71,10 +70,11 @@ module Autobuild
71
70
 
72
71
  @newest_file, @newest_time =
73
72
  Autobuild.tree_timestamp(name,
74
- %r{(?:^|/)(?:CVS|_darcs|\.svn)$}, *@exclude)
73
+ %r{(?:^|/)(?:CVS|_darcs|\.svn)$}, *@exclude)
75
74
  @newest_time
76
75
  end
77
76
  end
77
+
78
78
  def self.source_tree(path, &block)
79
79
  task = SourceTreeTask.define_task(path)
80
80
  block&.call(task)
@@ -29,6 +29,11 @@ module Autobuild
29
29
  @source_dir = nil
30
30
  @target_dir = nil
31
31
  @install_on_error = install_on_error
32
+
33
+ @no_results = false
34
+ @invoked = false
35
+ @success = false
36
+ @installed = false
32
37
  end
33
38
 
34
39
  # Directory in which the utility will generate some files The
@@ -54,6 +59,23 @@ module Autobuild
54
59
  # not install anything
55
60
  attr_writer :target_dir
56
61
 
62
+ # Controls whether this utility generates results or not
63
+ #
64
+ # By default, Autobuild assumes that utilities generate report or
65
+ # artifact files, that are saved in {#target_dir}. Set this flag to
66
+ # true to disable this behavior, in which case the only report will
67
+ # be the console output during run
68
+ #
69
+ # @see no_results?
70
+ attr_writer :no_results
71
+
72
+ # Whether this utility generates results or not
73
+ #
74
+ # @see no_results=
75
+ def no_results?
76
+ @no_results
77
+ end
78
+
57
79
  # Absolute path to where the utility product files have to be installed.
58
80
  # Returns nil if {target_dir} is not set.
59
81
  #
@@ -62,7 +84,7 @@ module Autobuild
62
84
  if @target_dir
63
85
  utility_prefix = Autobuild.send("#{name}_prefix") || name
64
86
  File.expand_path(@target_dir,
65
- File.expand_path(utility_prefix, package.prefix))
87
+ File.expand_path(utility_prefix, package.prefix))
66
88
  else
67
89
  File.join(package.logdir, "#{name}-results", package.name)
68
90
  end
@@ -98,15 +120,21 @@ module Autobuild
98
120
  end
99
121
 
100
122
  def call_task_block
101
- yield if block_given?
123
+ @invoked = true
124
+
125
+ begin
126
+ yield if block_given?
127
+ @success = true
128
+ rescue StandardError => e
129
+ install if install_on_error? && !@installed && !no_results?
130
+ raise
131
+ end
102
132
 
103
133
  # Allow the user to install manually in the task
104
134
  # block
105
- install if !@installed && target_dir
106
- rescue Interrupt
107
- raise
108
- rescue ::Exception => e
109
- install if install_on_error? && !@installed && target_dir
135
+ install if !@installed && !no_results?
136
+ rescue StandardError => e
137
+ @success = false
110
138
 
111
139
  if Autobuild.send("pass_#{name}_errors")
112
140
  raise
@@ -128,7 +156,7 @@ module Autobuild
128
156
  #
129
157
  # @return [Boolean]
130
158
  def available?
131
- @available && (source_dir && @task)
159
+ @available && @task && (no_results? || source_dir)
132
160
  end
133
161
 
134
162
  # True if this utility should be executed
@@ -167,6 +195,24 @@ module Autobuild
167
195
  @installed = true
168
196
  end
169
197
 
198
+ # True if the utility has been invoked
199
+ def invoked?
200
+ @invoked
201
+ end
202
+
203
+ # True if the utility has been successful
204
+ #
205
+ # Combine with {#invoked?} to determine whether 'false' means 'not run'
206
+ # or 'failed'
207
+ def success?
208
+ @success
209
+ end
210
+
211
+ # True if the utility's results have been installed
212
+ def installed?
213
+ @installed
214
+ end
215
+
170
216
  # Can be called in the block given to {task} to announce that the
171
217
  # utility is to be disabled for that package. This is mainly used
172
218
  # when a runtime check is necessary to know if a package can run
@@ -1,3 +1,3 @@
1
1
  module Autobuild
2
- VERSION = "1.18.1".freeze unless defined? Autobuild::VERSION
2
+ VERSION = "1.22.0".freeze unless defined? Autobuild::VERSION
3
3
  end
data/lib/autobuild.rb CHANGED
@@ -17,11 +17,9 @@ require 'etc'
17
17
  require 'find'
18
18
  require 'pathname'
19
19
  require 'shellwords'
20
- require 'find'
21
20
  require 'rake/tasklib'
22
21
  require 'fileutils'
23
22
  require 'optparse'
24
- require 'rake'
25
23
  require 'singleton'
26
24
  require 'pastel'
27
25
  require 'tty-prompt'
@@ -43,7 +41,6 @@ require 'autobuild/config'
43
41
  require 'autobuild/importer'
44
42
  require 'autobuild/import/cvs'
45
43
  require 'autobuild/import/darcs'
46
- require 'autobuild/importer'
47
44
  require 'autobuild/import/git'
48
45
  require 'autobuild/import/hg'
49
46
  require 'autobuild/import/svn'
metadata CHANGED
@@ -1,33 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autobuild
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.18.1
4
+ version: 1.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-10 00:00:00.000000000 Z
11
+ date: 2021-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: pastel
14
+ name: concurrent-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.7.0
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 0.7.0
19
+ version: '1.1'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pastel
29
+ requirement: !ruby/object:Gem::Requirement
26
30
  requirements:
27
31
  - - "~>"
28
32
  - !ruby/object:Gem::Version
29
33
  version: 0.7.0
30
- - - ">="
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
31
39
  - !ruby/object:Gem::Version
32
40
  version: 0.7.0
33
41
  - !ruby/object:Gem::Dependency
@@ -36,62 +44,56 @@ dependencies:
36
44
  requirements:
37
45
  - - "~>"
38
46
  - !ruby/object:Gem::Version
39
- version: '12.0'
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 12.3.0
47
+ version: '13.0'
43
48
  type: :runtime
44
49
  prerelease: false
45
50
  version_requirements: !ruby/object:Gem::Requirement
46
51
  requirements:
47
52
  - - "~>"
48
53
  - !ruby/object:Gem::Version
49
- version: '12.0'
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: 12.3.0
54
+ version: '13.0'
53
55
  - !ruby/object:Gem::Dependency
54
56
  name: tty-cursor
55
57
  requirement: !ruby/object:Gem::Requirement
56
58
  requirements:
57
59
  - - "~>"
58
60
  - !ruby/object:Gem::Version
59
- version: 0.5.0
61
+ version: 0.7.0
60
62
  type: :runtime
61
63
  prerelease: false
62
64
  version_requirements: !ruby/object:Gem::Requirement
63
65
  requirements:
64
66
  - - "~>"
65
67
  - !ruby/object:Gem::Version
66
- version: 0.5.0
68
+ version: 0.7.0
67
69
  - !ruby/object:Gem::Dependency
68
70
  name: tty-prompt
69
71
  requirement: !ruby/object:Gem::Requirement
70
72
  requirements:
71
73
  - - "~>"
72
74
  - !ruby/object:Gem::Version
73
- version: 0.15.0
75
+ version: 0.21.0
74
76
  type: :runtime
75
77
  prerelease: false
76
78
  version_requirements: !ruby/object:Gem::Requirement
77
79
  requirements:
78
80
  - - "~>"
79
81
  - !ruby/object:Gem::Version
80
- version: 0.15.0
82
+ version: 0.21.0
81
83
  - !ruby/object:Gem::Dependency
82
84
  name: tty-screen
83
85
  requirement: !ruby/object:Gem::Requirement
84
86
  requirements:
85
87
  - - "~>"
86
88
  - !ruby/object:Gem::Version
87
- version: 0.6.4
89
+ version: 0.8.0
88
90
  type: :runtime
89
91
  prerelease: false
90
92
  version_requirements: !ruby/object:Gem::Requirement
91
93
  requirements:
92
94
  - - "~>"
93
95
  - !ruby/object:Gem::Version
94
- version: 0.6.4
96
+ version: 0.8.0
95
97
  - !ruby/object:Gem::Dependency
96
98
  name: utilrb
97
99
  requirement: !ruby/object:Gem::Requirement
@@ -180,6 +182,20 @@ dependencies:
180
182
  - - ">="
181
183
  - !ruby/object:Gem::Version
182
184
  version: '0'
185
+ - !ruby/object:Gem::Dependency
186
+ name: timecop
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
183
199
  description: Collection of classes to handle build systems (CMake, autotools, ...)
184
200
  and import mechanisms (tarballs, CVS, SVN, git, ...). It also offers a Rake integration
185
201
  to import and build such software packages. It is the backbone of the autoproj (http://rock-robotics.org/autoproj)
@@ -190,9 +206,10 @@ extensions: []
190
206
  extra_rdoc_files: []
191
207
  files:
192
208
  - ".gitattributes"
209
+ - ".github/workflows/lint.yml"
210
+ - ".github/workflows/test.yml"
193
211
  - ".gitignore"
194
212
  - ".rubocop.yml"
195
- - ".travis.yml"
196
213
  - Changes.txt
197
214
  - Gemfile
198
215
  - Manifest.txt
@@ -253,15 +270,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
253
270
  requirements:
254
271
  - - ">="
255
272
  - !ruby/object:Gem::Version
256
- version: 2.3.0
273
+ version: 2.5.0
257
274
  required_rubygems_version: !ruby/object:Gem::Requirement
258
275
  requirements:
259
276
  - - ">="
260
277
  - !ruby/object:Gem::Version
261
278
  version: '0'
262
279
  requirements: []
263
- rubyforge_project:
264
- rubygems_version: 2.7.6.2
280
+ rubygems_version: 3.1.2
265
281
  signing_key:
266
282
  specification_version: 4
267
283
  summary: Library to handle build systems and import mechanisms