31
31
import os
32
32
import re
33
33
import subprocess
34
+ import time
34
35
try :
35
36
from urlparse import urlparse
36
37
except ImportError :
@@ -77,6 +78,7 @@ class CommandAuto(Command):
77
78
"""Start debugging console."""
78
79
name = "auto"
79
80
logger = None
81
+ has_server = True
80
82
doc_purpose = "builds and serves a site; automatically detects site changes, rebuilds, and optionally refreshes a browser"
81
83
cmd_options = [
82
84
{
@@ -100,7 +102,7 @@ class CommandAuto(Command):
100
102
'short' : 'b' ,
101
103
'long' : 'browser' ,
102
104
'type' : bool ,
103
- 'help' : 'Start a web browser. ' ,
105
+ 'help' : 'Start a web browser' ,
104
106
'default' : False ,
105
107
},
106
108
{
@@ -111,6 +113,13 @@ class CommandAuto(Command):
111
113
'type' : bool ,
112
114
'help' : 'Use IPv6' ,
113
115
},
116
+ {
117
+ 'name' : 'no-server' ,
118
+ 'long' : 'no-server' ,
119
+ 'default' : False ,
120
+ 'type' : bool ,
121
+ 'help' : 'Disable the server, automate rebuilds only'
122
+ },
114
123
]
115
124
116
125
def _execute (self , options , args ):
@@ -166,10 +175,14 @@ def _execute(self, options, args):
166
175
167
176
host = options ['address' ].strip ('[' ).strip (']' ) or dhost
168
177
178
+ # Server can be disabled (Issue #1883)
179
+ self .has_server = not options ['no-server' ]
180
+
169
181
# Instantiate global observer
170
182
observer = Observer ()
171
- # Watch output folders and trigger reloads
172
- observer .schedule (OurWatchHandler (self .do_refresh ), out_folder , recursive = True )
183
+ if self .has_server :
184
+ # Watch output folders and trigger reloads
185
+ observer .schedule (OurWatchHandler (self .do_refresh ), out_folder , recursive = True )
173
186
174
187
# Watch input folders and trigger rebuilds
175
188
for p in watched :
@@ -182,6 +195,7 @@ def _execute(self, options, args):
182
195
observer .schedule (ConfigWatchHandler (_conf_fn , self .do_rebuild ), _conf_dn , recursive = False )
183
196
184
197
try :
198
+ self .logger .info ("Watching files for changes..." )
185
199
observer .start ()
186
200
except KeyboardInterrupt :
187
201
pass
@@ -195,29 +209,42 @@ def __call__(self, environ, start_response):
195
209
return parent .serve_static (environ , start_response )
196
210
return super (Mixed , self ).__call__ (environ , start_response )
197
211
198
- ws = make_server (
199
- host , port , server_class = WSGIServer ,
200
- handler_class = WebSocketWSGIRequestHandler ,
201
- app = Mixed (handler_cls = LRSocket )
202
- )
203
- ws .initialize_websockets_manager ()
204
- self .logger .info ("Serving HTTP on {0} port {1}..." .format (host , port ))
205
- if browser :
206
- if options ['ipv6' ] or '::' in host :
207
- server_url = "http://[{0}]:{1}/" .format (host , port )
208
- else :
209
- server_url = "http://{0}:{1}/" .format (host , port )
210
-
211
- self .logger .info ("Opening {0} in the default web browser..." .format (server_url ))
212
- # Yes, this is racy
213
- webbrowser .open ('http://{0}:{1}' .format (host , port ))
212
+ if self .has_server :
213
+ ws = make_server (
214
+ host , port , server_class = WSGIServer ,
215
+ handler_class = WebSocketWSGIRequestHandler ,
216
+ app = Mixed (handler_cls = LRSocket )
217
+ )
218
+ ws .initialize_websockets_manager ()
219
+ self .logger .info ("Serving HTTP on {0} port {1}..." .format (host , port ))
220
+ if browser :
221
+ if options ['ipv6' ] or '::' in host :
222
+ server_url = "http://[{0}]:{1}/" .format (host , port )
223
+ else :
224
+ server_url = "http://{0}:{1}/" .format (host , port )
225
+
226
+ self .logger .info ("Opening {0} in the default web browser..." .format (server_url ))
227
+ # Yes, this is racy
228
+ webbrowser .open ('http://{0}:{1}' .format (host , port ))
229
+
230
+ try :
231
+ ws .serve_forever ()
232
+ except KeyboardInterrupt :
233
+ self .logger .info ("Server is shutting down." )
234
+ observer .stop ()
235
+ observer .join ()
236
+ else :
237
+ # Workaround: can’t have nothing running (instant exit)
238
+ # but also can’t join threads (no way to exit)
239
+ # The joys of threading.
240
+ try :
241
+ while True :
242
+ time .sleep (1 )
243
+ except KeyboardInterrupt :
244
+ self .logger .info ("Shutting down." )
245
+ observer .stop ()
246
+ observer .join ()
214
247
215
- try :
216
- ws .serve_forever ()
217
- except KeyboardInterrupt :
218
- self .logger .info ("Server is shutting down." )
219
- observer .stop ()
220
- observer .join ()
221
248
222
249
def do_rebuild (self , event ):
223
250
self .logger .info ('REBUILDING SITE (from {0})' .format (event .src_path ))
0 commit comments