nixpkgs-suyu/pkgs/development/tools/analysis/lcov/find-source.patch
Ludovic Courtès aa0902047e LCOV 1.8.
svn path=/nixpkgs/trunk/; revision=21149
2010-04-18 21:51:33 +00:00

84 lines
2.4 KiB
Diff

--- lcov-1.8/bin/geninfo 2010-01-29 11:14:46.000000000 +0100
+++ lcov-1.8/bin/geninfo 2010-04-18 23:33:43.000000000 +0200
@@ -51,6 +51,7 @@
use strict;
use File::Basename;
+use Cwd qw(abs_path);
use File::Spec::Functions qw /abs2rel catdir file_name_is_absolute splitdir
splitpath rel2abs/;
use Getopt::Long;
@@ -95,6 +96,7 @@ sub match_filename($@);
sub solve_ambiguous_match($$$);
sub split_filename($);
sub solve_relative_path($$);
+sub find_source_file($$);
sub read_gcov_header($);
sub read_gcov_file($);
sub info(@);
@@ -964,7 +966,7 @@ sub process_dafile($$)
if (defined($source))
{
- $source = solve_relative_path($base_dir, $source);
+ $source = find_source_file($base_dir, $source);
}
# gcov will happily create output even if there's no source code
@@ -981,18 +983,9 @@ sub process_dafile($$)
die("ERROR: could not read source file $source\n");
}
- @matches = match_filename(defined($source) ? $source :
- $gcov_file, keys(%{$instr}));
+ next if ! -r $source;
- # Skip files that are not mentioned in the graph file
- if (!@matches)
- {
- warn("WARNING: cannot find an entry for ".$gcov_file.
- " in $graph_file_extension file, skipping ".
- "file!\n");
- unlink($gcov_file);
- next;
- }
+ @matches = ($source);
# Read in contents of gcov file
@result = read_gcov_file($gcov_file);
@@ -1242,6 +1235,25 @@ sub solve_relative_path($$)
}
+sub find_source_file($$)
+{
+ my ($base_dir, $source) = @_;
+ my $dir = $base_dir;
+
+ # Hack to make absolute paths work on Nixpkgs coverage
+ # reports. The source is in /nix/store/<bla>/.build/<bla>.
+ $source = $1 if $source =~ /^\/.*\/\.build\/(.*)$/;
+
+ while (!-e "$dir/$source") {
+ $dir = $dir . "/..";
+ if (length $dir > 1000) {
+ return "$base_dir/$source";
+ }
+ }
+ return abs_path("$dir/$source");
+}
+
+
#
# match_filename(gcov_filename, list)
#
@@ -1918,7 +1930,7 @@ sub process_graphfile($$)
# Get path to data file in absolute and normalized form (begins with /,
# contains no more ../ or ./)
- $graph_filename = solve_relative_path($cwd, $graph_filename);
+ $graph_filename = find_source_file($cwd, $graph_filename);
# Get directory and basename of data file
($graph_dir, $graph_basename) = split_filename($graph_filename);