X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FTest%2FValgrind%2FAction%2FSuppressions.pm;h=2ee894a15331e2287f186a545020cd770ccd1e23;hb=f2071d95aaaa4817e91cc33530deedc8d701d44d;hp=9f4d3fbecbe3fe2bf75adaff270a0402729a3779;hpb=abe419ac02d109283a1fe5615f5ab9d0a9a5572f;p=perl%2Fmodules%2FTest-Valgrind.git diff --git a/lib/Test/Valgrind/Action/Suppressions.pm b/lib/Test/Valgrind/Action/Suppressions.pm index 9f4d3fb..2ee894a 100644 --- a/lib/Test/Valgrind/Action/Suppressions.pm +++ b/lib/Test/Valgrind/Action/Suppressions.pm @@ -9,11 +9,11 @@ Test::Valgrind::Action::Suppressions - Generate suppressions for a given tool. =head1 VERSION -Version 1.01 +Version 1.19 =cut -our $VERSION = '1.01'; +our $VERSION = '1.19'; =head1 DESCRIPTION @@ -21,13 +21,19 @@ This action just writes the contents of the suppressions reports received into t =cut -use base qw/Test::Valgrind::Action Test::Valgrind::Action::Captor/; +use base qw; =head1 METHODS This class inherits L. -=head2 C<< new name => $name, target => $target, ... >> +=head2 C + + my $tvas = Test::Valgrind::Action::Suppressions->new( + name => $name, + target => $target, + %extra_args, + ); Your usual constructor. @@ -45,7 +51,7 @@ sub new { my %validated; - for (qw/name target/) { + for (qw) { my $arg = delete $args{$_}; $class->_croak("'$_' is expected to be a plain scalar") unless $arg and not ref $arg; @@ -54,7 +60,7 @@ sub new { my $self = $class->SUPER::new(%args); - $self->{$_} = $validated{$_} for qw/name target/; + $self->{$_} = $validated{$_} for qw; $self; } @@ -63,6 +69,8 @@ sub do_suppressions { 1 } =head2 C + my $name = $tvas->name; + Read-only accessor for the C option. =cut @@ -71,6 +79,8 @@ sub name { $_[0]->{name} } =head2 C + my $target = $tvas->target; + Read-only accessor for the C option. =cut @@ -82,28 +92,7 @@ sub start { $self->SUPER::start($sess); - $self->{status} = undef; - $self->{total} = 0; - delete $self->{diagnostics}; - - if ($self->{fh}) { - close $self->{fh} or $self->_croak("close(\$self->{fh}): $!"); - } - - my $target = $self->target; - - require File::Spec; - my ($vol, $dir, $file) = File::Spec->splitpath($target); - my $base = File::Spec->catpath($vol, $dir, ''); - unless (-e $base) { - require File::Path; - File::Path::mkpath([ $base ]); - } else { - 1 while unlink $target; - } - - open $self->{fh}, '>', $target - or $self->_croak("open(\$self->{fh}, '>', \$self->target): $!"); + delete @{$self}{qw}; $self->save_fh(\*STDOUT => '>' => undef); $self->save_fh(\*STDERR => '>' => undef); @@ -136,12 +125,7 @@ sub report { $self->SUPER::report($sess, $report); - ++$self->{total}; - - print { $self->{fh} } "{\n" - . $self->name . $report->id . "\n" - . $report->data - . "}\n"; + push @{$self->{supps}}, $report; return; } @@ -153,11 +137,37 @@ sub finish { $self->restore_all_fh; - close $self->{fh} or $self->_croak("close(\$self->{fh}): $!"); - print $self->{diagnostics} if defined $self->{diagnostics}; delete $self->{diagnostics}; - print "Found $self->{total} distinct suppressions\n"; + + my $target = $self->target; + + require File::Spec; + my ($vol, $dir, $file) = File::Spec->splitpath($target); + my $base = File::Spec->catpath($vol, $dir, ''); + if (-e $base) { + 1 while unlink $target; + } else { + require File::Path; + File::Path::mkpath([ $base ]); + } + + open my $fh, '>', $target + or $self->_croak("open(\$fh, '>', \$self->target): $!"); + + my $id = 0; + my %seen; + for (sort { $a->data cmp $b->data } + grep !$seen{$_->data}++, @{$self->{supps}}) { + print $fh "{\n" + . $self->name . ++$id . "\n" + . $_->data + . "}\n"; + } + + close $fh or $self->_croak("close(\$fh): $!"); + + print "Found $id distinct suppressions\n"; $self->{status} = 0; @@ -189,7 +199,7 @@ You can find documentation for this module with the perldoc command. =head1 COPYRIGHT & LICENSE -Copyright 2009 Vincent Pit, all rights reserved. +Copyright 2009,2010,2011,2013,2015,2016 Vincent Pit, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.