Skip to content

Commit e87cadc

Browse files
gh-66515: mailbox.MH now supports folders withou the ".mh_sequences" file (GH-804)
(for example Claws Mail IMAP-cache folders).
1 parent b5dc0f8 commit e87cadc

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

Doc/library/mailbox.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,10 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
644644
:class:`!MH` instances have all of the methods of :class:`Mailbox` in addition
645645
to the following:
646646

647+
.. versionchanged:: 3.13
648+
649+
Supported folders that don't contain a :file:`.mh_sequences` file.
650+
647651

648652
.. method:: list_folders()
649653

Lib/mailbox.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,11 @@ def remove_folder(self, folder):
11981198
def get_sequences(self):
11991199
"""Return a name-to-key-list dictionary to define each sequence."""
12001200
results = {}
1201-
with open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII') as f:
1201+
try:
1202+
f = open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII')
1203+
except FileNotFoundError:
1204+
return results
1205+
with f:
12021206
all_keys = set(self.keys())
12031207
for line in f:
12041208
try:
@@ -1221,9 +1225,8 @@ def get_sequences(self):
12211225

12221226
def set_sequences(self, sequences):
12231227
"""Set sequences using the given name-to-key-list dictionary."""
1224-
f = open(os.path.join(self._path, '.mh_sequences'), 'r+', encoding='ASCII')
1228+
f = open(os.path.join(self._path, '.mh_sequences'), 'w', encoding='ASCII')
12251229
try:
1226-
os.close(os.open(f.name, os.O_WRONLY | os.O_TRUNC))
12271230
for name, keys in sequences.items():
12281231
if len(keys) == 0:
12291232
continue

Lib/test/test_mailbox.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,19 @@ def test_sequences(self):
13471347
self._box.remove(key1)
13481348
self.assertEqual(self._box.get_sequences(), {'flagged':[key0]})
13491349

1350+
self._box.set_sequences({'foo':[key0]})
1351+
self.assertEqual(self._box.get_sequences(), {'foo':[key0]})
1352+
1353+
def test_no_dot_mh_sequences_file(self):
1354+
path = os.path.join(self._path, 'foo.bar')
1355+
os.mkdir(path)
1356+
box = self._factory(path)
1357+
self.assertEqual(os.listdir(path), [])
1358+
self.assertEqual(box.get_sequences(), {})
1359+
self.assertEqual(os.listdir(path), [])
1360+
box.set_sequences({})
1361+
self.assertEqual(os.listdir(path), ['.mh_sequences'])
1362+
13501363
def test_issue2625(self):
13511364
msg0 = mailbox.MHMessage(self._template % 0)
13521365
msg0.add_sequence('foo')
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:class:`mailbox.MH` now supports folders that do not contain a
2+
``.mh_sequences`` file (e.g. Claws Mail IMAP-cache folders). Patch by Serhiy
3+
Storchaka.

0 commit comments

Comments
 (0)