From: Petri Lehtinen Date: Sat, 5 Nov 2011 07:50:37 +0000 (+0200) Subject: Fix Maildir initialization so that maildir contents are read correctly. X-Git-Tag: v2.7.3rc1~327 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=49aa72ed4c48fb613893388b470aa5b5464c1952;p=python Fix Maildir initialization so that maildir contents are read correctly. Closes #13254. --- diff --git a/Lib/mailbox.py b/Lib/mailbox.py index a9d9c282ea..0efd7434fe 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -247,11 +247,9 @@ class Maildir(Mailbox): else: raise NoSuchMailboxError(self._path) self._toc = {} - self._toc_mtimes = {} - for subdir in ('cur', 'new'): - self._toc_mtimes[subdir] = os.path.getmtime(self._paths[subdir]) - self._last_read = time.time() # Records last time we read cur/new - self._skewfactor = 0.1 # Adjust if os/fs clocks are skewing + self._toc_mtimes = {'cur': 0, 'new': 0} + self._last_read = 0 # Records last time we read cur/new + self._skewfactor = 0.1 # Adjust if os/fs clocks are skewing def add(self, message): """Add message and return assigned key.""" diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index 112497993c..97d304758e 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -683,6 +683,25 @@ class TestMaildir(TestMailbox): key1: os.path.join('new', key1), key2: os.path.join('new', key2)}) + def test_refresh_after_safety_period(self): + # Issue #13254: Call _refresh after the "file system safety + # period" of 2 seconds has passed; _toc should still be + # updated because this is the first call to _refresh. + key0 = self._box.add(self._template % 0) + key1 = self._box.add(self._template % 1) + + self._box = self._factory(self._path) + self.assertEqual(self._box._toc, {}) + + # Emulate sleeping. Instead of sleeping for 2 seconds, use the + # skew factor to make _refresh think that the filesystem + # safety period has passed and re-reading the _toc is only + # required if mtimes differ. + self._box._skewfactor = -2 + + self._box._refresh() + self.assertEqual(sorted(self._box._toc.keys()), sorted([key0, key1])) + def test_lookup(self): # Look up message subpaths in the TOC self.assertRaises(KeyError, lambda: self._box._lookup('foo')) @@ -758,6 +777,8 @@ class TestMaildir(TestMailbox): self.assertFalse((perms & 0111)) # Execute bits should all be off. def test_reread(self): + # Do an initial unconditional refresh + self._box._refresh() # Put the last modified times more than two seconds into the past # (because mtime may have only a two second granularity). diff --git a/Misc/NEWS b/Misc/NEWS index 2701b87013..f55fe04b9c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -74,6 +74,9 @@ Core and Builtins Library ------- +- Issue #13254: Fix Maildir initialization so that maildir contents + are read correctly. + - Issue #13140: Fix the daemon_threads attribute of ThreadingMixIn. - Issue #2892: preserve iterparse events in case of SyntaxError.