autobuild 1.12.1 → 1.12.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c2ce3568c8ac2227a5496cedd32858be2b6b9771
4
- data.tar.gz: 5ab665b1155ffa2f15490eaeca333a4b82c82e14
3
+ metadata.gz: a6623e40c3f107c71c1f9637be0c944a3ffe2a2d
4
+ data.tar.gz: 7e3298cad9cb1215943573c57a0d70c29b36b676
5
5
  SHA512:
6
- metadata.gz: 186dda2d01191d23ca7ab44da613c71f1d772ac27192029691284748044c92d72c41dd5e7e741307f3f1dcb073c68d2975a5bf2f05cfb6d70a237b0920084e7e
7
- data.tar.gz: adbc3984308b9a06cd15851859944dd1a2f67ef625a56459f20b2876fcba4e480a9e9af82710e9ebe957fa4da2eb0449ad916de6f57649fefa772a0573ad464b
6
+ metadata.gz: 405285def822d6a26bc51bd7d336e76e20ba74d434dbb68c67b41b90d8cdbe13f2bbbd0512a81d3575a6f9283a2968d516d3f899eba2ef13dd74cd26a26d0211
7
+ data.tar.gz: 20b5ebff2c2df256013c51e30064509ff7c99da00034de90816307cc163ca7af65d1593501b74e102b4f24252f5dc760a61520cb01622d09e7e4c1805f87b7e2
data/.gitignore CHANGED
@@ -4,3 +4,5 @@ doc/
4
4
  vendor/
5
5
  .bundle
6
6
  coverage/
7
+
8
+ .yardoc/
@@ -1,11 +1,12 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - '2.0'
5
4
  - '2.1'
6
5
  - '2.2'
7
- - '2.3.1'
8
- - 'jruby-9.1.2.0'
6
+ - '2.3'
7
+ - '2.4'
8
+ - '2.5'
9
+ - 'jruby-9.1.15.0'
9
10
  matrix:
10
11
  allow_failures:
11
- - rvm: 'jruby-9.1.2.0'
12
+ - rvm: 'jruby-9.1.15.0'
data/Gemfile CHANGED
@@ -1,3 +1,12 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ group :vscode do
6
+ gem 'pry'
7
+ gem 'pry-byebug'
8
+ gem 'rubocop', '>= 0.6.0'
9
+ gem 'ruby-debug-ide', '>= 0.6.0'
10
+ gem 'debase', '>= 0.2.2.beta10'
11
+ gem 'solargraph'
12
+ end
data/Rakefile CHANGED
@@ -6,6 +6,11 @@ task 'gem' => 'build'
6
6
 
7
7
  Rake::TestTask.new(:test) do |t|
8
8
  t.libs << "lib" << Dir.pwd
9
- t.test_files = ['test/suite.rb']
9
+
10
+ test_files = Rake::FileList['test/**/test_*.rb']
11
+ if !File.executable?('/usr/bin/cvs')
12
+ test_files.exclude('test/import/test_cvs.rb')
13
+ end
14
+ t.test_files = test_files
10
15
  end
11
16
 
@@ -6,6 +6,7 @@ require 'autobuild/version'
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "autobuild"
8
8
  s.version = Autobuild::VERSION
9
+ s.required_ruby_version = '>= 2.1.0'
9
10
  s.authors = ["Sylvain Joyeux"]
10
11
  s.email = "sylvain.joyeux@m4x.org"
11
12
  s.summary = "Library to handle build systems and import mechanisms"
@@ -281,10 +281,10 @@ def init_from_env(name)
281
281
  def push(name, *values)
282
282
  if current = environment[name]
283
283
  current = current.dup
284
- env_set(name, *values)
285
- env_add(name, *current)
284
+ set(name, *values)
285
+ add(name, *current)
286
286
  else
287
- env_add(name, *values)
287
+ add(name, *values)
288
288
  end
289
289
  end
290
290
 
@@ -669,12 +669,28 @@ def add_prefix(newprefix, includes = nil)
669
669
  end
670
670
  end
671
671
 
672
+ def find_executable_in_path(file, path_var = 'PATH')
673
+ (value(path_var) || Array.new).each do |dir|
674
+ full = File.join(dir, file)
675
+ begin
676
+ stat = File.stat(full)
677
+ if stat.file? && stat.executable?
678
+ return full
679
+ end
680
+ rescue ::Exception
681
+ end
682
+ end
683
+ nil
684
+ end
685
+
672
686
  def find_in_path(file, path_var = 'PATH')
673
- path = (value(path_var) || Array.new).
674
- find { |dir| File.exist?(File.join(dir, file)) }
675
- if path
676
- return File.join(path, file)
687
+ (value(path_var) || Array.new).each do |dir|
688
+ full = File.join(dir, file)
689
+ if File.file?(full)
690
+ return full
691
+ end
677
692
  end
693
+ nil
678
694
  end
679
695
 
680
696
  def isolate
@@ -100,18 +100,14 @@ def to_s
100
100
  # launching process. More importantly, it means we already have a
101
101
  # proper explanation for it. Don't display the logfile at all.
102
102
  if status
103
- if File.file?(logfile)
104
- lines = File.readlines(logfile)
105
- logsize = Autobuild.displayed_error_line_count
106
- if logsize != Float::INFINITY && lines.size > logsize
107
- lines = lines[-logsize, logsize]
108
- end
109
- msg << "\n last #{lines.size} lines are:\n\n"
110
- lines.each do |l|
111
- msg << " #{l}"
112
- end
113
- else
114
- msg << "\n the log file does not seem to be present on disk anymore"
103
+ lines = @output
104
+ logsize = Autobuild.displayed_error_line_count
105
+ if logsize != Float::INFINITY && lines.size > logsize
106
+ lines = lines[-logsize, logsize]
107
+ end
108
+ msg << "\n last #{lines.size} lines are:\n\n"
109
+ lines.each do |l|
110
+ msg << " #{l}\n"
115
111
  end
116
112
  end
117
113
  msg
@@ -3,7 +3,7 @@
3
3
  Autobuild::Git.default_config['filter.lfs.required'] = 'false'
4
4
 
5
5
  module Autobuild
6
- Git.add_post_hook do |importer, package|
6
+ Git.add_post_hook(always: true) do |importer, package|
7
7
  lfs_dir = File.join(package.srcdir, '.git', 'lfs')
8
8
  if File.directory?(lfs_dir)
9
9
  importer.run_git(package, 'lfs', 'install', '--force', '--local', '--skip-smudge')
@@ -1130,7 +1130,7 @@ def self.vcs_definition_for(path, remote_name = 'autobuild')
1130
1130
  end
1131
1131
 
1132
1132
  Dir.chdir(path) do
1133
- vars = `git config -l`.
1133
+ vars = `#{Autobuild.tool(:git)} config -l`.
1134
1134
  split("\n").
1135
1135
  inject(Hash.new) do |h, line|
1136
1136
  k, v = line.strip.split('=', 2)
@@ -248,26 +248,35 @@ def update_retry_count(original_error, retry_count)
248
248
  # globally for all importers of a given type with {Importer.add_post_hook}
249
249
  attr_reader :post_hooks
250
250
 
251
+ Hook = Struct.new :always, :callback
252
+
251
253
  # Define a post-import hook for all instances of this class
252
254
  #
253
255
  # @yieldparam [Importer] importer the importer that finished
254
256
  # @yieldparam [Package] package the package we're acting on
255
257
  # @see Importer#add_post_hook
256
- def self.add_post_hook(&hook)
258
+ def self.add_post_hook(always: false, &hook)
257
259
  @post_hooks ||= Array.new
258
- @post_hooks << hook
260
+ @post_hooks << Hook.new(always, hook)
261
+ nil
259
262
  end
260
263
 
261
264
  # Enumerate the post-import hooks defined for all instances of this class
262
- def self.each_post_hook(&hook)
263
- (@post_hooks ||= Array.new).each(&hook)
265
+ def self.each_post_hook(error: false)
266
+ return enum_for(__method__) if !block_given?
267
+
268
+ (@post_hooks ||= Array.new).each do |hook|
269
+ if hook.always || !error
270
+ yield(hook.callback)
271
+ end
272
+ end
264
273
  end
265
274
 
266
275
  # @api private
267
276
  #
268
277
  # Call the post-import hooks added with {#add_post_hook}
269
- def execute_post_hooks(package)
270
- each_post_hook.each do |block|
278
+ def execute_post_hooks(package, error: false)
279
+ each_post_hook(error: error) do |block|
271
280
  block.call(self, package)
272
281
  end
273
282
  end
@@ -278,16 +287,20 @@ def execute_post_hooks(package)
278
287
  # @yieldparam [Importer] importer the importer that finished
279
288
  # @yieldparam [Package] package the package we're acting on
280
289
  # @see Importer.add_post_hook
281
- def add_post_hook(&hook)
282
- post_hooks << hook
290
+ def add_post_hook(always: false, &hook)
291
+ post_hooks << Hook.new(always, hook)
283
292
  end
284
293
 
285
294
  # Enumerate the post-import hooks for this importer
286
- def each_post_hook(&hook)
295
+ def each_post_hook(error: false, &hook)
287
296
  return enum_for(__method__) if !block_given?
288
297
 
289
- self.class.each_post_hook(&hook)
290
- post_hooks.each(&hook)
298
+ self.class.each_post_hook(error: error, &hook)
299
+ post_hooks.each do |hook|
300
+ if hook.always || !error
301
+ yield(hook.callback)
302
+ end
303
+ end
291
304
  end
292
305
 
293
306
  def perform_update(package,only_local=false)
@@ -301,8 +314,14 @@ def perform_update(package,only_local=false)
301
314
  retry_count = 0
302
315
  package.progress_start "updating %s"
303
316
  begin
304
- did_update = update(package,only_local)
305
- execute_post_hooks(package)
317
+ begin
318
+ did_update = update(package,only_local)
319
+ execute_post_hooks(package, error: false)
320
+ rescue ::Exception
321
+ execute_post_hooks(package, error: true)
322
+ raise
323
+ end
324
+
306
325
  message = if did_update == false
307
326
  Autobuild.color('already up-to-date', :green)
308
327
  else
@@ -168,9 +168,12 @@ def prepare
168
168
  # If it is not the case, remove it to force reconfiguration
169
169
  configureflags.flatten!
170
170
  if File.exist?(configurestamp)
171
- output = IO.popen("#{configurestamp} --version").readlines.grep(/with options/).first.chomp
172
- raise "invalid output of config.status --version" unless output =~ /with options "(.*)"$/
173
- options = Shellwords.shellwords($1)
171
+ output = run('prepare', configurestamp, '--version').
172
+ grep(/with options/).first.chomp
173
+ if !output
174
+ raise "invalid output of config.status --version, expected a line starting with `with options`"
175
+ end
176
+ options = Shellwords.shellwords(output.scan(/with options "(.*)"$/).join(" "))
174
177
 
175
178
  # Add the --prefix option to the configureflags array
176
179
  testflags = ["--prefix=#{prefix}"] + Array[*configureflags]
@@ -1,29 +1,32 @@
1
1
  module Autobuild
2
- def self.make_is_gnumake?(path = Autobuild.tool(:make))
2
+ def self.make_is_gnumake?(pkg, path = Autobuild.tool(:make))
3
3
  @make_is_gnumake ||= Hash.new
4
4
  if @make_is_gnumake.has_key?(path)
5
5
  @make_is_gnumake[path]
6
6
  else
7
- result = `#{path} --version`
8
- @make_is_gnumake[path] = $?.success? &&
9
- (result.split("\n").first =~ /GNU Make/)
7
+ begin
8
+ result = pkg.run('prepare', path, '--version')
9
+ @make_is_gnumake[path] = (result.first =~ /GNU Make/)
10
+ rescue Autobuild::SubcommandFailed
11
+ @make_is_gnumake[path] = false
12
+ end
10
13
  end
11
14
  end
12
15
 
13
- def self.make_has_j_option?(path = Autobuild.tool(:make))
14
- make_is_gnumake?(path)
16
+ def self.make_has_j_option?(pkg, path = Autobuild.tool(:make))
17
+ make_is_gnumake?(pkg, path)
15
18
  end
16
19
 
17
- def self.make_has_gnumake_jobserver?(path = Autobuild.tool(:make))
18
- make_is_gnumake?(path)
20
+ def self.make_has_gnumake_jobserver?(pkg, path = Autobuild.tool(:make))
21
+ make_is_gnumake?(pkg, path)
19
22
  end
20
23
 
21
24
  def self.invoke_make_parallel(pkg, cmd_path = Autobuild.tool(:make))
22
25
  reserved = nil
23
- if make_has_j_option?(cmd_path) && pkg.parallel_build_level != 1
26
+ if make_has_j_option?(pkg, cmd_path) && pkg.parallel_build_level != 1
24
27
  if manager = Autobuild.parallel_task_manager
25
28
  job_server = manager.job_server
26
- if !make_has_gnumake_jobserver?(cmd_path) || (pkg.parallel_build_level != Autobuild.parallel_build_level)
29
+ if !make_has_gnumake_jobserver?(pkg, cmd_path) || (pkg.parallel_build_level != Autobuild.parallel_build_level)
27
30
  reserved = pkg.parallel_build_level
28
31
  job_server.get(reserved - 1) # We already have one token taken by autobuild itself
29
32
  yield("-j#{pkg.parallel_build_level}")
@@ -172,7 +172,7 @@ def self.find_common_prefix(msg, other_msg)
172
172
  return prefix
173
173
  end
174
174
  end
175
- return msg
175
+ return msg.join(" ")
176
176
  end
177
177
 
178
178
  def self.format_progress_message(messages)
@@ -217,7 +217,7 @@ def self.format_progress_message(messages)
217
217
  grouped_messages << messages[index][(prefix.size)..-1]
218
218
  end
219
219
  if !grouped_messages.empty?
220
- result << "#{prefix}#{grouped_messages.join(", ")}"
220
+ result << "#{prefix}#{grouped_messages.uniq.join(", ")}"
221
221
  end
222
222
  end
223
223
  end
@@ -231,10 +231,13 @@ def self.run(target, phase, *command)
231
231
  command.reject! { |o| o.nil? || (o.respond_to?(:empty?) && o.empty?) }
232
232
  command.collect! { |o| o.to_s }
233
233
 
234
- target_name = if target.respond_to?(:name)
235
- target.name
236
- else target.to_str
237
- end
234
+ if target.respond_to?(:name)
235
+ target_name = target.name
236
+ target_type = target.class
237
+ else
238
+ target_name = target.to_str
239
+ target_type = nil
240
+ end
238
241
  logdir = if target.respond_to?(:logdir)
239
242
  target.logdir
240
243
  else Autobuild.logdir
@@ -324,24 +327,16 @@ def self.run(target, phase, *command)
324
327
  Process.setpriority(Process::PRIO_PROCESS, 0, Autobuild.nice)
325
328
  end
326
329
 
327
- if outwrite
328
- outread.close
329
- $stderr.reopen(outwrite.dup)
330
- $stdout.reopen(outwrite.dup)
331
- else
332
- $stderr.reopen(logfile.dup)
333
- $stdout.reopen(logfile.dup)
334
- end
330
+ outread.close
331
+ $stderr.reopen(outwrite.dup)
332
+ $stdout.reopen(outwrite.dup)
335
333
 
336
334
  if !input_streams.empty?
337
335
  pwrite.close
338
336
  $stdin.reopen(pread)
339
337
  end
340
338
 
341
- if RUBY_VERSION >= "1.9"
342
- command << Hash[:close_others => false]
343
- end
344
- exec(env, *command)
339
+ exec(env, *command, close_others: false)
345
340
  rescue Errno::ENOENT
346
341
  cwrite.write([CONTROL_COMMAND_NOT_FOUND].pack('I'))
347
342
  exit(100)
@@ -385,6 +380,11 @@ def self.run(target, phase, *command)
385
380
  end
386
381
  end
387
382
 
383
+ transparent_prefix = "#{target_name}:#{phase}: "
384
+ if target_type
385
+ transparent_prefix = "#{target_type}:#{transparent_prefix}"
386
+ end
387
+
388
388
  # If the caller asked for process output, provide it to him
389
389
  # line-by-line.
390
390
  outwrite.close
@@ -396,7 +396,7 @@ def self.run(target, phase, *command)
396
396
  logfile.puts line
397
397
 
398
398
  if Autobuild.verbose || transparent_mode?
399
- STDOUT.puts "#{target_name}:#{phase}: #{line}"
399
+ STDOUT.puts "#{transparent_prefix}#{line}"
400
400
  elsif block_given?
401
401
  # Do not yield
402
402
  # would mix the progress output with the actual command
@@ -408,6 +408,7 @@ def self.run(target, phase, *command)
408
408
  outread.close
409
409
 
410
410
  _, childstatus = Process.wait2(pid)
411
+ logfile.puts "Exit: #{childstatus}"
411
412
  childstatus
412
413
  end
413
414
 
@@ -38,19 +38,13 @@ def tool_in_path(name, env: self.env)
38
38
  # This is already a full path
39
39
  path = current
40
40
  else
41
- path = find_in_path(current)
41
+ path = env.find_executable_in_path(current)
42
42
  end
43
43
 
44
44
  if !path
45
- raise ArgumentError, "tool #{name}, set to #{current}, can not be found in PATH=#{path_env}"
45
+ raise ArgumentError, "tool #{name}, set to #{current}, can not be found in PATH=#{env_PATH}"
46
46
  end
47
47
 
48
- # Verify that the new value is a file and is executable
49
- if !File.file?(path)
50
- raise ArgumentError, "tool #{name} is set to #{current}, but this resolves to #{path} which is not a file"
51
- elsif !File.executable?(path)
52
- raise ArgumentError, "tool #{name} is set to #{current}, but this resolves to #{path} which is not executable"
53
- end
54
48
  programs_in_path[name] = [path, current, env_PATH]
55
49
  end
56
50
 
@@ -1,3 +1,3 @@
1
1
  module Autobuild
2
- VERSION = "1.12.1" unless defined? Autobuild::VERSION
2
+ VERSION = "1.12.3" unless defined? Autobuild::VERSION
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autobuild
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.1
4
+ version: 1.12.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-04 00:00:00.000000000 Z
11
+ date: 2018-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake