mirror of https://github.com/django/django.git
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:
parent
3735f27660
commit
be4390f834
|
@ -45,24 +45,32 @@ except ImportError:
|
||||||
|
|
||||||
RUN_RELOADER = True
|
RUN_RELOADER = True
|
||||||
|
|
||||||
|
_mtimes = {}
|
||||||
|
_win = (sys.platform == "win32")
|
||||||
|
|
||||||
|
def code_changed():
|
||||||
|
global _mtimes, _win
|
||||||
|
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"):
|
||||||
|
filename = filename[:-1]
|
||||||
|
if not os.path.exists(filename):
|
||||||
|
continue # File might be in an egg, so it can't be reloaded.
|
||||||
|
stat = os.stat(filename)
|
||||||
|
mtime = stat.st_mtime
|
||||||
|
if _win:
|
||||||
|
mtime -= stat.st_ctime
|
||||||
|
if filename not in _mtimes:
|
||||||
|
_mtimes[filename] = mtime
|
||||||
|
continue
|
||||||
|
if mtime != _mtimes[filename]:
|
||||||
|
_mtimes = {}
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def reloader_thread():
|
def reloader_thread():
|
||||||
mtimes = {}
|
|
||||||
win = (sys.platform == "win32")
|
|
||||||
while RUN_RELOADER:
|
while RUN_RELOADER:
|
||||||
for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())):
|
if code_changed():
|
||||||
if filename.endswith(".pyc") or filename.endswith("*.pyo"):
|
sys.exit(3) # force reload
|
||||||
filename = filename[:-1]
|
|
||||||
if not os.path.exists(filename):
|
|
||||||
continue # File might be in an egg, so it can't be reloaded.
|
|
||||||
stat = os.stat(filename)
|
|
||||||
mtime = stat.st_mtime
|
|
||||||
if win:
|
|
||||||
mtime -= stat.st_ctime
|
|
||||||
if filename not in mtimes:
|
|
||||||
mtimes[filename] = mtime
|
|
||||||
continue
|
|
||||||
if mtime != mtimes[filename]:
|
|
||||||
sys.exit(3) # force reload
|
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
def restart_with_reloader():
|
def restart_with_reloader():
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue