CSS-Watcher
view release on metacpan or search on metacpan
lib/CSS/Watcher/Monitor.pm view on Meta::CPAN
package CSS::Watcher::Monitor;
use strict;
use warnings;
use Carp;
use Log::Log4perl qw(:easy);
use File::Spec;
use Fcntl ':mode';
use List::MoreUtils qw(any);
our @STAT_FIELDS = qw(
dev inode mode num_links uid gid rdev size atime mtime ctime
blk_size blocks
);
sub new {
my $class= shift;
my $options = shift;
return bless ({
dir => $options->{dir} // undef,
oldstats => {},
}, $class);
}
sub dir {
my $self = shift;
croak "dir attribute is read-only" if @_;
return $self->{dir};
}
sub scan {
my ($self, $callback, $skip_dirs) = @_;
return 0 unless (defined $callback && defined $self->dir && -d $self->dir);
my $newstat = $self->_get_files_info( $self->dir, $skip_dirs );
my $changes = 0;
while ( my( $fname, $stat ) = each %{$newstat->{files}} ) {
unless ($self->_deep_compare ($self->_get_stat ($fname), $stat )) {
$self->_set_stat ($fname, $stat);
$callback->($fname);
$changes++;
}
}
return $changes;
}
sub is_changed {
my ( $self, $filename ) = @_;
my %objstat;
@objstat{@STAT_FIELDS} = stat ( $filename );
# this file may never present before and not exist, return false
return 0 unless (defined ($objstat{atime}) && -f $filename);
not $self->_deep_compare (
$self->_get_stat ($filename),
\%objstat);
}
sub make_dirty {
my $self = shift;
$self->{oldstats} = {};
}
sub _get_stat {
my ( $self, $filename ) = @_;
return $self->{oldstats}{$filename} // {};
}
( run in 2.083 seconds using v1.01-cache-2.11-cpan-5735350b133 )