miyagawa (owner)

Revisions

gist: 214730 Download_button fork
public
Description:
Doesn't work ...
Public Clone URL: git://gist.github.com/214730.git
Embed All Files: show embed
Plack-reloader.patch #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
diff --git a/lib/Plack/Middleware/Restarter.pm b/lib/Plack/Middleware/Restarter.pm
index c5c57cc..0d4cada 100644
--- a/lib/Plack/Middleware/Restarter.pm
+++ b/lib/Plack/Middleware/Restarter.pm
@@ -3,6 +3,8 @@ use strict;
 use warnings;
 use parent qw/Plack::Middleware/;
 use File::ChangeNotify;
+use Plack::Util;
+__PACKAGE__->mk_accessors(qw(starter));
 
 sub new {
     my $class = shift;
@@ -22,21 +24,52 @@ sub to_app {
         close STDOUT;
         close STDIN;
 
- local $SIG{CHLD} = sub { exit }; # exit when child was dead.
         my $watcher = File::ChangeNotify->instantiate_watcher(
             %$self
         );
         while ( my @events = $watcher->wait_for_events() ) {
+ warn "$events[0]{path} is updated. Restarting the server...\n";
             kill 'HUP' => $pid;
             waitpid($pid, 0);
- exit;
+ $self->restart_server;
         }
     } else {
         # child(main process)
- return $self->app(); # nop. This is same as 'sub { $self->app->(@_) }'
+ return $self->app;
     }
 }
 
+sub loader {
+ my($starter, $app);
+ my $method = sub {
+ my($method, @args) = @_;
+ $starter = sub {
+ my $server = Plack::Loader->$method(@args);
+ return Plack::Util::inline_object
+ run => sub { $app = shift; $server->run($app) },
+ starter => sub { sub { $starter->()->run($app) } };
+ };
+ $starter->();
+ };
+
+ Plack::Util::inline_object
+ load => sub { $method->(load => @_) },
+ auto => sub { $method->(auto => @_) },
+}
+
+sub restart_server {
+ my $self = shift;
+
+ if ($self->starter) {
+ $self->starter->();
+ } else {
+ warn "The server is not run by Plack::Loader. Exiting...\n";
+ exit;
+ }
+}
+
+
+
 1;
 __END__
 
diff --git a/scripts/plackup b/scripts/plackup
index 905c9a9..1c41837 100755
--- a/scripts/plackup
+++ b/scripts/plackup
@@ -11,6 +11,7 @@ my $app = "app.psgi";
 my $env = "development";
 my $help = 0;
 my $backend;
+my $restart;
 my @includes;
 
 # From 'prove': Allow cuddling the paths with the -I
@@ -23,20 +24,14 @@ GetOptions(
     "i|impl=s" => sub { warn "-i is deprecated. Use -s instead\n"; $backend = $_[1] },
     "E|env=s" => \$env,
     'I=s@' => \@includes,
+ "r|restart" => \$restart,
     "h|help", => \$help,
 );
 
 pod2usage(0) if $help;
 lib->import(@includes) if @includes;
 
-my $handler = Plack::Util::load_psgi $app;
-
-if ($env eq 'development') {
- require Plack::Middleware::StackTrace;
- require Plack::Middleware::AccessLog;
- $handler = Plack::Middleware::StackTrace->wrap($handler);
- $handler = Plack::Middleware::AccessLog->wrap($handler, logger => sub { print STDERR @_ });
-}
+require Plack::Middleware::Restarter if $restart;
 
 my @args = map {
     my $is_long_opt = s/^--//;
@@ -45,7 +40,18 @@ my @args = map {
     @v;
 } @ARGV;
 
-my $server = $backend ? Plack::Loader->load($backend, @args) : Plack::Loader->auto(@args);
+my $loader = $restart ? Plack::Middleware::Restarter->loader : 'Plack::Loader';
+my $server = $backend ? $loader->load($backend, @args) : $loader->auto(@args);
+
+my $handler = Plack::Util::load_psgi $app;
+if ($env eq 'development') {
+ require Plack::Middleware::AccessLog;
+ require Plack::Middleware::StackTrace;
+ $handler = Plack::Middleware::Restarter->wrap($handler, starter => $server->starter) if $restart;
+ $handler = Plack::Middleware::StackTrace->wrap($handler);
+ $handler = Plack::Middleware::AccessLog->wrap($handler, logger => sub { print STDERR @_ });
+}
+
 $server->run($handler);
 
 __END__