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 )