summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-11-01 21:29:33 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-11-01 21:29:33 (GMT)
commite4c6b16b37937ccf9335a8b2a51adfd4ad0d7e7b (patch)
tree606a978ebf10eaf2a01fa43ee6299c9f2d77a9e0 /Lib
parent8844153d7f3c5ff00e844f674cd639af4ab8addc (diff)
downloadcpython-e4c6b16b37937ccf9335a8b2a51adfd4ad0d7e7b.zip
cpython-e4c6b16b37937ccf9335a8b2a51adfd4ad0d7e7b.tar.gz
cpython-e4c6b16b37937ccf9335a8b2a51adfd4ad0d7e7b.tar.bz2
This should finally fix #6896. Let's watch the buildbots.
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/mailbox.py13
-rw-r--r--Lib/test/test_mailbox.py3
2 files changed, 15 insertions, 1 deletions
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index 305b2d2..74359b7 100755
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -238,6 +238,9 @@ class Maildir(Mailbox):
raise NoSuchMailboxError(self._path)
self._toc = {}
self._last_read = None # Records last time we read cur/new
+ # NOTE: we manually invalidate _last_read each time we do any
+ # modifications ourselves, otherwise we might get tripped up by
+ # bogus mtime behaviour on some systems (see issue #6896).
def add(self, message):
"""Add message and return assigned key."""
@@ -271,11 +274,15 @@ class Maildir(Mailbox):
raise
if isinstance(message, MaildirMessage):
os.utime(dest, (os.path.getatime(dest), message.get_date()))
+ # Invalidate cached toc
+ self._last_read = None
return uniq
def remove(self, key):
"""Remove the keyed message; raise KeyError if it doesn't exist."""
os.remove(os.path.join(self._path, self._lookup(key)))
+ # Invalidate cached toc (only on success)
+ self._last_read = None
def discard(self, key):
"""If the keyed message exists, remove it."""
@@ -310,6 +317,8 @@ class Maildir(Mailbox):
if isinstance(message, MaildirMessage):
os.utime(new_path, (os.path.getatime(new_path),
message.get_date()))
+ # Invalidate cached toc
+ self._last_read = None
def get_message(self, key):
"""Return a Message representation or raise a KeyError."""
@@ -364,7 +373,9 @@ class Maildir(Mailbox):
def flush(self):
"""Write any pending changes to disk."""
- return # Maildir changes are always written immediately.
+ # Maildir changes are always written immediately, so there's nothing
+ # to do except invalidate our cached toc.
+ self._last_read = None
def lock(self):
"""Lock the mailbox."""
diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py
index 2abb354..548850a 100644
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -684,6 +684,9 @@ class TestMaildir(TestMailbox):
self.assertEqual(self._box._lookup(key0), os.path.join('new', key0))
os.remove(os.path.join(self._path, 'new', key0))
self.assertEqual(self._box._toc, {key0: os.path.join('new', key0)})
+ # Be sure that the TOC is read back from disk (see issue #6896
+ # about bad mtime behaviour on some systems).
+ self._box.flush()
self.assertRaises(KeyError, lambda: self._box._lookup(key0))
self.assertEqual(self._box._toc, {})