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

View File

@ -118,16 +118,17 @@ class LibraryServer(ContentServer, MobileServer, XMLServer, OPDSServer, Cache,
self.set_database(db) self.set_database(db)
cherrypy.config.update({ cherrypy.config.update({
'log.screen' : opts.develop, 'log.screen' : opts.develop,
'engine.autoreload_on' : opts.develop, 'engine.autoreload_on' : getattr(opts,
'tools.log_headers.on' : opts.develop, 'auto_reload', False),
'checker.on' : opts.develop, 'tools.log_headers.on' : opts.develop,
'request.show_tracebacks': show_tracebacks, 'checker.on' : opts.develop,
'server.socket_host' : listen_on, 'request.show_tracebacks': show_tracebacks,
'server.socket_port' : opts.port, 'server.socket_host' : listen_on,
'server.socket_timeout' : opts.timeout, #seconds 'server.socket_port' : opts.port,
'server.thread_pool' : opts.thread_pool, # number of threads 'server.socket_timeout' : opts.timeout, #seconds
}) 'server.thread_pool' : opts.thread_pool, # number of threads
})
if embedded or wsgi: if embedded or wsgi:
cherrypy.config.update({'engine.SIGHUP' : None, cherrypy.config.update({'engine.SIGHUP' : None,
'engine.SIGTERM' : 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. ' help=_('Specifies a restriction to be used for this invocation. '
'This option overrides any per-library settings specified' 'This option overrides any per-library settings specified'
' in the GUI')) ' 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 return parser