X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=779378cbb6099e11713ea1fdf570bddec9203367;hp=14b441acecc150cd70db0c5cea9276d7be188330;hb=c825a86ca867b6b804aa8636728c3d3702ac9f04;hpb=ee110ef53642ef3f47e00a3ac0c3c01c8ccecdec diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index 14b441a..779378c 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -3,9 +3,6 @@ package Catalyst::Engine::HTTP; use strict; use base 'Catalyst::Engine::CGI'; use Errno 'EWOULDBLOCK'; -use FindBin; -use File::Find; -use File::Spec; use HTTP::Status; use NEXT; use Socket; @@ -112,55 +109,6 @@ sub run { my ( $self, $class, $port, $host, $options ) = @_; $options ||= {}; - - # Setup restarter - my $restarter; - if ( $options->{restart} ) { - my $parent = $$; - unless ( $restarter = fork ) { - - # Prepare - close STDIN; - close STDOUT; - - # Index parent directory - my $dir = File::Spec->catdir( $FindBin::Bin, '..' ); - - my $regex = $options->{restart_regex}; - my $one = _index( $dir, $regex ); - RESTART: while (1) { - sleep $options->{restart_delay} || 1; - - # check if our parent has died - exit if ( getppid == 1 ); - - my $two = _index( $dir, $regex ); - my $changes = _compare_index( $one, $two ); - if (@$changes) { - $one = $two; - - # Test modified pm's - for my $file (@$changes) { - next unless $file =~ /\.pm$/; - if ( my $error = _test($file) ) { - print STDERR - qq/File "$file" modified, not restarting\n\n/; - print STDERR '*' x 80, "\n"; - print STDERR $error; - print STDERR '*' x 80, "\n"; - next RESTART; - } - } - - # Restart - my $files = join ', ', @$changes; - print STDERR qq/"$files" modified, restarting\n\n/; - kill( 1, $parent ); - exit; - } - } - } - } our $GOT_HUP; local $GOT_HUP = 0; @@ -278,22 +226,8 @@ sub run { if ($GOT_HUP) { $SIG{CHLD} = 'DEFAULT'; wait; - exec {$0}( ( ( -x $0 ) ? () : ($^X) ), $0, @{ $options->{argv} } ); - } -} - -sub _compare_index { - my ( $one, $two ) = @_; - my %clone = %$two; - my @changes; - while ( my ( $key, $val ) = each %$one ) { - if ( !$clone{$key} || ( $clone{$key} ne $val ) ) { - push @changes, $key; - } - delete $clone{$key}; + exec $^X . ' "' . $0 . '" ' . join(' ', @{$options->{argv}}); } - for my $key ( keys %clone ) { push @changes, $key } - return \@changes; } sub _get_line { @@ -311,71 +245,6 @@ sub _get_line { return $line; } -# The list of files/directories we check for modification -our $file_index; - -sub _index { - my ( $dir, $regex ) = @_; - - if ( ref $file_index ) { - # don't run a File::Find, but just check file/dir mod times - my %index = %{$file_index}; - foreach my $file ( keys %index ) { - if ( my @stat = stat $file ) { - $index{$file} = $stat[9]; - } - else { - delete $index{$file}; - } - } - return \%index; - } - else { - # first time, run a File::Find to locate files and dirs to watch - my $index = {}; - finddepth( - { - wanted => sub { - my $file = File::Spec->rel2abs($File::Find::name); - $file =~ s{/script/..}{}; - return unless $file =~ /$regex/; - return unless -f $file; - my $time = ( stat $file )[9]; - $index->{$file} = $time; - - # also watch the directory the file is in - my $cur_dir = File::Spec->rel2abs($File::Find::dir); - $cur_dir =~ s{/script/..}{}; - unless ( $index->{$cur_dir} ) { - my $time = ( stat $cur_dir )[9]; - $index->{$cur_dir} = $time; - } - }, - no_chdir => 1 - }, - $dir - ); - $file_index = $index; - return $file_index; - } -} - -sub _test { - my $file = shift; - delete $INC{$file}; - - # if the file has been deleted, don't try to test it - return 0 unless -f $file; - - local $SIG{__WARN__} = sub { }; - open my $olderr, '>&STDERR'; - open STDERR, '>', File::Spec->devnull; - eval "require '$file'"; - open STDERR, '>&', $olderr; - return $@ if $@; - return 0; -} - =back =head1 SEE ALSO