calibre-server: Make auto reload control separate from --devlop with a new command line option --auto-reload

This commit is contained in:
Kovid Goyal 2010-10-30 23:25:30 -06:00
parent 20e015ed74
commit b597410d84
3 changed files with 34 additions and 25 deletions

View File

@ -6,6 +6,7 @@ __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import subprocess, tempfile, os, time, sys
from threading import RLock
from setup import Command
@ -27,10 +28,11 @@ else:
def process_default(self, event):
name = getattr(event,
'name', None)
if name and os.path.splitext(name)[1].startswith('.py'):
if name and os.path.splitext(name)[1] == '.py':
print
print name, 'changed'
self.command.kill_server()
time.sleep(0.1)
self.command.launch_server()
print self.command.prompt,
sys.stdout.flush()
@ -49,20 +51,23 @@ class Server(Command):
def launch_server(self):
print 'Starting server...\n'
self.rebuild_monocole()
p = subprocess.Popen(['calibre-server', '--develop'],
stderr=subprocess.STDOUT, stdout=self.server_log)
time.sleep(0.2)
if p.poll() is not None:
print 'Starting server failed'
raise SystemExit(1)
return p
with self.lock:
self.rebuild_monocole()
p = subprocess.Popen(['calibre-server', '--develop'],
stderr=subprocess.STDOUT, stdout=self.server_log)
time.sleep(0.2)
if p.poll() is not None:
print 'Starting server failed'
raise SystemExit(1)
return p
def kill_server(self):
while self.server_proc.poll() is None:
self.server_proc.terminate()
time.sleep(0.1)
self.server_proc.kill()
print 'Killing server...\n'
with self.lock:
if self.server_proc.poll() is None:
self.server_proc.terminate()
while self.server_proc.poll() is None:
time.sleep(0.1)
def watch(self):
if wm is not None:
@ -71,6 +76,7 @@ class Server(Command):
self.wdd = wm.add_watch(os.path.abspath('src'), mask, rec=True)
def run(self, opts):
self.lock = RLock()
tdir = tempfile.gettempdir()
logf = os.path.join(tdir, 'calibre-server.log')
self.server_log = open(logf, 'ab')
@ -85,8 +91,7 @@ class Server(Command):
try:
raw_input(self.prompt)
except:
if self.server_proc.poll() is None:
self.server_proc.kill()
self.kill_server()
break
else:
self.kill_server()

View File

@ -118,16 +118,17 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache,
self.set_database(db)
cherrypy.config.update({
'log.screen' : opts.develop,
'engine.autoreload_on' : opts.develop,
'tools.log_headers.on' : opts.develop,
'checker.on' : opts.develop,
'request.show_tracebacks': show_tracebacks,
'server.socket_host' : listen_on,
'server.socket_port' : opts.port,
'server.socket_timeout' : opts.timeout, #seconds
'server.thread_pool' : opts.thread_pool, # number of threads
})
'log.screen' : opts.develop,
'engine.autoreload_on' : getattr(opts,
'auto_reload', False),
'tools.log_headers.on' : opts.develop,
'checker.on' : opts.develop,
'request.show_tracebacks': show_tracebacks,
'server.socket_host' : listen_on,
'server.socket_port' : opts.port,
'server.socket_timeout' : opts.timeout, #seconds
'server.thread_pool' : opts.thread_pool, # number of threads
})
if embedded or wsgi:
cherrypy.config.update({'engine.SIGHUP' : None,
'engine.SIGTERM' : None,})

View File

@ -58,6 +58,9 @@ The OPDS interface is advertised via BonJour automatically.
help=_('Specifies a restriction to be used for this invocation. '
'This option overrides any per-library settings specified'
' in the GUI'))
parser.add_option('--auto-reload', default=False, action='store_true',
help=_('Auto reload server when source code changes. May not'
' work in all environments.'))
return parser