diff options
| author | Michael Merickel <michael@merickel.org> | 2015-11-13 13:02:49 -0600 |
|---|---|---|
| committer | Michael Merickel <michael@merickel.org> | 2015-11-13 13:02:49 -0600 |
| commit | e3fda6f679bbbe3af3f98fa5987ccc282308dac4 (patch) | |
| tree | f0b829bf86c3e6ee40e4374de05e7b31994f3df8 | |
| parent | 315b19e8ea997f6b10c23dffa65d831aa42f3563 (diff) | |
| parent | 93e886be234fd187c4ddc5e376fd6c51060500a7 (diff) | |
| download | pyramid-e3fda6f679bbbe3af3f98fa5987ccc282308dac4.tar.gz pyramid-e3fda6f679bbbe3af3f98fa5987ccc282308dac4.tar.bz2 pyramid-e3fda6f679bbbe3af3f98fa5987ccc282308dac4.zip | |
Merge pull request #2049 from Pylons/fix/pserve-reload-verbosity
avoid spamming by outputting state only once when a file changes
| -rw-r--r-- | pyramid/scripts/pserve.py | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/pyramid/scripts/pserve.py b/pyramid/scripts/pserve.py index 1184d7faa..1e580d897 100644 --- a/pyramid/scripts/pserve.py +++ b/pyramid/scripts/pserve.py @@ -18,6 +18,7 @@ import py_compile import re import subprocess import sys +import tempfile import textwrap import threading import time @@ -844,10 +845,19 @@ 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.syntax_error_files = set() + self.pending_reload = False self.file_callbacks = list(self.global_file_callbacks) + temp_pyc_fp = tempfile.NamedTemporaryFile(delete=False) + self.temp_pyc = temp_pyc_fp.name + temp_pyc_fp.close() def _exit(self): + try: + os.unlink(self.temp_pyc) + except IOError: + # not worried if the tempfile can't be removed + pass # use os._exit() here and not sys.exit() since within a # thread sys.exit() just closes the given thread and # won't kill the process; note os._exit does not call @@ -878,6 +888,7 @@ class Monitor(object): # pragma: no cover continue if filename is not None: filenames.append(filename) + new_changes = False for filename in filenames: try: stat = os.stat(filename) @@ -892,25 +903,39 @@ class Monitor(object): # pragma: no cover pyc = True else: pyc = False - if filename not in self.module_mtimes: - self.module_mtimes[filename] = mtime - elif self.module_mtimes[filename] < mtime: + old_mtime = self.module_mtimes.get(filename) + self.module_mtimes[filename] = mtime + if old_mtime is not None and old_mtime < mtime: + new_changes = True 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 + is_valid = True + if filename.endswith('.py'): + is_valid = self.check_syntax(filename) + if is_valid: + print("%s changed ..." % filename) + if new_changes: + self.pending_reload = True + if self.syntax_error_files: + for filename in sorted(self.syntax_error_files): + print("%s has a SyntaxError; NOT reloading." % filename) + if self.pending_reload and not self.syntax_error_files: + self.pending_reload = False + return False + return True + + def check_syntax(self, filename): + # check if a file has syntax errors. + # If so, track it until it's fixed. + try: + py_compile.compile(filename, cfile=self.temp_pyc, doraise=True) + except py_compile.PyCompileError as ex: + print(ex.msg) + self.syntax_error_files.add(filename) + return False + else: + if filename in self.syntax_error_files: + self.syntax_error_files.remove(filename) return True def watch_file(self, cls, filename): |
