summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xLib/mailbox.py28
-rw-r--r--Lib/test/test_mailbox.py15
-rw-r--r--Misc/NEWS4
3 files changed, 26 insertions, 21 deletions
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index c6b0fa00e3..108d874fe0 100755
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -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:
diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py
index aaf4097122..264e237221 100644
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -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')
diff --git a/Misc/NEWS b/Misc/NEWS
index 221acbb033..8324a055ac 100644
--- 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