Hello community, here is the log from the commit of package lcov for openSUSE:Factory checked in at 2015-01-30 17:46:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lcov (Old) and /work/SRC/openSUSE:Factory/.lcov.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lcov" Changes: -------- --- /work/SRC/openSUSE:Factory/lcov/lcov.changes 2013-01-17 09:44:00.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.lcov.new/lcov.changes 2015-01-30 17:47:16.000000000 +0100 @@ -1,0 +2,11 @@ +Sun Jun 1 14:07:41 UTC 2014 - vmik...@collabora.co.uk + +- Update to version 1.11: + + Improved support for GCC 4.7 + + Improved performance for specific functions + + Compatibility support for LLVM's gcov + + Multiple bug fixes and documentation improvements +- Adapt lcov-1.10-except-unreach.patch to upstream changes + > lcov-1.11-except-unreach.patch + +------------------------------------------------------------------- Old: ---- lcov-1.10-except-unreach.patch lcov-1.10.tar.bz2 New: ---- lcov-1.11-except-unreach.patch lcov-1.11.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lcov.spec ++++++ --- /var/tmp/diff_new_pack.PWtgrV/_old 2015-01-30 17:47:19.000000000 +0100 +++ /var/tmp/diff_new_pack.PWtgrV/_new 2015-01-30 17:47:19.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package lcov # -# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -23,7 +23,7 @@ Summary: A Graphical GCOV Front-end License: GPL-2.0+ Group: Development/Tools/Other -Version: 1.10 +Version: 1.11 Release: 0 Source: %{name}-%{version}.tar.bz2 Patch0: %{name}-%{version}-except-unreach.patch ++++++ lcov-1.10-except-unreach.patch -> lcov-1.11-except-unreach.patch ++++++ --- /work/SRC/openSUSE:Factory/lcov/lcov-1.10-except-unreach.patch 2013-01-17 09:44:00.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.lcov.new/lcov-1.11-except-unreach.patch 2015-01-30 17:47:11.000000000 +0100 @@ -1,14 +1,13 @@ Fixes: geninfo: Argument "=====" isn't numeric in numeric gt (>) at /usr/bin/geninfo line 1126. ---- lcov.orig/bin/geninfo 2012-03-12 04:26:08.000000000 -0700 -+++ lcov/bin/geninfo 2012-06-06 16:54:15.231499893 -0700 -@@ -1637,7 +1637,8 @@ - push(@result, 0); - } else { - # Check for zero count -- if ($count eq "#####") { -+ if ($count eq "#####" -+ or $count eq "=====") { - $count = 0; - } - push(@result, 1); +--- lcov-1.11.orig/bin/geninfo 2014-05-23 11:03:45.000000000 +0200 ++++ lcov-1.11/bin/geninfo 2014-06-01 15:51:23.334218890 +0200 +@@ -1760,7 +1760,7 @@ + + # Check for zero count which is indicated + # by ###### +- if ($number eq "######") { $number = 0; } ++ if ($number eq "######" or $number eq "=====") { $number = 0; } + + if ($exclude_line) { + # Register uninstrumented line instead ++++++ lcov-1.10.tar.bz2 -> lcov-1.11.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/CHANGES new/lcov-1.11/CHANGES --- old/lcov-1.10/CHANGES 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/CHANGES 2014-05-23 11:03:45.000000000 +0200 @@ -1,3 +1,63 @@ +Version 1.11 +============ + +genhtml: +- Added current time to date information in HTML output. Based on patch by + sylves...@debian.org +- Improved --demanglecpp performance. Based on suggestion by o...@survex.com +- Improved memory usage when combining files. Based on patch by o...@survex.com +- Changed initial function table sorting order to execution counts. Based on + suggestion by paul.bign...@hotmail.fr +- Fixed incorrect function execution counts when using --demanglecpp on + functions that demange to the same name +- Fixed handling of prefix with trailing /. Reported by ahmed_os...@mentor.com +- Fixed "use of uninitialized value" warning when processing incorrect + test description files. Reported by lbalba...@gmail.com +- Fixed reordering of unnamed branch blocks during coverage data merging. + Contributed by jh...@cmu.edu + +geninfo: +- Added exclusion markers for branch coverage. Contributed by s_stig...@gmx.de +- Added toleration support for .gcno files with trailing garbage. Reported by + christophe.guil...@st.com +- Fixed parsing of gcc 4.7 gcov format. Reported by fa.s...@gmx.net +- Fixed geninfo aborting on empty data directories. Based on suggestion by + rich_dr...@yahoo.com +- Fixed "no data found" warning when using lcov with gcc 4.7 +- Fixed --no-external not working with --initial. Reported by + malcolm.pars...@gmail.com +- Fixed handling of non-english locales. Reported by s_stig...@gmx.de +- Fixed gcov tool version detection for gcov versions containing additional + versions in parenthesis. + +lcov: +- Added compatibility support with LLVM's gcov (NOT llvm-cov). Contributed by + jo...@petri.us +- Improved memory usage when combining files. Contributed by o...@survex.com +- Fixed lcov aborting when using --diff on a patch file that changes the list + of functions. Reported by nasir.amanul...@us.fujitsu.com +- Fixed whitespace handling in --rc options +- Fixed --config-file not being passed to geninfo. Reported by + liuyhli...@gmail.com +- Fixed missing description for command line parameter value in man page. + Reported by sylves...@mozilla.com +- Fixed reordering of unnamed branch blocks during coverage data merging. + Contributed by jh...@cmu.edu + +lcov.spec: +- Fixed Perl dependency statement + +lcovrc: +- Added config file setting 'genhtml_desc_html' to allow using HTML markup in + test case description text + +CONTRIBUTING: +- Added contribution guidelines + +README: +- Improved note on lcov usage + + Version 1.10 ============ @@ -149,7 +209,7 @@ - Fixed errors when processing incomplete function names in .bb files - Fixed filename prefix detection - Fixed problem with matching filename -- Fixed problem when LANG is set to non-english locale. Reported by +- Fixed problem when LANG is set to non-English locale. Reported by benoit_belbe...@yahoo.fr. - Fixed short-name option ambiguities diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/CONTRIBUTING new/lcov-1.11/CONTRIBUTING --- old/lcov-1.10/CONTRIBUTING 1970-01-01 01:00:00.000000000 +0100 +++ new/lcov-1.11/CONTRIBUTING 2014-05-23 11:03:45.000000000 +0200 @@ -0,0 +1,96 @@ +Contributing to LCOV +==================== + +Please read this document if you would like to help improving the LTP GCOV +extension (LCOV). In general, all types of contributions are welcome, for +example: + + * Fixes for code or documentation + * Performance and compatibility improvements + * Functional enhancements + +There are some rules that these contributions must follow to be acceptable for +inclusion: + + 1. The contribution must align with the project goals of LCOV. + 2. The contribution must follow a particular format. + 3. The contribution must be signed. + +Once you have made sure that your contribution follows these rules, send it via +e-mail to the LTP coverage mailing list [1]. + + +Signing your work +================= + +All contributions to LCOV must be signed by putting the following line at the +end of the explanation of a patch: + + Signed-off-by: Your Name <your.em...@example.org> + +By signing a patch, you certify the following: + + By making a contribution to the LTP GCOV extension (LCOV) on + http://ltp.sourceforge.net, I certify that: + + a) The contribution was created by me and I have the right to submit it + under the terms and conditions of the open source license + "GNU General Public License, version 2 or later". + (http://www.gnu.org/licenses/old-licenses/gpl-2.0.html). + + b) The contribution is made free of any other party's intellectual property + claims or rights. + + c) I understand and agree that this project and the contribution are public + and that a record of the contribution (including all personal information + I submit with it, including my sign-off) is maintained indefinitely and + may be redistributed consistent with this project or the open source + license(s) involved. + + +Project goals +============= + +The goal of LCOV is to provide a set of command line tools that can be used to +collect, process and visualize code coverage data as produced by the gcov tool +that is part of the GNU Compiler Collection (GCC) [2]. + +If you have an idea for a contribution but are unsure if it aligns with the +project goals, feel free to discuss the idea on the LTP coverage mailing +list [1]. + + +Contribution format +=================== + +To contribute a change, please create a patch using the diff utility with the +following command line options: + + diff -Naurp + +Please base your changes on the most current version of LCOV. You can use the +following command line to obtain this version from the "utils" module of the +LTP CVS repository (when asked for a password, simply press return): + + cvs -d:pserver:anonym...@ltp.cvs.sourceforge.net:/cvsroot/ltp login + cvs -z3 -d:pserver:anonym...@ltp.cvs.sourceforge.net:/cvsroot/ltp co -P utils + +You can find LCOV in sub-directory "utils/analysis/lcov". + +Add a meaningful description of the contribution to the top of the patch. The +description should follow this format: + + component: short description + + detailed description + + Signed-off-by: Your Name <your.em...@example.org> + +With your Signed-off-by, you certify the rules stated in section +"Signing your work". + + +-- + +[1] ltp-cover...@lists.sourceforge.net +[2] http://gcc.gnu.org diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/Makefile new/lcov-1.11/Makefile --- old/lcov-1.10/Makefile 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/Makefile 2014-05-23 11:03:45.000000000 +0200 @@ -11,7 +11,7 @@ # - clean: remove all generated files # -VERSION := 1.10 +VERSION := 1.11 RELEASE := 1 CFG_DIR := $(PREFIX)/etc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/README new/lcov-1.11/README --- old/lcov-1.10/README 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/README 2014-05-23 11:03:45.000000000 +0200 @@ -1,6 +1,6 @@ ------------------------------------------------- - README file for the LTP GCOV extension (LCOV) - -- Last changes: 2012-10-10 - +- Last changes: 2014-05-23 - ------------------------------------------------- Description @@ -109,11 +109,14 @@ lcov --directory appdir --zerocounters - b) Capturing the current coverage state to a file (works only after the - application has been started and stopped at least once) + b) Capturing the current coverage state to a file lcov --directory appdir --capture --output-file app.info + Note that this step only works after the application has + been started and stopped at least once. Otherwise lcov will + abort with an error mentioning that there are no data/.gcda files. + c) Getting HTML output genhtml app.info diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/bin/gendesc new/lcov-1.11/bin/gendesc --- old/lcov-1.10/bin/gendesc 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/bin/gendesc 2014-05-23 11:03:45.000000000 +0200 @@ -41,7 +41,7 @@ # Constants -our $lcov_version = 'LCOV version 1.10'; +our $lcov_version = 'LCOV version 1.11'; our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; our $tool_name = basename($0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/bin/genhtml new/lcov-1.11/bin/genhtml --- old/lcov-1.10/bin/genhtml 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/bin/genhtml 2014-05-23 11:03:45.000000000 +0200 @@ -65,14 +65,15 @@ # use strict; -use File::Basename; +use File::Basename; +use File::Temp qw(tempfile); use Getopt::Long; use Digest::MD5 qw(md5_base64); # Global constants our $title = "LCOV - code coverage report"; -our $lcov_version = 'LCOV version 1.10'; +our $lcov_version = 'LCOV version 1.11'; our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; our $tool_name = basename($0); @@ -145,6 +146,7 @@ our $BR_TAKEN = 2; our $BR_VEC_ENTRIES = 3; our $BR_VEC_WIDTH = 32; +our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); # Additional offsets used when converting branch coverage data to HTML our $BR_LEN = 3; @@ -299,6 +301,7 @@ our @rate_png = ("ruby.png", "amber.png", "emerald.png"); our $lcov_func_coverage = 1; our $lcov_branch_coverage = 0; +our $rc_desc_html = 0; # lcovrc: genhtml_desc_html our $cwd = `pwd`; # Current working directory chomp($cwd); @@ -369,6 +372,7 @@ "genhtml_branch_field_width" => \$br_field_width, "genhtml_sort" => \$sort, "genhtml_charset" => \$charset, + "genhtml_desc_html" => \$rc_desc_html, "lcov_function_coverage" => \$lcov_func_coverage, "lcov_branch_coverage" => \$lcov_branch_coverage, }); @@ -672,6 +676,170 @@ if ($br_do); } +sub get_fn_list($) +{ + my ($info) = @_; + my %fns; + my @result; + + foreach my $filename (keys(%{$info})) { + my $data = $info->{$filename}; + my $funcdata = $data->{"func"}; + my $sumfnccount = $data->{"sumfnc"}; + + if (defined($funcdata)) { + foreach my $func_name (keys(%{$funcdata})) { + $fns{$func_name} = 1; + } + } + + if (defined($sumfnccount)) { + foreach my $func_name (keys(%{$sumfnccount})) { + $fns{$func_name} = 1; + } + } + } + + @result = keys(%fns); + + return \@result; +} + +# +# rename_functions(info, conv) +# +# Rename all function names in INFO according to CONV: OLD_NAME -> NEW_NAME. +# In case two functions demangle to the same name, assume that they are +# different object code implementations for the same source function. +# + +sub rename_functions($$) +{ + my ($info, $conv) = @_; + + foreach my $filename (keys(%{$info})) { + my $data = $info->{$filename}; + my $funcdata; + my $testfncdata; + my $sumfnccount; + my %newfuncdata; + my %newsumfnccount; + my $f_found; + my $f_hit; + + # funcdata: function name -> line number + $funcdata = $data->{"func"}; + foreach my $fn (keys(%{$funcdata})) { + my $cn = $conv->{$fn}; + + # Abort if two functions on different lines map to the + # same demangled name. + if (defined($newfuncdata{$cn}) && + $newfuncdata{$cn} != $funcdata->{$fn}) { + die("ERROR: Demangled function name $fn ". + " maps to different lines (". + $newfuncdata{$cn}." vs ". + $funcdata->{$fn}.")\n"); + } + $newfuncdata{$cn} = $funcdata->{$fn}; + } + $data->{"func"} = \%newfuncdata; + + # testfncdata: test name -> testfnccount + # testfnccount: function name -> execution count + $testfncdata = $data->{"testfnc"}; + foreach my $tn (keys(%{$testfncdata})) { + my $testfnccount = $testfncdata->{$tn}; + my %newtestfnccount; + + foreach my $fn (keys(%{$testfnccount})) { + my $cn = $conv->{$fn}; + + # Add counts for different functions that map + # to the same name. + $newtestfnccount{$cn} += + $testfnccount->{$fn}; + } + $testfncdata->{$tn} = \%newtestfnccount; + } + + # sumfnccount: function name -> execution count + $sumfnccount = $data->{"sumfnc"}; + foreach my $fn (keys(%{$sumfnccount})) { + my $cn = $conv->{$fn}; + + # Add counts for different functions that map + # to the same name. + $newsumfnccount{$cn} += $sumfnccount->{$fn}; + } + $data->{"sumfnc"} = \%newsumfnccount; + + # Update function found and hit counts since they may have + # changed + $f_found = 0; + $f_hit = 0; + foreach my $fn (keys(%newsumfnccount)) { + $f_found++; + $f_hit++ if ($newsumfnccount{$fn} > 0); + } + $data->{"f_found"} = $f_found; + $data->{"f_hit"} = $f_hit; + } +} + +# +# demangle_cpp(INFO) +# +# Demangle all function names found in INFO. +# +sub demangle_cpp($) +{ + my ($info) = @_; + my $fn_list = get_fn_list($info); + my @fn_list_demangled; + my $tmpfile; + my $handle; + my %demangled; + my $changed; + + # Nothing to do + return if (!@$fn_list); + + # Write list to temp file + (undef, $tmpfile) = tempfile(); + die("ERROR: could not create temporary file") if (!defined($tmpfile)); + open($handle, ">", $tmpfile) or + die("ERROR: could not write to $tmpfile: $!\n"); + print($handle join("\n", @$fn_list)); + close($handle); + + # Run c++ filt on tempfile file and parse output, creating a hash + open($handle, "-|", "c++filt < $tmpfile") or + die("ERROR: could not run c++filt: $!\n"); + @fn_list_demangled = <$handle>; + close($handle); + unlink($tmpfile) or + warn("WARNING: could not remove temporary file $tmpfile: $!\n"); + + if (scalar(@fn_list_demangled) != scalar(@$fn_list)) { + die("ERROR: c++filt output not as expected (". + scalar(@fn_list_demangled)." vs ". + scalar(@$fn_list).") lines\n"); + } + + # Build old_name -> new_name + $changed = 0; + for (my $i = 0; $i < scalar(@$fn_list); $i++) { + chomp($fn_list_demangled[$i]); + $demangled{$fn_list->[$i]} = $fn_list_demangled[$i]; + $changed++ if ($fn_list->[$i] ne $fn_list_demangled[$i]); + } + + info("Demangling $changed function names\n"); + + # Change all occurrences of function names in INFO + rename_functions($info, \%demangled); +} # # gen_html() @@ -730,6 +898,9 @@ %info_data = %{apply_baseline(\%info_data, \%base_data)}; } + # Demangle C++ function names if requested + demangle_cpp(\%info_data) if ($demangle_cpp); + @dir_list = get_dir_list(keys(%info_data)); if ($no_prefix) @@ -756,6 +927,7 @@ { info("Using user-specified filename prefix \"". "$dir_prefix\"\n"); + $dir_prefix =~ s/\/+$//; } # Read in test description file if specified @@ -1239,6 +1411,10 @@ # "func" -> \%funcdata # "found" -> $lines_found (number of instrumented lines found in file) # "hit" -> $lines_hit (number of executed lines in file) +# "f_found" -> $fn_found (number of instrumented functions found in file) +# "f_hit" -> $fn_hit (number of executed functions in file) +# "b_found" -> $br_found (number of instrumented branches found in file) +# "b_hit" -> $br_hit (number of executed branches in file) # "check" -> \%checkdata # "testfnc" -> \%testfncdata # "sumfnc" -> \%sumfnccount @@ -1662,8 +1838,8 @@ sub add_counts($$) { - my %data1 = %{$_[0]}; # Hash 1 - my %data2 = %{$_[1]}; # Hash 2 + my $data1_ref = $_[0]; # Hash 1 + my $data2_ref = $_[1]; # Hash 2 my %result; # Resulting hash my $line; # Current line iteration scalar my $data1_count; # Count of line in hash1 @@ -1671,10 +1847,10 @@ my $found = 0; # Total number of lines found my $hit = 0; # Number of lines with a count > 0 - foreach $line (keys(%data1)) + foreach $line (keys(%$data1_ref)) { - $data1_count = $data1{$line}; - $data2_count = $data2{$line}; + $data1_count = $data1_ref->{$line}; + $data2_count = $data2_ref->{$line}; # Add counts if present in both hashes if (defined($data2_count)) { $data1_count += $data2_count; } @@ -1686,14 +1862,14 @@ if ($data1_count > 0) { $hit++; } } - # Add lines unique to data2 - foreach $line (keys(%data2)) + # Add lines unique to data2_ref + foreach $line (keys(%$data2_ref)) { - # Skip lines already in data1 - if (defined($data1{$line})) { next; } + # Skip lines already in data1_ref + if (defined($data1_ref->{$line})) { next; } - # Copy count from data2 - $result{$line} = $data2{$line}; + # Copy count from data2_ref + $result{$line} = $data2_ref->{$line}; $found++; if ($result{$line} > 0) { $hit++; } @@ -2348,6 +2524,9 @@ # Match lines beginning with TD:<whitespace(s)> if (/^TD:\s+(.*?)\s*$/) { + if (!defined($test_name)) { + die("ERROR: Found test description without prior test name in $_[0]:$.\n"); + } # Check for empty line if ($1) { @@ -2415,10 +2594,15 @@ my $year; my $month; my $day; + my $hour; + my $min; + my $sec; - ($year, $month, $day) = (localtime())[5, 4, 3]; + ($year, $month, $day, $hour, $min, $sec) = + (localtime())[5, 4, 3, 2, 1, 0]; - return sprintf("%d-%02d-%02d", $year+1900, $month+1, $day); + return sprintf("%d-%02d-%02d %02d:%02d:%02d", $year+1900, $month+1, + $day, $hour, $min, $sec); } @@ -2475,8 +2659,10 @@ foreach $test_name (sort(keys(%description))) { - write_test_table_entry(*HTML_HANDLE, $test_name, - escape_html($description{$test_name})); + my $desc = $description{$test_name}; + + $desc = escape_html($desc) if (!$rc_desc_html); + write_test_table_entry(*HTML_HANDLE, $test_name, $desc); } write_test_table_epilog(*HTML_HANDLE); @@ -4273,7 +4459,11 @@ if ($func_coverage) { $view .= "<span style=\"font-size: 80%;\">"; if ($type == $HDR_SOURCE) { - $view .= " (source / <a href=\"$base_name.func.$html_ext\">functions</a>)"; + if ($sort) { + $view .= " (source / <a href=\"$base_name.func-sort-c.$html_ext\">functions</a>)"; + } else { + $view .= " (source / <a href=\"$base_name.func.$html_ext\">functions</a>)"; + } } elsif ($type == $HDR_FUNC) { $view .= " (<a href=\"$base_name.gcov.$html_ext\">source</a> / functions)"; } @@ -4852,6 +5042,7 @@ # Retrieve data from vector $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); + $block = -1 if ($block == $BR_VEC_MAX); $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); @@ -4877,10 +5068,12 @@ my $i; $vec = "" if (!defined($vec)); + $block = $BR_VEC_MAX if $block < 0; # Check if branch already exists in vector for ($i = 0; $i < $num; $i++) { my ($v_block, $v_branch, $v_taken) = br_ivec_get($vec, $i); + $v_block = $BR_VEC_MAX if $v_block < 0; next if ($v_block != $block || $v_branch != $branch); @@ -5136,8 +5329,10 @@ if ($type == 0) { return sort(keys(%{$funcdata})); } - return sort({$sumfncdata->{$b} <=> $sumfncdata->{$a}} - keys(%{$sumfncdata})); + return sort({ + $sumfncdata->{$b} == $sumfncdata->{$a} ? + $a cmp $b : $sumfncdata->{$a} <=> $sumfncdata->{$b} + } keys(%{$sumfncdata})); } # @@ -5194,12 +5389,7 @@ my $count = $sumfncdata->{$name}; my $countstyle; - # Demangle C++ function names if requested - if ($demangle_cpp) { - $name = `c++filt "$name"`; - chomp($name); - } - # Escape any remaining special characters + # Escape special characters $name = escape_html($name); if ($startline < 1) { $startline = 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/bin/geninfo new/lcov-1.11/bin/geninfo --- old/lcov-1.10/bin/geninfo 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/bin/geninfo 2014-05-23 11:03:45.000000000 +0200 @@ -61,7 +61,7 @@ } # Constants -our $lcov_version = 'LCOV version 1.10'; +our $lcov_version = 'LCOV version 1.11'; our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; our $gcov_tool = "gcov"; our $tool_name = basename($0); @@ -88,6 +88,11 @@ our $EXCL_STOP = "LCOV_EXCL_STOP"; our $EXCL_LINE = "LCOV_EXCL_LINE"; +# Marker to exclude branch coverage but keep function and line coveage +our $EXCL_BR_START = "LCOV_EXCL_BR_START"; +our $EXCL_BR_STOP = "LCOV_EXCL_BR_STOP"; +our $EXCL_BR_LINE = "LCOV_EXCL_BR_LINE"; + # Compatibility mode values our $COMPAT_VALUE_OFF = 0; our $COMPAT_VALUE_ON = 1; @@ -140,8 +145,9 @@ our $BR_TAKEN = 3; our $BR_VEC_ENTRIES = 4; our $BR_VEC_WIDTH = 32; +our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); -our $UNNAMED_BLOCK = 9999; +our $UNNAMED_BLOCK = -1; # Prototypes sub print_usage(*); @@ -266,8 +272,8 @@ # Prettify version string $lcov_version =~ s/\$\s*Revision\s*:?\s*(\S+)\s*\$/$1/; -# Set LANG so that gcov output will be in a unified format -$ENV{"LANG"} = "C"; +# Set LC_ALL so that gcov output will be in a unified format +$ENV{"LC_ALL"} = "C"; # Check command line for a configuration file name Getopt::Long::Configure("pass_through", "no_auto_abbrev"); @@ -275,6 +281,16 @@ "rc=s%" => \%opt_rc); Getopt::Long::Configure("default"); +# Remove spaces around rc options +while (my ($key, $value) = each(%opt_rc)) { + delete($opt_rc{$key}); + + $key =~ s/^\s+|\s+$//g; + $value =~ s/^\s+|\s+$//g; + + $opt_rc{$key} = $value; +} + # Read configuration file if available if (defined($opt_config_file)) { $config = read_config($opt_config_file); @@ -684,8 +700,11 @@ @file_list = `find "$directory" $maxdepth $follow -name \\*$ext -type f 2>/dev/null`; chomp(@file_list); - @file_list or - die("ERROR: no $ext files found in $directory!\n"); + if (!@file_list) { + warn("WARNING: no $ext files found in $directory - ". + "skipping!\n"); + return; + } $prefix = get_common_prefix(1, @file_list); info("Found %d %s files in %s\n", $#file_list+1, $type, $directory); @@ -861,7 +880,6 @@ my $source; # gcov source header information my $object; # gcov object header information my @matches; # List of absolute paths matching filename - my @unprocessed; # List of unprocessed source code files my $base_dir; # Base directory for current file my @tmp_links; # Temporary links to be cleaned up my @result; @@ -1057,7 +1075,6 @@ # Traverse the list of generated .gcov files and combine them into a # single .info file - @unprocessed = keys(%{$instr}); foreach $gcov_file (sort(@gcov_list)) { my $i; @@ -1140,16 +1157,6 @@ \@matches, \@gcov_content); } - # Remove processed file from list - for ($index = scalar(@unprocessed) - 1; $index >= 0; $index--) - { - if ($unprocessed[$index] eq $source_filename) - { - splice(@unprocessed, $index, 1); - last; - } - } - # Skip external files if requested if (!$opt_external) { if (is_external($source_filename)) { @@ -1246,6 +1253,7 @@ my ($line, $block, $branch, $taken) = br_gvec_get($gcov_branches, $i); + $block = $BR_VEC_MAX if ($block < 0); print(INFO_HANDLE "BRDA:$line,$block,$branch,$taken\n"); $br_found++; $br_hit++ if ($taken ne '-' && $taken > 0); @@ -1294,16 +1302,6 @@ unlink($gcov_file); } - # Check for files which show up in the graph file but were never - # processed - if (@unprocessed && @gcov_list) - { - foreach (@unprocessed) - { - warn("WARNING: no data found for $_\n"); - } - } - if (!($output_filename && ($output_filename eq "-"))) { close(INFO_HANDLE); @@ -1600,6 +1598,7 @@ # Retrieve data from vector $line = vec($vec, $offset + $BR_LINE, $BR_VEC_WIDTH); $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); + $block = -1 if ($block == $BR_VEC_MAX); $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); @@ -1627,6 +1626,7 @@ $vec = "" if (!defined($vec)); $offset = br_gvec_len($vec) * $BR_VEC_ENTRIES; + $block = $BR_VEC_MAX if $block < 0; # Encode taken value into an integer if ($taken eq "-") { @@ -1676,6 +1676,8 @@ my $number; my $exclude_flag = 0; my $exclude_line = 0; + my $exclude_br_flag = 0; + my $exclude_branch = 0; my $last_block = $UNNAMED_BLOCK; my $last_line = 0; local *INPUT; @@ -1702,11 +1704,13 @@ if (/^branch\s+(\d+)\s+taken\s+=\s+(\d+)/) { next if (!$br_coverage); next if ($exclude_line); + next if ($exclude_branch); $branches = br_gvec_push($branches, $last_line, $last_block, $1, $2); } elsif (/^branch\s+(\d+)\s+never\s+executed/) { next if (!$br_coverage); next if ($exclude_line); + next if ($exclude_branch); $branches = br_gvec_push($branches, $last_line, $last_block, $1, '-'); } @@ -1730,6 +1734,19 @@ $exclude_line = 0; } } + # Check for exclusion markers (branch exclude) + if (!$no_markers) { + if (/$EXCL_BR_STOP/) { + $exclude_br_flag = 0; + } elsif (/$EXCL_BR_START/) { + $exclude_br_flag = 1; + } + if (/$EXCL_BR_LINE/ || $exclude_br_flag) { + $exclude_branch = 1; + } else { + $exclude_branch = 0; + } + } # Source code execution data if (/^\t\t(.*)$/) { @@ -1775,11 +1792,13 @@ } elsif (/^branch\s+(\d+)\s+taken\s+(\d+)/) { next if (!$br_coverage); next if ($exclude_line); + next if ($exclude_branch); $branches = br_gvec_push($branches, $last_line, $last_block, $1, $2); } elsif (/^branch\s+(\d+)\s+never\s+executed/) { next if (!$br_coverage); next if ($exclude_line); + next if ($exclude_branch); $branches = br_gvec_push($branches, $last_line, $last_block, $1, '-'); } @@ -1814,6 +1833,20 @@ $exclude_line = 0; } } + # Check for exclusion markers (branch exclude) + if (!$no_markers) { + if (/$EXCL_BR_STOP/) { + $exclude_br_flag = 0; + } elsif (/$EXCL_BR_START/) { + $exclude_br_flag = 1; + } + if (/$EXCL_BR_LINE/ || $exclude_br_flag) { + $exclude_branch = 1; + } else { + $exclude_branch = 0; + } + } + # <exec count>:<line number>:<source code> if ($line eq "0") { @@ -1833,7 +1866,7 @@ push(@result, 0); } else { # Check for zero count - if ($count eq "#####") { + if ($count =~ /^[#=]/) { $count = 0; } push(@result, 1); @@ -1846,7 +1879,7 @@ } close(INPUT); - if ($exclude_flag) { + if ($exclude_flag || $exclude_br_flag) { warn("WARNING: unterminated exclusion section in $filename\n"); } return(\@result, $branches, \@functions); @@ -1865,11 +1898,21 @@ my $version_string; my $result; - open(GCOV_PIPE, "-|", "$gcov_tool -v") + open(GCOV_PIPE, "-|", "$gcov_tool --version") or die("ERROR: cannot retrieve gcov version!\n"); $version_string = <GCOV_PIPE>; + # LLVM gcov keeps version information on the second line. + # For example, gcov --version yields: + # LLVM (http://llvm.org/): + # LLVM version 3.4svn + $version_string = <GCOV_PIPE> if ($version_string =~ /LLVM/); close(GCOV_PIPE); + # Remove version information in parenthesis to cope with the following: + # - gcov (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) + # - gcov (crosstool-NG 1.18.0) 4.7.2 + $version_string =~ s/\([^\)]*\)//g; + $result = 0; if ($version_string =~ /(\d+)\.(\d+)(\.(\d+))?/) { @@ -1884,6 +1927,21 @@ $result = $1 << 16 | $2 << 8; } } + if ($version_string =~ /LLVM/) + { + # Map LLVM versions to the version of GCC gcov which + # they emulate + if ($result >= 0x030400) + { + info("Found LLVM gcov version 3.4, which emulates gcov version 4.2\n"); + $result = 0x040200; + } + else + { + warn("This version of LLVM's gcov is unknown. Assuming it emulates GCC gcov version 4.2.\n"); + $result = 0x040200; + } + } return ($result, $version_string); } @@ -2285,6 +2343,15 @@ my $line; my $linedata; + # Skip external files if requested + if (!$opt_external) { + if (is_external($filename)) { + info(" ignoring data for external file ". + "$filename\n"); + next; + } + } + print(INFO_HANDLE "SF:$filename\n"); if (defined($funcdata) && $func_coverage) { @@ -3341,9 +3408,11 @@ my $fileorder = {}; my $instr; my $graph; + my $filelength; local *HANDLE; open(HANDLE, "<", $gcno_filename) or goto open_error; + $filelength = (stat(HANDLE))[7]; binmode(HANDLE); # Read magic $word = read_gcno_word(*HANDLE, "file magic"); @@ -3375,6 +3444,14 @@ $next_pos = tell(HANDLE); goto tell_error if ($next_pos == -1); $next_pos += $length; + # Catch garbage at the end of a gcno file + if ($next_pos > $filelength) { + debug("Overlong record: file_length=$filelength ". + "rec_length=$length\n"); + warn("WARNING: $gcno_filename: Overlong record at end ". + "of file!\n"); + last; + } # Process record if ($tag == $tag_function) { ($filename, $function) = read_gcno_function_record( @@ -3443,15 +3520,36 @@ { my $help = `$gcov_tool --help`; my %capabilities; + my %short_option_translations = ( + 'a' => 'all-blocks', + 'b' => 'branch-probabilities', + 'c' => 'branch-counts', + 'f' => 'function-summaries', + 'h' => 'help', + 'l' => 'long-file-names', + 'n' => 'no-output', + 'o' => 'object-directory', + 'p' => 'preserve-paths', + 'u' => 'unconditional-branches', + 'v' => 'version', + ); foreach (split(/\n/, $help)) { - next if (!/--(\S+)/); - next if ($1 eq 'help'); - next if ($1 eq 'version'); - next if ($1 eq 'object-directory'); + my $capability; + if (/--(\S+)/) { + $capability = $1; + } else { + # If the line provides a short option, translate it. + next if (!/^\s*-(\S)\s/); + $capability = $short_option_translations{$1}; + next if not defined($capability); + } + next if ($capability eq 'help'); + next if ($capability eq 'version'); + next if ($capability eq 'object-directory'); - $capabilities{$1} = 1; - debug("gcov has capability '$1'\n"); + $capabilities{$capability} = 1; + debug("gcov has capability '$capability'\n"); } return \%capabilities; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/bin/genpng new/lcov-1.11/bin/genpng --- old/lcov-1.10/bin/genpng 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/bin/genpng 2014-05-23 11:03:45.000000000 +0200 @@ -35,7 +35,7 @@ # Constants -our $lcov_version = 'LCOV version 1.10'; +our $lcov_version = 'LCOV version 1.11'; our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; our $tool_name = basename($0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/bin/lcov new/lcov-1.11/bin/lcov --- old/lcov-1.10/bin/lcov 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/bin/lcov 2014-05-23 11:03:45.000000000 +0200 @@ -71,7 +71,7 @@ # Global constants -our $lcov_version = 'LCOV version 1.10'; +our $lcov_version = 'LCOV version 1.11'; our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; our $tool_name = basename($0); @@ -93,6 +93,7 @@ our $BR_TAKEN = 2; our $BR_VEC_ENTRIES = 3; our $BR_VEC_WIDTH = 32; +our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); # Branch data combination types our $BR_SUB = 0; @@ -228,6 +229,16 @@ "rc=s%" => \%opt_rc); Getopt::Long::Configure("default"); +# Remove spaces around rc options +while (my ($key, $value) = each(%opt_rc)) { + delete($opt_rc{$key}); + + $key =~ s/^\s+|\s+$//g; + $value =~ s/^\s+|\s+$//g; + + $opt_rc{$key} = $value; +} + # Read configuration file if available if (defined($opt_config_file)) { $config = read_config($opt_config_file); @@ -879,6 +890,9 @@ @param = (@param, "--rc", "$key=".$opt_rc{$key}); } } + if (defined($opt_config_file)) { + @param = (@param, "--config-file", $opt_config_file); + } system(@param) and exit($? >> 8); } @@ -1459,10 +1473,12 @@ my $i; $vec = "" if (!defined($vec)); + $block = $BR_VEC_MAX if $block < 0; # Check if branch already exists in vector for ($i = 0; $i < $num; $i++) { my ($v_block, $v_branch, $v_taken) = br_ivec_get($vec, $i); + $v_block = $BR_VEC_MAX if $v_block < 0; next if ($v_block != $block || $v_branch != $branch); @@ -1499,6 +1515,7 @@ # Retrieve data from vector $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); + $block = -1 if ($block == $BR_VEC_MAX); $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); @@ -1554,6 +1571,10 @@ # "func" -> \%funcdata # "found" -> $lines_found (number of instrumented lines found in file) # "hit" -> $lines_hit (number of executed lines in file) +# "f_found" -> $fn_found (number of instrumented functions found in file) +# "f_hit" -> $fn_hit (number of executed functions in file) +# "b_found" -> $br_found (number of instrumented branches found in file) +# "b_hit" -> $br_hit (number of executed branches in file) # "check" -> \%checkdata # "testfnc" -> \%testfncdata # "sumfnc" -> \%sumfnccount @@ -1979,8 +2000,8 @@ sub add_counts($$) { - my %data1 = %{$_[0]}; # Hash 1 - my %data2 = %{$_[1]}; # Hash 2 + my $data1_ref = $_[0]; # Hash 1 + my $data2_ref = $_[1]; # Hash 2 my %result; # Resulting hash my $line; # Current line iteration scalar my $data1_count; # Count of line in hash1 @@ -1988,10 +2009,10 @@ my $found = 0; # Total number of lines found my $hit = 0; # Number of lines with a count > 0 - foreach $line (keys(%data1)) + foreach $line (keys(%$data1_ref)) { - $data1_count = $data1{$line}; - $data2_count = $data2{$line}; + $data1_count = $data1_ref->{$line}; + $data2_count = $data2_ref->{$line}; # Add counts if present in both hashes if (defined($data2_count)) { $data1_count += $data2_count; } @@ -2003,14 +2024,14 @@ if ($data1_count > 0) { $hit++; } } - # Add lines unique to data2 - foreach $line (keys(%data2)) + # Add lines unique to data2_ref + foreach $line (keys(%$data2_ref)) { - # Skip lines already in data1 - if (defined($data1{$line})) { next; } + # Skip lines already in data1_ref + if (defined($data1_ref->{$line})) { next; } - # Copy count from data2 - $result{$line} = $data2{$line}; + # Copy count from data2_ref + $result{$line} = $data2_ref->{$line}; $found++; if ($result{$line} > 0) { $hit++; } @@ -2615,6 +2636,7 @@ my ($block, $branch, $taken) = br_ivec_get($brdata, $i); + $block = $BR_VEC_MAX if ($block < 0); print(INFO_HANDLE "BRDA:$line,$block,". "$branch,$taken\n"); $br_found++; @@ -3707,10 +3729,10 @@ # Remove count data in testfncdata for functions which are no longer # in funcdata - foreach $testname (%{$testfncdata}) { + foreach $testname (keys(%{$testfncdata})) { my $fnccount = $testfncdata->{$testname}; - foreach $func (%{$fnccount}) { + foreach $func (keys(%{$fnccount})) { if (!defined($funcdata->{$func})) { delete($fnccount->{$func}); } @@ -3718,7 +3740,7 @@ } # Remove count data in sumfnccount for functions which are no longer # in funcdata - foreach $func (%{$sumfnccount}) { + foreach $func (keys(%{$sumfnccount})) { if (!defined($funcdata->{$func})) { delete($sumfnccount->{$func}); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/lcovrc new/lcov-1.11/lcovrc --- old/lcov-1.10/lcovrc 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/lcovrc 2014-05-23 11:03:45.000000000 +0200 @@ -90,6 +90,9 @@ # Specify the character set of all generated HTML pages genhtml_charset=UTF-8 +# Allow HTML markup in test case description text if non-zero +genhtml_desc_html=0 + # Location of the gcov tool (same as --gcov-info option of geninfo) #geninfo_gcov_tool = gcov diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/man/gendesc.1 new/lcov-1.11/man/gendesc.1 --- old/lcov-1.10/man/gendesc.1 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/man/gendesc.1 2014-05-23 11:03:45.000000000 +0200 @@ -1,4 +1,4 @@ -.TH gendesc 1 "LCOV 1.10" 2012\-10\-10 "User Manuals" +.TH gendesc 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" .SH NAME gendesc \- Generate a test case description file .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/man/genhtml.1 new/lcov-1.11/man/genhtml.1 --- old/lcov-1.10/man/genhtml.1 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/man/genhtml.1 2014-05-23 11:03:45.000000000 +0200 @@ -1,4 +1,4 @@ -.TH genhtml 1 "LCOV 1.10" 2012\-10\-10 "User Manuals" +.TH genhtml 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" .SH NAME genhtml \- Generate HTML view from LCOV coverage data files .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/man/geninfo.1 new/lcov-1.11/man/geninfo.1 --- old/lcov-1.10/man/geninfo.1 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/man/geninfo.1 2014-05-23 11:03:45.000000000 +0200 @@ -1,4 +1,4 @@ -.TH geninfo 1 "LCOV 1.10" 2012\-10\-10 "User Manuals" +.TH geninfo 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" .SH NAME geninfo \- Generate tracefiles from .da files .SH SYNOPSIS @@ -74,8 +74,10 @@ .B Exclusion markers To exclude specific lines of code from a tracefile, you can add exclusion -markers to the source code. Exclusion markers are keywords which can for -example be added in the form of a comment. +markers to the source code. Additionally you can exclude specific branches from +branch coverage without excluding the involved lines from line and function +coverage. Exclusion markers are keywords which can for example be added in the +form of a comment. The following markers are recognized by geninfo: @@ -96,6 +98,23 @@ section. .RE .br +LCOV_EXCL_BR_LINE +.RS +Lines containing this marker will be excluded from branch coverage. +.br +.RE +LCOV_EXCL_BR_START +.RS +Marks the beginning of a section which is excluded from branch coverage. The +current line is part of this section. +.br +.RE +LCOV_EXCL_BR_STOP +.RS +Marks the end of a section which is excluded from branch coverage. The current +line not part of this section. +.RE +.br .SH OPTIONS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/man/genpng.1 new/lcov-1.11/man/genpng.1 --- old/lcov-1.10/man/genpng.1 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/man/genpng.1 2014-05-23 11:03:45.000000000 +0200 @@ -1,4 +1,4 @@ -.TH genpng 1 "LCOV 1.10" 2012\-10\-10 "User Manuals" +.TH genpng 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" .SH NAME genpng \- Generate an overview image from a source file .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/man/lcov.1 new/lcov-1.11/man/lcov.1 --- old/lcov-1.10/man/lcov.1 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/man/lcov.1 2014-05-23 11:03:45.000000000 +0200 @@ -1,4 +1,4 @@ -.TH lcov 1 "LCOV 1.10" 2012\-10\-10 "User Manuals" +.TH lcov 1 "LCOV 1.11" 2014\-05\-23 "User Manuals" .SH NAME lcov \- a graphical GCOV front\-end .SH SYNOPSIS @@ -573,6 +573,9 @@ .B source: the source code file for a data set could not be found. + +.B graph: +the graph file could not be found or is corrupted. .RE .B \-i diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/man/lcovrc.5 new/lcov-1.11/man/lcovrc.5 --- old/lcov-1.10/man/lcovrc.5 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/man/lcovrc.5 2014-05-23 11:03:45.000000000 +0200 @@ -1,4 +1,4 @@ -.TH lcovrc 5 "LCOV 1.10" 2012\-10\-10 "User Manuals" +.TH lcovrc 5 "LCOV 1.11" 2014\-05\-23 "User Manuals" .SH NAME lcovrc \- lcov configuration file @@ -149,6 +149,11 @@ genhtml_charset=UTF\-8 .br +# Allow HTML markup in test case description text if non\-zero +.br +genhtml_desc_html=0 +.br + # Location of the gcov tool .br #geninfo_gcov_tool = gcov @@ -546,6 +551,21 @@ Default is UTF-8. .PP + +.BR genhtml_desc_html " =" +.IR 0 | 1 +.IP +If non-zero, test case descriptions may contain HTML markup. + +Set this option to one if you want to embed HTML markup (for example to +include links) in test case descriptions. When set to zero, HTML markup +characters will be escaped to show up as plain text on the test case +description page. +.br + +Default is 0. +.PP +. .BR geninfo_gcov_tool " =" .I path_to_gcov .IP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.10/rpm/lcov.spec new/lcov-1.11/rpm/lcov.spec --- old/lcov-1.10/rpm/lcov.spec 2012-10-10 11:15:55.000000000 +0200 +++ new/lcov-1.11/rpm/lcov.spec 2014-05-23 11:03:45.000000000 +0200 @@ -1,6 +1,6 @@ Summary: A graphical GCOV front-end Name: lcov -Version: 1.10 +Version: 1.11 Release: 1 License: GPL Group: Development/Tools -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org