]> granicus.if.org Git - python/commitdiff
Remove locking of individual message files in MH.pack().
authorAndrew M. Kuchling <amk@amk.ca>
Fri, 17 Nov 2006 16:16:28 +0000 (16:16 +0000)
committerAndrew M. Kuchling <amk@amk.ca>
Fri, 17 Nov 2006 16:16:28 +0000 (16:16 +0000)
[Backport of rev52776 from the trunk.]

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

index c6b0fa00e3c13087f27b72c83c299e05878d200c..108d874fe09ea7c35948c5667b8aece223894da3 100755 (executable)
@@ -1054,27 +1054,13 @@ class MH(Mailbox):
         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:
index aaf40971227e7af15a535e449824eb5e3f16d05c..264e23722137c05f37165704ace5dc155379d6d9 100644 (file)
@@ -887,6 +887,21 @@ class TestMH(TestMailbox):
         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')
 
index 221acbb0332470ea4afe4c4d08c522ce99cf4475..8324a055ac56446ae504fe9ec07d7a49e8aa331c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -158,6 +158,10 @@ Library
   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