From b2790f74d4f38c8b297b7c1cef6875d2378f6fa6 Mon Sep 17 00:00:00 2001 From: Tom Forbes Date: Mon, 27 May 2019 20:14:49 +0100 Subject: [PATCH] Fixed #30479 -- Fixed detecting changes in manage.py by autoreloader when using StatReloader. Regression in c8720e7696ca41f3262d5369365cc1bd72a216ca. --- django/utils/autoreload.py | 10 +++++++++- docs/releases/2.2.2.txt | 3 +++ tests/utils_tests/test_autoreload.py | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py index 7ca0d68fae7..cb7cd1c7256 100644 --- a/django/utils/autoreload.py +++ b/django/utils/autoreload.py @@ -114,7 +114,15 @@ def iter_modules_and_files(modules, extra_files): # During debugging (with PyDev) the 'typing.io' and 'typing.re' objects # are added to sys.modules, however they are types not modules and so # cause issues here. - if not isinstance(module, ModuleType) or getattr(module, '__spec__', None) is None: + if not isinstance(module, ModuleType): + continue + if module.__name__ == '__main__': + # __main__ (usually manage.py) doesn't always have a __spec__ set. + # Handle this by falling back to using __file__, resolved below. + # See https://docs.python.org/reference/import.html#main-spec + sys_file_paths.append(module.__file__) + continue + if getattr(module, '__spec__', None) is None: continue spec = module.__spec__ # Modules could be loaded from places without a concrete location. If diff --git a/docs/releases/2.2.2.txt b/docs/releases/2.2.2.txt index d68338dce21..fc471008442 100644 --- a/docs/releases/2.2.2.txt +++ b/docs/releases/2.2.2.txt @@ -18,3 +18,6 @@ Bugfixes * Fixed a regression in Django 2.2.1 where :class:`~django.contrib.postgres.search.SearchVector` generates SQL with a redundant ``Coalesce`` call (:ticket:`30488`). + +* Fixed a regression in Django 2.2 where auto-reloader doesn't detect changes + in ``manage.py`` file when using ``StatReloader`` (:ticket:`30479`). diff --git a/tests/utils_tests/test_autoreload.py b/tests/utils_tests/test_autoreload.py index 42bcd0a50bf..e7305f6ac90 100644 --- a/tests/utils_tests/test_autoreload.py +++ b/tests/utils_tests/test_autoreload.py @@ -132,6 +132,10 @@ class TestIterModulesAndFiles(SimpleTestCase): del module.__spec__ self.assertEqual(autoreload.iter_modules_and_files((module,), frozenset()), frozenset()) + def test_main_module_is_resolved(self): + main_module = sys.modules['__main__'] + self.assertFileFound(Path(main_module.__file__)) + class TestCommonRoots(SimpleTestCase): def test_common_roots(self):