AnyEvent-Filesys-Watcher
view release on metacpan or search on metacpan
lib/AnyEvent/Filesys/Watcher.pm view on Meta::CPAN
&& defined $args{filter}
&& length $args{filter}) {
$args{filter} = $self->__compileFilter($args{filter});
} else {
$args{filter} = sub { 1 };
}
foreach my $arg (keys %args) {
$self->{'__' . $arg} = $args{$arg};
}
$self->_oldFilesystem($self->_scanFilesystem($self->directories));
return $self;
}
sub directories {
my ($self) = @_;
return [@{$self->{__directories}}];
}
sub interval {
shift->{__interval};
}
sub callback {
my ($self, $cb) = @_;
if (@_ > 1) {
$self->{__callback} = $cb;
}
return $self->{__callback};
}
sub filter {
my ($self, $filter) = @_;
if (@_ > 1) {
$self->{__filter} = $self->__compileFilter($filter);
}
return $self->{__filter};
}
# Taken from AnyEvent::Filesys::Notify.
sub _scanFilesystem {
my ($self, @args) = @_;
# Accept either an array of directories or an array reference of
# directories.
my @paths = ref $args[0] eq 'ARRAY' ? @{ $args[0] } : @args;
my $fs_stats = {};
my $rule = Path::Iterator::Rule->new;
my $next = $rule->iter(@paths);
while (my $file = $next->()) {
my $path = $self->_makeAbsolute($file);
my %stat = $self->_stat($path)
or next; # Skip files that we cannot stat.
$fs_stats->{$path} = \%stat;
}
return $fs_stats;
}
sub _makeAbsolute {
my ($self, $path) = @_;
$path = File::Spec->rel2abs($path, $self->{__base_dir});
if ('MSWin32' eq $^O || 'cygwin' eq $^O || 'os2' eq $^O || 'dos' eq $^O) {
# This is what Cwd does.
$path =~ s{\\}{/}g;
}
return $path;
}
# Taken from AnyEvent::Filesys::Notify.
sub _diffFilesystem {
my ($self, $old_fs, $new_fs) = @_;
my @events = ();
for my $path (keys %$old_fs) {
if (not exists $new_fs->{$path}) {
push @events,
AnyEvent::Filesys::Watcher::Event->new(
path => $path,
type => 'deleted',
is_directory => $old_fs->{$path}->{is_directory},
);
} elsif ($self->__isPathModified($old_fs->{$path}, $new_fs->{$path})) {
push @events,
AnyEvent::Filesys::Watcher::Event->new(
path => $path,
type => 'modified',
is_directory => $old_fs->{$path}->{is_directory},
);
}
}
for my $path (keys %$new_fs) {
if (not exists $old_fs->{$path}) {
push @events,
AnyEvent::Filesys::Watcher::Event->new(
path => $path,
type => 'created',
is_directory => $new_fs->{$path}->{is_directory},
);
}
}
return @events;
}
sub _filesystemMonitor {
my ($self, $value) = @_;
if (@_ > 1) {
( run in 2.146 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )