1 | package Mojo::Server::Morbo::Backend::Poll;
|
---|
2 | use Mojo::Base 'Mojo::Server::Morbo::Backend';
|
---|
3 |
|
---|
4 | use Mojo::File 'path';
|
---|
5 |
|
---|
6 | sub modified_files {
|
---|
7 | my $self = shift;
|
---|
8 |
|
---|
9 | my $cache = $self->{cache} ||= {};
|
---|
10 | my @files;
|
---|
11 | for my $file (map { -f $_ && -r _ ? $_ : _list($_) } @{$self->watch}) {
|
---|
12 | my ($size, $mtime) = (stat $file)[7, 9];
|
---|
13 | next unless defined $size and defined $mtime;
|
---|
14 | my $stats = $cache->{$file} ||= [$^T, $size];
|
---|
15 | next if $mtime <= $stats->[0] && $size == $stats->[1];
|
---|
16 | @$stats = ($mtime, $size);
|
---|
17 | push @files, $file;
|
---|
18 | }
|
---|
19 | sleep $self->watch_timeout unless @files;
|
---|
20 |
|
---|
21 | return \@files;
|
---|
22 | }
|
---|
23 |
|
---|
24 | sub _list { path(shift)->list_tree->map('to_string')->each }
|
---|
25 |
|
---|
26 | 1;
|
---|
27 |
|
---|
28 | =encoding utf8
|
---|
29 |
|
---|
30 | =head1 NAME
|
---|
31 |
|
---|
32 | Mojo::Server::Morbo::Backend::Poll - Morbo default backend
|
---|
33 |
|
---|
34 | =head1 SYNOPSIS
|
---|
35 |
|
---|
36 | use Mojo::Server::Morbo::Backend::Poll;
|
---|
37 |
|
---|
38 | my $backend = Mojo::Server::Morbo::Backend::Poll->new;
|
---|
39 | if (my $files = $backend->modified_files) {
|
---|
40 | ...
|
---|
41 | }
|
---|
42 |
|
---|
43 | =head1 DESCRIPTION
|
---|
44 |
|
---|
45 | L<Mojo::Server::Morbo::Backend:Poll> is the default backend for
|
---|
46 | L<Mojo::Server::Morbo>.
|
---|
47 |
|
---|
48 | =head1 ATTRIBUTES
|
---|
49 |
|
---|
50 | L<Mojo::Server::Morbo::Backend::Poll> inherits all attributes from
|
---|
51 | L<Mojo::Server::Morbo::Backend>.
|
---|
52 |
|
---|
53 | =head1 METHODS
|
---|
54 |
|
---|
55 | L<Mojo::Server::Morbo::Backend::Poll> inherits all methods from
|
---|
56 | L<Mojo::Server::Morbo::Backend> and implements the following new ones.
|
---|
57 |
|
---|
58 | =head2 modified_files
|
---|
59 |
|
---|
60 | my $files = $backend->modified_files;
|
---|
61 |
|
---|
62 | Check file size and mtime to determine which files have changed, this is not
|
---|
63 | particularly efficient, but very portable.
|
---|
64 |
|
---|
65 | # All files that have been modified
|
---|
66 | say for @{$backend->modified_files};
|
---|
67 |
|
---|
68 | =head1 SEE ALSO
|
---|
69 |
|
---|
70 | L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>.
|
---|
71 |
|
---|
72 | =cut
|
---|