Skip to content

Commit

Permalink
[2.2.x] Fixed #30523 -- Fixed updating file modification times on see…
Browse files Browse the repository at this point in the history
…n 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 6754bff.

Backport of 480492f from master
  • Loading branch information
orf authored and felixxm committed May 29, 2019
1 parent ace0bec commit 7089502
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
2 changes: 1 addition & 1 deletion django/utils/autoreload.py
Original file line number Diff line number Diff line change
Expand Up @@ -333,9 +333,9 @@ def tick(self):
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)
Expand Down
4 changes: 4 additions & 0 deletions docs/releases/2.2.2.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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`).
10 changes: 10 additions & 0 deletions tests/utils_tests/test_autoreload.py
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,16 @@ def setUp(self):
# 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()), {})
Expand Down

0 comments on commit 7089502

Please sign in to comment.