AnyEvent-Filesys-Watcher
view release on metacpan or search on metacpan
lib/AnyEvent/Filesys/Watcher/FSEvents.pm view on Meta::CPAN
}
return @events;
}
}
sub __parseEvent {
my ($self, $raw_event) = @_;
# Count trailing zero bits. Taken from Chess::Plisco::Macro.
my $ctzb = sub {
my ($bb) = @_;
my $B = $bb & -$bb;
my $A = $B - 1 - ((($B - 1) >> 1) & $FIVES);
my $C = ($A & $THREES) + (($A >> 2) & $THREES);
my $n = $C + ($C >> 32);
$n = ($n & 0x0f0f0f0f) + (($n >> 4) & 0x0f0f0f0f);
$n = ($n & 0xffff) + ($n >> 16);
$n = ($n & 0xff) + ($n >> 8);
};
my $flags = $raw_event->flags || return;
my $path = $self->_makeAbsolute($raw_event->path);
my ($type, $is_directory);
my $old_fs = $self->_oldFilesystem;
while ($flags) {
my $bit = $ctzb->($flags);
$flags &= $flags - 1;
my $flag = $flags[$bit + 1];
if ('FSEventStreamEventFlagItemIsDir' eq $flag) {
$is_directory = 1;
} elsif (CREATED eq $flag_type{$flag}) {
$type = 'created' if $type ne 'deleted';
} elsif (MODIFIED eq $flag_type{$flag}) {
$type = 'modified' if $type ne 'deleted',
} elsif (DELETED eq $flag_type{$flag}) {
$type = 'deleted';
} elsif (IGNORE eq $flag_type{$flag}) {
next;
} elsif (RENAMED eq $flag_type{$flag}) {
if (-e $path) {
if ($old_fs->{$path}) {
$type = 'modified';
} else {
$type = 'created';
}
} else {
$type = 'deleted';
}
} elsif (RESCAN eq $flag_type{$flag}) {
die "must rescan\n";
}
}
if ('deleted' eq $type) {
delete $old_fs->{$path};
} elsif ('modified' eq $type || 'created' eq $type) {
$old_fs->{path} = $self->_stat($path);
} else {
# Issue a warning?
return;
}
return AnyEvent::Filesys::Watcher::Event->new(
path => $path,
type => $type,
is_directory => $is_directory,
id => $raw_event->id,
);
}
1;
( run in 1.814 second using v1.01-cache-2.11-cpan-0d23b851a93 )