From b597410d84a084da3f7ca7566ec50c62ea6cb812 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 30 Oct 2010 23:25:30 -0600 Subject: [PATCH] calibre-server: Make auto reload control separate from --devlop with a new command line option --auto-reload --- setup/server.py | 35 +++++++++++++++++------------- src/calibre/library/server/base.py | 21 +++++++++--------- src/calibre/library/server/main.py | 3 +++ 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/setup/server.py b/setup/server.py index c48294ac70..98a9e8fa90 100644 --- a/setup/server.py +++ b/setup/server.py @@ -6,6 +6,7 @@ __copyright__ = '2010, Kovid Goyal ' __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() diff --git a/src/calibre/library/server/base.py b/src/calibre/library/server/base.py index c9025a28f8..29636c5659 100644 --- a/src/calibre/library/server/base.py +++ b/src/calibre/library/server/base.py @@ -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,}) diff --git a/src/calibre/library/server/main.py b/src/calibre/library/server/main.py index fbd811a1ab..b7cb3ecf12 100644 --- a/src/calibre/library/server/main.py +++ b/src/calibre/library/server/main.py @@ -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