Made auto-reloading for the dev server a little more friendly in the Jython

case. Patch from Leo Soto. Fixed #8147.

In passing, also corrected a typo when reloading .pyo files. Fixed #8157.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@8235 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-08-08 17:54:35 +00:00
parent 3735f27660
commit be4390f834
1 changed files with 46 additions and 21 deletions

View File

@ -45,23 +45,31 @@ except ImportError:
RUN_RELOADER = True RUN_RELOADER = True
def reloader_thread(): _mtimes = {}
mtimes = {} _win = (sys.platform == "win32")
win = (sys.platform == "win32")
while RUN_RELOADER: def code_changed():
global _mtimes, _win
for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())): for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())):
if filename.endswith(".pyc") or filename.endswith("*.pyo"): if filename.endswith(".pyc") or filename.endswith(".pyo"):
filename = filename[:-1] filename = filename[:-1]
if not os.path.exists(filename): if not os.path.exists(filename):
continue # File might be in an egg, so it can't be reloaded. continue # File might be in an egg, so it can't be reloaded.
stat = os.stat(filename) stat = os.stat(filename)
mtime = stat.st_mtime mtime = stat.st_mtime
if win: if _win:
mtime -= stat.st_ctime mtime -= stat.st_ctime
if filename not in mtimes: if filename not in _mtimes:
mtimes[filename] = mtime _mtimes[filename] = mtime
continue continue
if mtime != mtimes[filename]: if mtime != _mtimes[filename]:
_mtimes = {}
return True
return False
def reloader_thread():
while RUN_RELOADER:
if code_changed():
sys.exit(3) # force reload sys.exit(3) # force reload
time.sleep(1) time.sleep(1)
@ -76,12 +84,8 @@ def restart_with_reloader():
if exit_code != 3: if exit_code != 3:
return exit_code return exit_code
def main(main_func, args=None, kwargs=None): def python_reloader(main_func, args, kwargs):
if os.environ.get("RUN_MAIN") == "true": if os.environ.get("RUN_MAIN") == "true":
if args is None:
args = ()
if kwargs is None:
kwargs = {}
thread.start_new_thread(main_func, args, kwargs) thread.start_new_thread(main_func, args, kwargs)
try: try:
reloader_thread() reloader_thread()
@ -92,3 +96,24 @@ def main(main_func, args=None, kwargs=None):
sys.exit(restart_with_reloader()) sys.exit(restart_with_reloader())
except KeyboardInterrupt: except KeyboardInterrupt:
pass pass
def jython_reloader(main_func, args, kwargs):
from _systemrestart import SystemRestart
thread.start_new_thread(main_func, args)
while True:
if code_changed():
raise SystemRestart
time.sleep(1)
def main(main_func, args=None, kwargs=None):
if args is None:
args = ()
if kwargs is None:
kwargs = {}
if sys.platform.startswith('java'):
reloader = jython_reloader
else:
reloader = python_reloader
reloader(main_func, args, kwargs)