From 7089502b98f80e8dc1c8f6e85fb0620809aec30e Mon Sep 17 00:00:00 2001 From: Tom Forbes Date: Mon, 27 May 2019 12:50:05 +0100 Subject: [PATCH] [2.2.x] Fixed #30523 -- Fixed updating file modification times on seen files in auto-reloader when using StatReloader. Previously we updated the file mtimes if the file has not been seen before - i.e on the first iteration of the loop. If the mtime has been changed we triggered the notify_file_changed() method which in all cases except the translations will result in the process being terminated. To be strictly correct we need to update the mtime for either branch of the conditional. Regression in 6754bffa2b2df15a741008aa611c1bb0e8dff22b. Backport of 480492fe70b0bb7df61c00854dc8535c9d21ba64 from master --- django/utils/autoreload.py | 2 +- docs/releases/2.2.2.txt | 4 ++++ tests/utils_tests/test_autoreload.py | 10 ++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py index 35952d5631..c959cd04ca 100644 --- a/django/utils/autoreload.py +++ b/django/utils/autoreload.py @@ -333,9 +333,9 @@ class StatReloader(BaseReloader): while True: for filepath, mtime in self.snapshot_files(): old_time = mtimes.get(filepath) + mtimes[filepath] = mtime if old_time is None: logger.debug('File %s first seen with mtime %s', filepath, mtime) - mtimes[filepath] = mtime continue elif mtime > old_time: logger.debug('File %s previous mtime: %s, current mtime: %s', filepath, old_time, mtime) diff --git a/docs/releases/2.2.2.txt b/docs/releases/2.2.2.txt index e95fa343fc..bcaac9f15d 100644 --- a/docs/releases/2.2.2.txt +++ b/docs/releases/2.2.2.txt @@ -28,3 +28,7 @@ Bugfixes * Fixed a regression in Django 2.2 that caused a crash of auto-reloader when an exception with custom signature is raised (:ticket:`30516`). + +* Fixed a regression in Django 2.2.1 where auto-reloader unnecessarily reloads + translation files multiple times when using ``StatReloader`` + (:ticket:`30523`). diff --git a/tests/utils_tests/test_autoreload.py b/tests/utils_tests/test_autoreload.py index 82f7287fa8..56b03d40a6 100644 --- a/tests/utils_tests/test_autoreload.py +++ b/tests/utils_tests/test_autoreload.py @@ -656,6 +656,16 @@ class StatReloaderTests(ReloaderTests, IntegrationTests): # Shorten the sleep time to speed up tests. self.reloader.SLEEP_TIME = 0.01 + @mock.patch('django.utils.autoreload.StatReloader.notify_file_changed') + def test_tick_does_not_trigger_twice(self, mock_notify_file_changed): + with mock.patch.object(self.reloader, 'watched_files', return_value=[self.existing_file]): + ticker = self.reloader.tick() + next(ticker) + self.increment_mtime(self.existing_file) + next(ticker) + next(ticker) + self.assertEqual(mock_notify_file_changed.call_count, 1) + def test_snapshot_files_ignores_missing_files(self): with mock.patch.object(self.reloader, 'watched_files', return_value=[self.nonexistent_file]): self.assertEqual(dict(self.reloader.snapshot_files()), {})