]> granicus.if.org Git - python/commitdiff
Merged revisions 76055 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Mon, 2 Nov 2009 11:40:19 +0000 (11:40 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Mon, 2 Nov 2009 11:40:19 +0000 (11:40 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r76055 | antoine.pitrou | 2009-11-02 12:36:51 +0100 (lun., 02 nov. 2009) | 13 lines

  Merged revisions 76034,76054 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r76034 | antoine.pitrou | 2009-11-01 22:29:33 +0100 (dim., 01 nov. 2009) | 3 lines

    This should finally fix #6896. Let's watch the buildbots.
  ........
    r76054 | antoine.pitrou | 2009-11-02 12:34:27 +0100 (lun., 02 nov. 2009) | 3 lines

    Since r76034 was successful, add a NEWS entry for it.
  ........
................

Lib/mailbox.py
Lib/test/test_mailbox.py
Misc/NEWS

index 85e3ab1f8d0a4da5218b3c927f1a915c3e1153af..d9c289b44f7e44959f9db4631581f16b6cc88f41 100755 (executable)
@@ -234,6 +234,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."""
@@ -267,11 +270,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."""
@@ -306,6 +313,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."""
@@ -360,7 +369,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."""
index 66472d9ed46bece188f37c9e44bb058ffa05af53..9a43f8843d9ec1a75489a1a0311ae910cbe66244 100644 (file)
@@ -673,6 +673,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, {})
 
index f85f485ea642e73c82e3c9e4c29b3a79b907545a..d7de60fef67c0c68fc30a880c6af4388f4917c99 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,10 @@ Core and Builtins
 Library
 -------
 
+- Issue #6896: mailbox.Maildir now invalidates its internal cache each time
+  a modification is done through it.  This fixes inconsistencies and test
+  failures on systems with slightly bogus mtime behaviour.
+
 - Issue #6665: Fix fnmatch to properly match filenames with newlines in them.
 
 - Issue #7246 & Issue #7208: getpass now properly flushes input before