ruby-changes:47678
From: mame <ko1@a...>
Date: Sat, 9 Sep 2017 22:09:27 +0900 (JST)
Subject: [ruby-changes:47678] mame:r59794 (trunk): Support LCOV visualization for both C and Ruby code
mame 2017-09-09 22:09:21 +0900 (Sat, 09 Sep 2017) New Revision: 59794 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=59794 Log: 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. Modified files: trunk/.gitignore trunk/Makefile.in trunk/tool/run-lcov.rb Index: tool/run-lcov.rb =================================================================== --- tool/run-lcov.rb (revision 59793) +++ tool/run-lcov.rb (revision 59794) @@ -24,18 +24,59 @@ def run_lcov(dir, info) https://github.com/ruby/ruby/blob/trunk/tool/run-lcov.rb#L24 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 - backup_gcda_files(ext_gcda_files) do - info = "lcov-root.info" - run_lcov(".", info) + 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 -system("lcov", *$info_files.flat_map {|f| ["-a", f] }, "-o", "lcov-c-all.info") +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 Index: .gitignore =================================================================== --- .gitignore (revision 59793) +++ .gitignore (revision 59794) @@ -82,6 +82,8 @@ lcov*.info https://github.com/ruby/ruby/blob/trunk/.gitignore#L82 /goruby /id.[ch] /largefile.h +/lcov-c-out +/lcov-rb-out /lcov-out /lex.c /libruby*.* Index: Makefile.in =================================================================== --- Makefile.in (revision 59793) +++ Makefile.in (revision 59794) @@ -500,7 +500,6 @@ gcov: https://github.com/ruby/ruby/blob/trunk/Makefile.in#L500 lcov: $(Q) $(BASERUBY) $(srcdir)/tool/run-lcov.rb - $(Q) genhtml --ignore-errors source lcov-c-all.info -o lcov-out update-doclie: $(Q) $(srcdir)/tool/git-refresh -C $(srcdir)/coverage $(Q1:0=-q) \ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/