summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetri Lehtinen <petri@digip.org>2011-11-05 07:45:53 (GMT)
committerPetri Lehtinen <petri@digip.org>2011-11-05 07:46:10 (GMT)
commit8c481b6212d2158bef06eea1f1ed32a015cfc486 (patch)
treec4182a5e11a67bb19a954486bc719c1ec6271406
parentf16a350bafbf617f876bfbbd4b1c8f2636efacff (diff)
parent8c482ee95564f04df01fc856f313ff8c98846718 (diff)
downloadcpython-8c481b6212d2158bef06eea1f1ed32a015cfc486.zip
cpython-8c481b6212d2158bef06eea1f1ed32a015cfc486.tar.gz
cpython-8c481b6212d2158bef06eea1f1ed32a015cfc486.tar.bz2
Fix Maildir initialization so that maildir contents are read correctly.
Closes #13254.
-rw-r--r--Lib/mailbox.py8
-rw-r--r--Lib/test/test_mailbox.py21
-rw-r--r--Misc/NEWS3
3 files changed, 27 insertions, 5 deletions
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index 82d6571..325b9c9 100644
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -273,11 +273,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 8c8920a..17aebc7 100644
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -801,6 +801,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'))
@@ -876,6 +895,8 @@ class TestMaildir(TestMailbox):
self.assertFalse((perms & 0o111)) # 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 a two second granularity)
diff --git a/Misc/NEWS b/Misc/NEWS
index 5c1c4e5..41517d9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -354,6 +354,9 @@ Core and Builtins
Library
-------
+- Issue #13254: Fix Maildir initialization so that maildir contents
+ are read correctly.
+
- Issue #3067: locale.setlocale() now raises TypeError if the second
argument is an invalid iterable. Initial patch by Jyrki Pulliainen.