1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/tool/run-lcov.rb
mame 0919c05501 Support LCOV visualization for both C and Ruby code
`./configure --enable-gcov && make exam && make lcov` will create
`lcov-c-out/index.html` for coverage of C code of the interpreter.
`make exam COVERAGE=true && make lcov` will create
`lcov-rb-out/index.html` for coverage of Ruby stdlib code.
Using both `--enable-gcov` and `COVERAGE=true` will create
`lcov-out/index.html` for total coverage.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59794 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-09-09 13:09:21 +00:00

82 lines
2.3 KiB
Ruby

#!ruby
require "pathname"
require "open3"
def backup_gcda_files(gcda_files)
gcda_files = gcda_files.map do |gcda|
[gcda, gcda.sub_ext(".bak")]
end
begin
gcda_files.each do |before, after|
before.rename(after)
end
yield
ensure
gcda_files.each do |before, after|
after.rename(before)
end
end
end
$info_files = []
def run_lcov(dir, info)
$info_files << info
system("lcov", "-c", "-d", dir, "--rc", "lcov_branch_coverage=1", "-o", info)
end
def gen_rb_lcov(file)
res = Marshal.load(File.binread(file))
open("lcov-rb-all.info", "w") do |f|
f.puts "TN:" # no test name
base_dir = File.dirname(__dir__)
res.each do |path, cov|
next unless path.start_with?(base_dir)
next if path.start_with?(File.join(base_dir, "test"))
f.puts "SF:#{ path }"
total = covered = 0
cov.each_with_index do |count, lineno|
next unless count
f.puts "DA:#{ lineno + 1 },#{ count }"
total += 1
covered += 1 if count > 0
end
f.puts "LF:#{ total }"
f.puts "LH:#{ covered }"
f.puts "end_of_record"
end
end
end
gcda_files = Pathname.glob("**/*.gcda")
ext_gcda_files = gcda_files.select {|f| f.fnmatch("ext/*") }
rubyspec_temp_gcda_files = gcda_files.select {|f| f.fnmatch("rubyspec_temp/*") }
backup_gcda_files(rubyspec_temp_gcda_files) do
if ext_gcda_files != []
backup_gcda_files(ext_gcda_files) do
info = "lcov-root.info"
run_lcov(".", info)
end
end
ext_gcda_files.group_by {|f| f.descend.to_a[1] }.each do |key, files|
info = "lcov-#{ key.to_s.gsub(File::Separator, "-") }.info"
run_lcov(key.to_s, info)
end
end
if $info_files != []
system("lcov", *$info_files.flat_map {|f| ["-a", f] }, "-o", "lcov-c-all.info")
system("genhtml", "--ignore-errors", "source", "lcov-c-all.info", "-o", "lcov-c-out")
end
if File.readable?("test-coverage.dat")
gen_rb_lcov("test-coverage.dat")
system("genhtml", "--ignore-errors", "source", "lcov-rb-all.info", "-o", "lcov-rb-out")
end
if File.readable?("lcov-c-all.info") && File.readable?("lcov-rb-all.info")
system("lcov", "-a", "lcov-c-all.info", "-a", "lcov-rb-all.info", "-o", "lcov-all.info") || raise
system("genhtml", "--ignore-errors", "source", "lcov-all.info", "-o", "lcov-out")
end