diff options
| author | Domen Kožar <domen@dev.si> | 2015-10-27 10:58:47 +0100 |
|---|---|---|
| committer | Domen Kožar <domen@dev.si> | 2015-10-27 10:58:47 +0100 |
| commit | 315b19e8ea997f6b10c23dffa65d831aa42f3563 (patch) | |
| tree | 7c3acf86a5070dbd5714247f0e0541897a3132b1 | |
| parent | b2f8c871ae49f2d48c8a990e6a0ee2ed70a27234 (diff) | |
| download | pyramid-315b19e8ea997f6b10c23dffa65d831aa42f3563.tar.gz pyramid-315b19e8ea997f6b10c23dffa65d831aa42f3563.tar.bz2 pyramid-315b19e8ea997f6b10c23dffa65d831aa42f3563.zip | |
pserve: track files with SyntaxError and skip reload
| -rw-r--r-- | pyramid/scripts/pserve.py | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/pyramid/scripts/pserve.py b/pyramid/scripts/pserve.py index 094a811a4..1184d7faa 100644 --- a/pyramid/scripts/pserve.py +++ b/pyramid/scripts/pserve.py @@ -14,6 +14,7 @@ import errno import logging import optparse import os +import py_compile import re import subprocess import sys @@ -820,7 +821,7 @@ class Monitor(object): # pragma: no cover if %errorlevel% == 3 goto repeat or run a monitoring process in Python (``pserve --reload`` does - this). + this). Use the ``watch_file(filename)`` function to cause a reload/restart for other non-Python files (e.g., configuration files). If you have @@ -843,6 +844,7 @@ class Monitor(object): # pragma: no cover self.poll_interval = poll_interval self.extra_files = list(self.global_extra_files) self.instances.append(self) + self.syntax_error_files = [] self.file_callbacks = list(self.global_file_callbacks) def _exit(self): @@ -887,11 +889,28 @@ class Monitor(object): # pragma: no cover continue if filename.endswith('.pyc') and os.path.exists(filename[:-1]): mtime = max(os.stat(filename[:-1]).st_mtime, mtime) + pyc = True + else: + pyc = False if filename not in self.module_mtimes: self.module_mtimes[filename] = mtime elif self.module_mtimes[filename] < mtime: - print("%s changed; reloading..." % filename) - return False + if pyc: + filename = filename[:-1] + # check if a file has syntax errors. If so, track it until it's fixed + for filename_promise in self.syntax_error_files + [filename]: + try: + py_compile.compile(filename_promise, doraise=True) + except py_compile.PyCompileError: + print("%s has a SyntaxError; NOT reloading." % filename_promise) + if filename_promise not in self.syntax_error_files: + self.syntax_error_files.append(filename_promise) + else: + if filename_promise in self.syntax_error_files: + self.syntax_error_files.remove(filename_promise) + if not self.syntax_error_files: + print("%s changed; reloading..." % filename) + return False return True def watch_file(self, cls, filename): |
