Devel-Cover
view release on metacpan or search on metacpan
lib/Devel/Cover/DB.pm view on Meta::CPAN
| # Mouse
(?: (?: rw-accessor | ro-accessor ) \s for )
| # Template Toolkit
(?: Parser\.yp )
| # perl generated
(?: \/loader\/0x )
/x;
sub new {
my $class = shift;
my $self = {
criteria => \@Devel::Cover::DB::Criteria,
criteria_short => \@Devel::Cover::DB::Criteria_short,
runs => {},
collected => {},
uncoverable_file => [],
@_,
};
$self->{all_criteria} = [ @{ $self->{criteria} }, "total" ];
$self->{all_criteria_short} = [ @{ $self->{criteria_short} }, "total" ];
$self->{base} ||= $self->{db};
bless $self, $class;
if (defined $self->{db}) {
$self->validate_db;
my $file = "$self->{db}/$DB";
$self->read($file) if -e $file;
}
$self
}
sub criteria { @{ $_[0]->{criteria} } }
sub criteria_short { @{ $_[0]->{criteria_short} } }
sub all_criteria { @{ $_[0]->{all_criteria} } }
sub all_criteria_short { @{ $_[0]->{all_criteria_short} } }
sub read {
my $self = shift;
my ($file) = @_;
my $io = Devel::Cover::DB::IO->new;
my $db = eval { $io->read($file) };
if ($@ or !$db) {
warn $@;
} else {
$self->{runs} = $db->{runs};
}
$self
}
sub write {
my $self = shift;
$self->{db} = shift if @_;
croak "No db specified" unless length $self->{db};
unless (mkdir $self->{db}) {
croak "Can't mkdir $self->{db}: $!\n" unless -d $self->{db};
}
chmod 0777, $self->{db} if $self->{loose_perms};
$self->validate_db;
my $db = { runs => $self->{runs} };
my $io = Devel::Cover::DB::IO->new;
$io->write($db, "$self->{db}/$DB");
$self->{structure}->write($self->{base}) if $self->{structure};
$self
}
sub delete {
my $self = shift;
my $db = "";
$db = $self->{db} if ref $self;
$db = shift if @_;
$self->{db} = $db if ref $self;
croak "No db specified" unless length $db;
return $self unless -d $db;
# TODO - just delete the directory?
opendir DIR, $db or die "Can't opendir $db: $!";
my @files = map "$db/$_", map /(.*)/ && $1, grep !/^\.\.?/, readdir DIR;
closedir DIR or die "Can't closedir $db: $!";
rmtree(\@files) if @files;
$self
}
sub clean {
my $self = shift;
# remove all lock files
my $rm_lock = sub {
unlink if /\.lock$/
};
find($rm_lock, $self->{db});
}
sub merge_runs {
my $self = shift;
my $db = $self->{db};
# print STDERR "merge_runs from $db/runs/*\n";
# system "ls -al $db/runs";
return $self unless length $db;
opendir DIR, "$db/runs" or return $self;
my @runs = map "$db/runs/$_", grep !/^\.\.?/, readdir DIR;
closedir DIR or die "Can't closedir $db/runs: $!";
$self->{changed_files} = {};
# The ordering is important here. The runs need to be merged in the order
# they were created. We're only at a granularity of one second, but that
# shouldn't be a problem unless a file is altered and the coverage run
# created in less than a second. I think we're OK for now.
for my $run (sort @runs) {
# print STDERR "Devel::Cover: merging run $run <$self->{base}>\n";
my $r = Devel::Cover::DB->new(base => $self->{base}, db => $run);
$self->merge($r);
( run in 1.051 second using v1.01-cache-2.11-cpan-5b529ec07f3 )