[Python-checkins] r52778 - in python/branches/release25-maint: Lib/mailbox.py Lib/test/test_mailbox.py Misc/NEWS

andrew.kuchling python-checkins at python.org
Fri Nov 17 17:16:35 CET 2006


Author: andrew.kuchling
Date: Fri Nov 17 17:16:28 2006
New Revision: 52778

Modified:
   python/branches/release25-maint/Lib/mailbox.py
   python/branches/release25-maint/Lib/test/test_mailbox.py
   python/branches/release25-maint/Misc/NEWS
Log:
Remove locking of individual message files in MH.pack().

[Backport of rev52776 from the trunk.]


Modified: python/branches/release25-maint/Lib/mailbox.py
==============================================================================
--- python/branches/release25-maint/Lib/mailbox.py	(original)
+++ python/branches/release25-maint/Lib/mailbox.py	Fri Nov 17 17:16:28 2006
@@ -1054,27 +1054,13 @@
         for key in self.iterkeys():
             if key - 1 != prev:
                 changes.append((key, prev + 1))
-                f = open(os.path.join(self._path, str(key)), 'r+')
-                try:
-                    if self._locked:
-                        _lock_file(f)
-                    try:
-                        if hasattr(os, 'link'):
-                            os.link(os.path.join(self._path, str(key)),
-                                    os.path.join(self._path, str(prev + 1)))
-                            if sys.platform == 'os2emx':
-                                # cannot unlink an open file on OS/2
-                                f.close()
-                            os.unlink(os.path.join(self._path, str(key)))
-                        else:
-                            f.close()
-                            os.rename(os.path.join(self._path, str(key)),
-                                      os.path.join(self._path, str(prev + 1)))
-                    finally:
-                        if self._locked:
-                            _unlock_file(f)
-                finally:
-                    f.close()
+                if hasattr(os, 'link'):
+                    os.link(os.path.join(self._path, str(key)),
+                            os.path.join(self._path, str(prev + 1)))
+                    os.unlink(os.path.join(self._path, str(key)))
+                else:
+                    os.rename(os.path.join(self._path, str(key)),
+                              os.path.join(self._path, str(prev + 1)))
             prev += 1
         self._next_key = prev + 1
         if len(changes) == 0:

Modified: python/branches/release25-maint/Lib/test/test_mailbox.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_mailbox.py	(original)
+++ python/branches/release25-maint/Lib/test/test_mailbox.py	Fri Nov 17 17:16:28 2006
@@ -887,6 +887,21 @@
         self.assert_(self._box.get_sequences() ==
                      {'foo':[1, 2, 3], 'unseen':[1], 'bar':[3], 'replied':[3]})
 
+        # Test case for packing while holding the mailbox locked.
+        key0 = self._box.add(msg1)
+        key1 = self._box.add(msg1)
+        key2 = self._box.add(msg1)
+        key3 = self._box.add(msg1)
+
+        self._box.remove(key0)
+        self._box.remove(key2)
+        self._box.lock()
+        self._box.pack()
+        self._box.unlock()
+        self.assert_(self._box.get_sequences() ==
+                     {'foo':[1, 2, 3, 4, 5],
+                      'unseen':[1], 'bar':[3], 'replied':[3]})
+        
     def _get_lock_path(self):
         return os.path.join(self._path, '.mh_sequences.lock')
 

Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Fri Nov 17 17:16:28 2006
@@ -158,6 +158,10 @@
   been physically written to disk after calling .flush() or
   .close(). (Patch by David Watson.)
 
+- mailbox.py: Change MH.pack() to not lock individual message files; this
+  wasn't consistent with existing implementations of message packing, and
+  was buggy on some platforms.
+  
 - Bug #1576241: fix functools.wraps() to work on built-in functions.
 
 - Patch #1574068: fix urllib/urllib2 to not insert line breaks when


More information about the Python-checkins mailing list