autobuild 1.17.0 → 1.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +107 -0
  3. data/Gemfile +2 -1
  4. data/Rakefile +1 -4
  5. data/autobuild.gemspec +14 -11
  6. data/bin/autobuild +4 -3
  7. data/lib/autobuild.rb +4 -5
  8. data/lib/autobuild/build_logfile.rb +6 -4
  9. data/lib/autobuild/config.rb +90 -40
  10. data/lib/autobuild/configurable.rb +30 -18
  11. data/lib/autobuild/environment.rb +126 -120
  12. data/lib/autobuild/exceptions.rb +48 -31
  13. data/lib/autobuild/import/archive.rb +134 -82
  14. data/lib/autobuild/import/cvs.rb +28 -24
  15. data/lib/autobuild/import/darcs.rb +13 -16
  16. data/lib/autobuild/import/git-lfs.rb +37 -30
  17. data/lib/autobuild/import/git.rb +231 -179
  18. data/lib/autobuild/import/hg.rb +23 -18
  19. data/lib/autobuild/import/svn.rb +48 -29
  20. data/lib/autobuild/importer.rb +530 -499
  21. data/lib/autobuild/mail_reporter.rb +77 -77
  22. data/lib/autobuild/package.rb +171 -101
  23. data/lib/autobuild/packages/autotools.rb +47 -42
  24. data/lib/autobuild/packages/cmake.rb +71 -65
  25. data/lib/autobuild/packages/dummy.rb +9 -8
  26. data/lib/autobuild/packages/genom.rb +1 -1
  27. data/lib/autobuild/packages/gnumake.rb +19 -13
  28. data/lib/autobuild/packages/import.rb +2 -6
  29. data/lib/autobuild/packages/orogen.rb +32 -31
  30. data/lib/autobuild/packages/pkgconfig.rb +2 -2
  31. data/lib/autobuild/packages/python.rb +7 -2
  32. data/lib/autobuild/packages/ruby.rb +22 -17
  33. data/lib/autobuild/parallel.rb +35 -39
  34. data/lib/autobuild/pkgconfig.rb +25 -13
  35. data/lib/autobuild/progress_display.rb +23 -23
  36. data/lib/autobuild/rake_task_extension.rb +6 -6
  37. data/lib/autobuild/reporting.rb +38 -26
  38. data/lib/autobuild/subcommand.rb +72 -65
  39. data/lib/autobuild/test.rb +8 -7
  40. data/lib/autobuild/test_utility.rb +10 -9
  41. data/lib/autobuild/timestamps.rb +28 -23
  42. data/lib/autobuild/tools.rb +17 -16
  43. data/lib/autobuild/utility.rb +16 -18
  44. data/lib/autobuild/version.rb +1 -1
  45. metadata +39 -38
@@ -7,27 +7,28 @@ class DummyPackage < Package
7
7
  def installstamp
8
8
  "#{srcdir}/#{STAMPFILE}"
9
9
  end
10
-
10
+
11
11
  def initialize(*args)
12
12
  super
13
13
  end
14
14
 
15
- def import(options = Hash.new)
16
- end
15
+ def import(options = Hash.new); end
17
16
 
18
17
  def prepare
19
- %w{import prepare build doc}.each do |phase|
18
+ %w[import prepare build doc].each do |phase|
20
19
  task "#{name}-#{phase}"
21
20
  t = Rake::Task["#{name}-#{phase}"]
22
- def t.needed?; false end
21
+ def t.needed?
22
+ false
23
+ end
23
24
  end
24
25
  task(installstamp)
25
26
  t = Rake::Task[installstamp]
26
- def t.needed?; false end
27
+ def t.needed?
28
+ false
29
+ end
27
30
 
28
31
  super
29
32
  end
30
33
  end
31
34
  end
32
-
33
-
@@ -74,7 +74,7 @@ def get_requires
74
74
  end
75
75
  end
76
76
 
77
- # Alias this package to the ones defined in the EXTRA_PKGCONFIG
77
+ # Alias this package to the ones defined in the EXTRA_PKGCONFIG
78
78
  # flag in configure.ac.user
79
79
  def get_provides
80
80
  configure_ac_user = File.join(srcdir, 'configure.ac.user')
@@ -4,13 +4,13 @@ module Autobuild
4
4
  def self.make_is_gnumake?(pkg, path = Autobuild.tool(:make))
5
5
  @make_is_gnumake ||= Hash.new
6
6
  @gnumake_version ||= Hash.new
7
- if @make_is_gnumake.has_key?(path)
7
+ if @make_is_gnumake.key?(path)
8
8
  @make_is_gnumake[path]
9
9
  else
10
10
  begin
11
11
  result = pkg.run('prepare', path, '--version')
12
12
  @make_is_gnumake[path] = (result.first =~ /GNU Make/)
13
- @gnumake_version[path] = result.first.scan(/[\d.]+/)[0]
13
+ @gnumake_version[path] = Gem::Version.new(result.first.scan(/[\d.]+/)[0])
14
14
  rescue Autobuild::SubcommandFailed
15
15
  @make_is_gnumake[path] = false
16
16
  end
@@ -28,31 +28,37 @@ def self.make_has_gnumake_jobserver?(pkg, path = Autobuild.tool(:make))
28
28
  def self.invoke_make_parallel(pkg, cmd_path = Autobuild.tool(:make))
29
29
  reserved = nil
30
30
  if make_has_j_option?(pkg, cmd_path) && pkg.parallel_build_level != 1
31
- if manager = Autobuild.parallel_task_manager
31
+ if (manager = Autobuild.parallel_task_manager)
32
32
  job_server = manager.job_server
33
- if !make_has_gnumake_jobserver?(pkg, cmd_path) || (pkg.parallel_build_level != Autobuild.parallel_build_level)
33
+
34
+ specific_parallel_level = (pkg.parallel_build_level !=
35
+ Autobuild.parallel_build_level)
36
+ if !make_has_gnumake_jobserver?(pkg, cmd_path) || specific_parallel_level
34
37
  reserved = pkg.parallel_build_level
35
- job_server.get(reserved - 1) # We already have one token taken by autobuild itself
38
+ # Account for the one token autobuild uses
39
+ job_server.get(reserved - 1)
36
40
  yield("-j#{pkg.parallel_build_level}")
37
41
  end
38
- if Gem::Version.new(@gnumake_version[cmd_path]) >= Gem::Version.new("4.2.0")
39
- yield("--jobserver-auth=#{job_server.rio.fileno},#{job_server.wio.fileno}", "-j")
42
+
43
+ jobserver_fds_arg = "#{job_server.rio.fileno},#{job_server.wio.fileno}"
44
+
45
+ if @gnumake_version[cmd_path] >= Gem::Version.new("4.2.0")
46
+ yield("--jobserver-auth=#{jobserver_fds_arg}", "-j")
40
47
  else
41
- yield("--jobserver-fds=#{job_server.rio.fileno},#{job_server.wio.fileno}", "-j")
48
+ yield("--jobserver-fds=#{jobserver_fds_arg}", "-j")
42
49
  end
43
50
  end
44
51
  yield("-j#{pkg.parallel_build_level}")
45
52
  else yield
46
53
  end
47
54
  ensure
48
- if reserved
49
- job_server.put(reserved)
50
- end
55
+ job_server.put(reserved) if reserved
51
56
  end
52
-
57
+
53
58
  def self.make_subcommand(pkg, phase, *options, &block)
54
59
  invoke_make_parallel(pkg, Autobuild.tool(:make)) do |*make_parallel_options|
55
- pkg.run(phase, Autobuild.tool(:make), *make_parallel_options, *options, &block)
60
+ pkg.run(phase, Autobuild.tool(:make),
61
+ *make_parallel_options, *options, &block)
56
62
  end
57
63
  end
58
64
  end
@@ -5,7 +5,7 @@ module Autobuild
5
5
  def self.import(spec, &proc)
6
6
  ImporterPackage.new(spec, &proc)
7
7
  end
8
-
8
+
9
9
  class ImporterPackage < Package
10
10
  attr_reader :exclude
11
11
 
@@ -19,9 +19,7 @@ def prepare
19
19
 
20
20
  exclude = self.exclude.dup
21
21
  exclude << Regexp.new("^#{Regexp.quote(installstamp)}")
22
- if doc_dir
23
- exclude << Regexp.new("^#{Regexp.quote(doc_dir)}")
24
- end
22
+ exclude << Regexp.new("^#{Regexp.quote(doc_dir)}") if doc_dir
25
23
 
26
24
  source_tree(srcdir) do |pkg|
27
25
  pkg.exclude.concat exclude
@@ -32,5 +30,3 @@ def prepare
32
30
  end
33
31
  end
34
32
  end
35
-
36
-
@@ -41,7 +41,7 @@ class << self
41
41
  # This is still considered experimental. Use
42
42
  # Orogen.always_regenerate= to set it
43
43
  def always_regenerate?
44
- !!@always_regenerate
44
+ @always_regenerate
45
45
  end
46
46
  end
47
47
 
@@ -63,14 +63,15 @@ def self.orocos_target
63
63
 
64
64
  class << self
65
65
  attr_accessor :default_type_export_policy
66
- # The list of enabled transports as an array of strings (default: typelib, corba)
66
+ # The list of enabled transports as an array of strings (default:
67
+ # typelib, corba)
67
68
  attr_reader :transports
68
69
 
69
70
  attr_reader :orogen_options
70
71
  end
71
72
  @orogen_options = []
72
73
  @default_type_export_policy = :used
73
- @transports = %w{corba typelib mqueue}
74
+ @transports = %w[corba typelib mqueue]
74
75
  @rtt_scripting = true
75
76
 
76
77
  attr_reader :orogen_options
@@ -121,12 +122,13 @@ def orogen_file
121
122
  if @orogen_file
122
123
  @orogen_file
123
124
  else
124
- return if !File.directory?(srcdir)
125
-
125
+ return unless File.directory?(srcdir)
126
+
126
127
  Dir.glob(File.join(srcdir, '*.orogen')) do |path|
127
128
  return File.basename(path)
128
129
  end
129
- raise ArgumentError, "cannot find an oroGen specification file in #{srcdir}"
130
+ raise ArgumentError,
131
+ "cannot find an oroGen specification file in #{srcdir}"
130
132
  end
131
133
  end
132
134
 
@@ -141,7 +143,7 @@ def initialize(*args, &config)
141
143
 
142
144
  def prepare_for_forced_build
143
145
  super
144
- FileUtils.rm_f genstamp
146
+ FileUtils.rm_f genstamp
145
147
  end
146
148
 
147
149
  def update_environment
@@ -158,9 +160,7 @@ def orogen_version
158
160
  if !@orogen_version && (root = orogen_root)
159
161
  version_file = File.join(root, 'lib', 'orogen', 'version.rb')
160
162
  version_line = File.readlines(version_file).grep(/VERSION\s*=\s*"/).first
161
- if version_line =~ /.*=\s+"(.+)"$/
162
- @orogen_version = $1
163
- end
163
+ @orogen_version = $1 if version_line =~ /.*=\s+"(.+)"$/
164
164
  end
165
165
  @orogen_version
166
166
  end
@@ -168,9 +168,7 @@ def orogen_version
168
168
  def orogen_root
169
169
  if orogen_tool_path
170
170
  root = File.expand_path(File.join('..', '..'), orogen_tool_path)
171
- if File.directory?(File.join(root, 'lib', 'orogen'))
172
- root
173
- end
171
+ root if File.directory?(File.join(root, 'lib', 'orogen'))
174
172
  end
175
173
  end
176
174
 
@@ -187,7 +185,9 @@ def prepare
187
185
  super
188
186
  end
189
187
 
190
- def genstamp; File.join(srcdir, '.orogen', 'orogen-stamp') end
188
+ def genstamp
189
+ File.join(srcdir, '.orogen', 'orogen-stamp')
190
+ end
191
191
 
192
192
  def add_cmd_to_cmdline(cmd, cmdline)
193
193
  if cmd =~ /^([\w-]+)$/
@@ -210,31 +210,30 @@ def regen
210
210
  cmdline << '--corba' if corba
211
211
 
212
212
  ext_states = extended_states
213
- if !ext_states.nil?
213
+ unless ext_states.nil?
214
214
  cmdline.delete_if { |str| str =~ /extended-states/ }
215
- if ext_states
216
- cmdline << '--extended-states'
217
- else
218
- cmdline << '--no-extended-states'
219
- end
215
+ cmdline <<
216
+ if ext_states
217
+ '--extended-states'
218
+ else
219
+ '--no-extended-states'
220
+ end
220
221
  end
221
222
 
222
- @orogen_tool_path = find_in_path 'orogen'
223
- if !orogen_tool_path
223
+ unless (@orogen_tool_path = find_in_path('orogen'))
224
224
  raise ArgumentError, "cannot find 'orogen' in #{resolved_env['PATH']}"
225
225
  end
226
226
 
227
- version = orogen_version
228
- if !version
227
+ unless (version = orogen_version)
229
228
  raise ArgumentError, "cannot determine the orogen version"
230
229
  end
231
230
 
232
- if (version >= "1.0")
231
+ if version >= "1.0" # rubocop:disable Style/IfUnlessModifier
233
232
  cmdline << "--parallel-build=#{parallel_build_level}"
234
233
  end
235
- if (version >= "1.1")
234
+ if version >= "1.1"
236
235
  cmdline << "--type-export-policy=#{Orogen.default_type_export_policy}"
237
- cmdline << "--transports=#{Orogen.transports.sort.uniq.join(",")}"
236
+ cmdline << "--transports=#{Orogen.transports.sort.uniq.join(',')}"
238
237
  end
239
238
 
240
239
  # Now, add raw options
@@ -269,9 +268,11 @@ def regen
269
268
  needs_regen ||= !generation_uptodate?
270
269
 
271
270
  if needs_regen
272
- progress_start "generating oroGen %s", :done_message => 'generated oroGen %s' do
271
+ progress_start "generating oroGen %s",
272
+ done_message: 'generated oroGen %s' do
273
273
  in_dir(srcdir) do
274
- run 'orogen', Autobuild.tool('ruby'), '-S', orogen_tool_path, *cmdline
274
+ run 'orogen', Autobuild.tool('ruby'), '-S',
275
+ orogen_tool_path, *cmdline
275
276
  File.open(genstamp, 'w') do |io|
276
277
  io.print cmdline.join("\n")
277
278
  end
@@ -287,11 +288,11 @@ def generation_uptodate?
287
288
  if !File.file?(genstamp)
288
289
  true
289
290
  elsif File.file?(File.join(builddir, 'Makefile'))
290
- system("#{Autobuild.tool('make')} -C #{builddir} check-uptodate > /dev/null 2>&1")
291
+ make = Autobuild.tool('make')
292
+ system("#{make} -C #{builddir} check-uptodate > /dev/null 2>&1")
291
293
  else
292
294
  true
293
295
  end
294
296
  end
295
297
  end
296
298
  end
297
-
@@ -16,9 +16,10 @@ def installstamp
16
16
  return std_stamp if File.file?(std_stamp)
17
17
 
18
18
  pcfile = File.join(pkgconfig.prefix, "lib", "pkgconfig", "#{name}.pc")
19
- if !File.file?(pcfile)
19
+ unless File.file?(pcfile)
20
20
  raise "cannot find the .pc file for #{name}, tried #{pcfile}"
21
21
  end
22
+
22
23
  pcfile
23
24
  end
24
25
  end
@@ -26,4 +27,3 @@ def self.installed_pkgconfig(name, &block)
26
27
  InstalledPkgConfig.new(name, &block)
27
28
  end
28
29
  end
29
-
@@ -56,13 +56,17 @@ def python_path
56
56
  raise "Unable to set PYTHONPATH: #{e.message}"
57
57
  end
58
58
 
59
- return output.read.chomp if ret.value.success?
60
- raise 'Unable to set PYTHONPATH: user site directory disabled?'
59
+ if ret.value.success?
60
+ output.read.chomp
61
+ else
62
+ raise 'Unable to set PYTHONPATH: user site directory disabled?'
63
+ end
61
64
  end
62
65
 
63
66
  # Do the build in builddir
64
67
  def build
65
68
  return unless @install_mode
69
+
66
70
  command = generate_build_command
67
71
  command << '--force' if @forced
68
72
  progress_start 'building %s [progress not available]',
@@ -75,6 +79,7 @@ def build
75
79
  # Install the result in prefix
76
80
  def install
77
81
  return unless @install_mode
82
+
78
83
  command = generate_install_command
79
84
  command << '--force' if @forced
80
85
  progress_start 'installing %s',
@@ -22,7 +22,7 @@ class Ruby < ImporterPackage
22
22
  def initialize(*args)
23
23
  self.rake_setup_task = "default"
24
24
  self.rake_doc_task = "redocs"
25
- self.rake_clean_task = "clean"
25
+ self.rake_clean_task = "clean"
26
26
  self.rake_test_task = "test"
27
27
  self.rake_test_options = []
28
28
 
@@ -36,19 +36,23 @@ def initialize(*args)
36
36
 
37
37
  def with_doc
38
38
  doc_task do
39
- progress_start "generating documentation for %s", :done_message => 'generated documentation for %s' do
39
+ progress_start "generating documentation for %s",
40
+ done_message: 'generated documentation for %s' do
40
41
  run 'doc',
41
- Autobuild.tool_in_path('ruby'), '-S', Autobuild.tool('rake'), rake_doc_task,
42
- :working_directory => srcdir
42
+ Autobuild.tool_in_path('ruby'), '-S',
43
+ Autobuild.tool('rake'), rake_doc_task,
44
+ working_directory: srcdir
43
45
  end
44
46
  end
45
47
  end
46
48
 
47
49
  def with_tests
48
50
  test_utility.task do
49
- progress_start "running tests for %s", :done_message => 'tests passed for %s' do
51
+ progress_start "running tests for %s",
52
+ done_message: 'tests passed for %s' do
50
53
  run 'test',
51
- Autobuild.tool_in_path('ruby'), '-S', Autobuild.tool('rake'), rake_test_task, *rake_test_options,
54
+ Autobuild.tool_in_path('ruby'), '-S',
55
+ Autobuild.tool('rake'), rake_test_task, *rake_test_options,
52
56
  working_directory: srcdir
53
57
  end
54
58
  end
@@ -57,13 +61,15 @@ def with_tests
57
61
  def invoke_rake(setup_task = rake_setup_task)
58
62
  if setup_task && File.file?(File.join(srcdir, 'Rakefile'))
59
63
  run 'post-install',
60
- Autobuild.tool_in_path('ruby'), '-S', Autobuild.tool('rake'), setup_task,
61
- :working_directory => srcdir
64
+ Autobuild.tool_in_path('ruby'), '-S',
65
+ Autobuild.tool('rake'), setup_task,
66
+ working_directory: srcdir
62
67
  end
63
68
  end
64
69
 
65
70
  def install
66
- progress_start "setting up Ruby package %s", :done_message => 'set up Ruby package %s' do
71
+ progress_start "setting up Ruby package %s",
72
+ done_message: 'set up Ruby package %s' do
67
73
  invoke_rake
68
74
  end
69
75
  super
@@ -71,10 +77,11 @@ def install
71
77
 
72
78
  def prepare_for_forced_build # :nodoc:
73
79
  super
74
- %w{ext tmp}.each do |extdir|
80
+ %w[ext tmp].each do |extdir|
75
81
  if File.directory?(extdir)
76
82
  Find.find(extdir) do |file|
77
83
  next if file !~ /\<Makefile\>|\<CMakeCache.txt\>$/
84
+
78
85
  FileUtils.rm_rf file
79
86
  end
80
87
  end
@@ -86,10 +93,11 @@ def prepare_for_rebuild # :nodoc:
86
93
  if rake_clean_task && File.file?(File.join(srcdir, 'Rakefile'))
87
94
  begin
88
95
  run 'clean',
89
- Autobuild.tool_in_path('ruby'), '-S', Autobuild.tool('rake'), rake_clean_task,
90
- :working_directory => srcdir
96
+ Autobuild.tool_in_path('ruby'), '-S',
97
+ Autobuild.tool('rake'), rake_clean_task,
98
+ working_directory: srcdir
91
99
  rescue Autobuild::SubcommandFailed => e
92
- warn "%s: cleaning failed. If this package does not need a clean target,"
100
+ warn "%s: clean failed. If this package does not need a clean target,"
93
101
  warn "%s: set pkg.rake_clean_task = nil in the package definition."
94
102
  warn "%s: see #{e.logfile} for more details"
95
103
  end
@@ -99,9 +107,7 @@ def prepare_for_rebuild # :nodoc:
99
107
  def update_environment
100
108
  env_add_prefix srcdir
101
109
  libdir = File.join(srcdir, 'lib')
102
- if File.directory?(libdir)
103
- env_add_path 'RUBYLIB', libdir
104
- end
110
+ env_add_path 'RUBYLIB', libdir if File.directory?(libdir)
105
111
  end
106
112
  end
107
113
 
@@ -109,4 +115,3 @@ def self.ruby(spec, &proc)
109
115
  Ruby.new(spec, &proc)
110
116
  end
111
117
  end
112
-
@@ -1,5 +1,3 @@
1
- require 'thread'
2
-
3
1
  module Autobuild
4
2
  # This is a rewrite of the Rake task invocation code to use parallelism
5
3
  #
@@ -23,9 +21,11 @@ def initialize(level)
23
21
  wio.fcntl(Fcntl::F_SETFD, 0)
24
22
  put(level)
25
23
  end
24
+
26
25
  def get(token_count = 1)
27
26
  @rio.read(token_count)
28
27
  end
28
+
29
29
  def put(token_count = 1)
30
30
  @wio.write(" " * token_count)
31
31
  end
@@ -36,7 +36,6 @@ def initialize(level = Autobuild.parallel_build_level)
36
36
  @available_workers = Array.new
37
37
  @finished_workers = Queue.new
38
38
  @workers = Array.new
39
-
40
39
  end
41
40
 
42
41
  def wait_for_worker_to_end(state)
@@ -46,9 +45,12 @@ def wait_for_worker_to_end(state)
46
45
  if error
47
46
  if available_workers.size != workers.size
48
47
  if finished_task.respond_to?(:package) && finished_task.package
49
- Autobuild.error "got an error processing #{finished_task.package.name}, waiting for pending jobs to end"
48
+ Autobuild.error "got an error processing "\
49
+ "#{finished_task.package.name}, "\
50
+ "waiting for pending jobs to end"
50
51
  else
51
- Autobuild.error "got an error doing parallel processing, waiting for pending jobs to end"
52
+ Autobuild.error "got an error doing parallel processing, "\
53
+ "waiting for pending jobs to end"
52
54
  end
53
55
  end
54
56
  begin
@@ -61,16 +63,14 @@ def wait_for_worker_to_end(state)
61
63
  state.process_finished_task(finished_task)
62
64
  end
63
65
 
64
- def discover_dependencies(all_tasks, reverse_dependencies, t)
65
- if t.already_invoked?
66
- return
67
- end
66
+ def discover_dependencies(all_tasks, reverse_dependencies, task)
67
+ return if task.already_invoked?
68
+ return if all_tasks.include?(task) # already discovered or being discovered
68
69
 
69
- return if all_tasks.include?(t) # already discovered or being discovered
70
- all_tasks << t
70
+ all_tasks << task
71
71
 
72
- t.prerequisite_tasks.each do |dep_t|
73
- reverse_dependencies[dep_t] << t
72
+ task.prerequisite_tasks.each do |dep_t|
73
+ reverse_dependencies[dep_t] << task
74
74
  discover_dependencies(all_tasks, reverse_dependencies, dep_t)
75
75
  end
76
76
  end
@@ -101,7 +101,7 @@ def push(task, base_priority = 1)
101
101
  end
102
102
 
103
103
  def find_task
104
- if task = queue.sort_by { |t, p| p }.first
104
+ if (task = queue.min_by { |_t, p| p })
105
105
  priorities[task.first] = task.last
106
106
  task.first
107
107
  end
@@ -146,7 +146,8 @@ def process_finished_task(task)
146
146
  end
147
147
 
148
148
  def trivial_task?(task)
149
- (task.kind_of?(Autobuild::SourceTreeTask) || task.kind_of?(Rake::FileTask)) && task.actions.empty?
149
+ (task.kind_of?(Autobuild::SourceTreeTask) ||
150
+ task.kind_of?(Rake::FileTask)) && task.actions.empty?
150
151
  end
151
152
  end
152
153
 
@@ -163,11 +164,9 @@ def invoke_parallel(required_tasks)
163
164
  # set of tasks that can be queued for execution.
164
165
  state = ProcessingState.new(reverse_dependencies)
165
166
  tasks.each do |t|
166
- if state.ready?(t)
167
- state.push(t)
168
- end
167
+ state.push(t) if state.ready?(t)
169
168
  end
170
-
169
+
171
170
  # Build a reverse dependency graph (i.e. a mapping from a task to
172
171
  # the tasks that depend on it)
173
172
 
@@ -175,9 +174,9 @@ def invoke_parallel(required_tasks)
175
174
  # topological sort since we would then have to scan all tasks each
176
175
  # time for tasks that have no currently running prerequisites
177
176
 
178
- while true
177
+ loop do
179
178
  pending_task = state.pop
180
- if !pending_task
179
+ unless pending_task
181
180
  # If we have pending workers, wait for one to be finished
182
181
  # until either they are all finished or the queue is not
183
182
  # empty anymore
@@ -186,9 +185,7 @@ def invoke_parallel(required_tasks)
186
185
  pending_task = state.pop
187
186
  end
188
187
 
189
- if !pending_task && available_workers.size == workers.size
190
- break
191
- end
188
+ break if !pending_task && available_workers.size == workers.size
192
189
  end
193
190
 
194
191
  if state.trivial_task?(pending_task)
@@ -204,9 +201,7 @@ def invoke_parallel(required_tasks)
204
201
  # Get a job server token
205
202
  job_server.get
206
203
 
207
- while !finished_workers.empty?
208
- wait_for_worker_to_end(state)
209
- end
204
+ wait_for_worker_to_end(state) until finished_workers.empty?
210
205
 
211
206
  # We do have a job server token, so we are allowed to allocate a
212
207
  # new worker if none are available
@@ -222,9 +217,9 @@ def invoke_parallel(required_tasks)
222
217
  end
223
218
 
224
219
  not_processed = tasks.find_all { |t| !t.already_invoked? }
225
- if !not_processed.empty?
220
+ unless not_processed.empty?
226
221
  cycle = resolve_cycle(tasks, not_processed, reverse_dependencies)
227
- raise "cycle in task graph: #{cycle.map(&:name).sort.join(", ")}"
222
+ raise "cycle in task graph: #{cycle.map(&:name).sort.join(', ')}"
228
223
  end
229
224
  end
230
225
 
@@ -232,7 +227,7 @@ def resolve_cycle(all_tasks, tasks, reverse_dependencies)
232
227
  cycle = tasks.dup
233
228
  chain = []
234
229
  next_task = tasks.first
235
- while true
230
+ loop do
236
231
  task = next_task
237
232
  chain << task
238
233
  tasks.delete(next_task)
@@ -244,10 +239,12 @@ def resolve_cycle(all_tasks, tasks, reverse_dependencies)
244
239
  true
245
240
  end
246
241
  end
247
- if !next_task
248
- Autobuild.fatal "parallel processing stopped prematurely, but no cycle is present in the remaining tasks"
249
- Autobuild.fatal "remaining tasks: #{cycle.map(&:name).join(", ")}"
250
- Autobuild.fatal "known dependencies at initialization time that could block the processing of the remaining tasks"
242
+ unless next_task
243
+ Autobuild.fatal "parallel processing stopped prematurely, "\
244
+ "but no cycle is present in the remaining tasks"
245
+ Autobuild.fatal "remaining tasks: #{cycle.map(&:name).join(', ')}"
246
+ Autobuild.fatal "known dependencies at initialization time that "\
247
+ "could block the processing of the remaining tasks"
251
248
  reverse_dependencies.each do |parent_task, parents|
252
249
  if cycle.include?(parent_task)
253
250
  parents.each do |p|
@@ -255,13 +252,14 @@ def resolve_cycle(all_tasks, tasks, reverse_dependencies)
255
252
  end
256
253
  end
257
254
  end
258
- Autobuild.fatal "known dependencies right now that could block the processing of the remaining tasks"
255
+ Autobuild.fatal "known dependencies right now that could block "\
256
+ "the processing of the remaining tasks"
259
257
  all_tasks.each do |p|
260
258
  (cycle & p.prerequisite_tasks).each do |t|
261
259
  Autobuild.fatal " #{p}: #{t}"
262
260
  end
263
261
  end
264
- raise "failed to resolve cycle in #{cycle.map(&:name).join(", ")}"
262
+ raise "failed to resolve cycle in #{cycle.map(&:name).join(', ')}"
265
263
  end
266
264
  end
267
265
  chain
@@ -301,7 +299,7 @@ def do_task(task)
301
299
  end
302
300
 
303
301
  def last_result
304
- return @last_finished_task, @last_error
302
+ [@last_finished_task, @last_error]
305
303
  end
306
304
 
307
305
  def queue(task)
@@ -321,5 +319,3 @@ class << self
321
319
  attr_accessor :parallel_task_manager
322
320
  end
323
321
  end
324
-
325
-