[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]