Devel-Cover
view release on metacpan or search on metacpan
lib/Devel/Cover/DB/Structure.pm view on Meta::CPAN
}
$digest
}
sub digest {
my $self = shift;
my ($file) = @_;
# print STDERR "Opening $file for MD5 digest\n";
my $digest;
if (open my $fh, "<", $file) {
binmode $fh;
$digest = Digest::MD5->new->addfile($fh)->hexdigest;
} else {
print STDERR "Devel::Cover: Warning: can't open $file "
. "for MD5 digest: $!\n"
unless lc $file eq "-e"
or $Devel::Cover::Silent
or $file =~ $Devel::Cover::DB::Ignore_filenames;
# require "Cwd"; print STDERR Carp::longmess("in " . Cwd::cwd());
}
$digest
}
sub get_count {
my $self = shift;
my ($file, $criterion) = @_;
$self->{count}{$criterion}{$file}
}
sub add_count {
my $self = shift;
# warn Carp::longmess("undefined file") unless defined $self->{file};
return unless defined $self->{file}; # can happen during self_cover
my ($criterion) = @_;
$self->{additional_count}{$criterion}{ $self->{file} }++
if $self->{additional};
(
$self->{count}{$criterion}{ $self->{file} }++,
!$self->reuse($self->{file}) || $self->{additional},
)
}
sub delete_file {
my $self = shift;
my ($file) = @_;
delete $self->{f}{$file};
}
# TODO - concurrent runs updating structure?
sub write {
my $self = shift;
my ($dir) = @_;
# print STDERR Dumper $self;
$dir .= "/structure";
unless (mkdir $dir) {
confess "Can't mkdir $dir: $!" unless -d $dir;
}
chmod 0777, $dir if $self->{loose_perms};
for my $file (sort keys %{ $self->{f} }) {
$self->{f}{$file}{file} = $file;
my $digest = $self->{f}{$file}{digest};
$digest = $1 if defined $digest && $digest =~ /(.*)/; # ie tainting
unless ($digest) {
print STDERR "Can't find digest for $file"
unless $Devel::Cover::Silent
|| $file =~ $Devel::Cover::DB::Ignore_filenames
|| ($Devel::Cover::Self_cover && $file =~ q|/Devel/Cover[./]|);
next;
}
my $df_final = "$dir/$digest";
my $df_temp = "$dir/.$digest.$$";
# TODO - determine if Structure has changed to save writing it
# my $f = $df; my $n = 1; $df = $f . "." . $n++ while -e $df;
my $io = Devel::Cover::DB::IO->new;
$io->write($self->{f}{$file}, $df_temp); # unless -e $df;
unless (rename $df_temp, $df_final) {
unless ($Devel::Cover::Silent) {
if (-e $df_final) {
print STDERR "Can't rename $df_temp to $df_final "
. "(which exists): $!";
$self->debuglog(
"Can't rename $df_temp to $df_final " . "(which exists): $!")
if DEBUG;
} else {
print STDERR "Can't rename $df_temp to $df_final: $!";
$self->debuglog("Can't rename $df_temp to $df_final: $!") if DEBUG;
}
}
unless (unlink $df_temp) {
print STDERR "Can't remove $df_temp after failed rename: $!"
unless $Devel::Cover::Silent;
$self->debuglog("Can't remove $df_temp after failed rename: $!")
if DEBUG;
}
}
}
}
sub read {
my $self = shift;
my ($digest) = @_;
my $file = "$self->{base}/structure/$digest";
my $io = Devel::Cover::DB::IO->new;
my $s = eval { $io->read($file) };
if ($@ or !$s) {
$self->debuglog("read retrieve $file failed: $@") if DEBUG;
die $@;
}
if (DEBUG) {
foreach my $key (qw(file digest)) {
if (!defined $s->{$key}) {
$self->debuglog("retrieve $file had no $key entry. Got:\n", $s);
}
}
}
my $d = $self->digest($s->{file});
( run in 0.797 second using v1.01-cache-2.11-cpan-5b529ec07f3 )