This fixes test suite failures with Python 2.7.
Starting with Python 2.7, gzip.GzipFile is subclassing io.IOBase.
The seek() method of io.IOBase differs from file.seek() and the old
gzip.GzipFile.seek() in that it returns the new file position, not None.
And in Python 2.7, gzip.GzipFile.tell() is inherited from
io.IOBase.tell(), which is implemented using its seek() method.
FixedGzipFile subclasses gzip.GzipFile and overrides seek(); therefore,
this method need be adapted for this change in the interface.
Closes: #3314293.
The LIST reply handling in imap_find_mailboxes() was buggy in several
ways. It expected a non-NIL hierarchy delimiter, and it assumed that the
mailbox name in a LIST reply is always quoted; but it can be an astring, a
quoted string, or a literal (see RFC 3501 for the definitions of these
tokens). These variants should now all be interpreted correctly.
In addition, quoted mailbox names are now handled more strictly to the
letter of the RFC; this only affects mailbox names containing a " or a
backslash, though.
When archiving a mailbox with leading dots in the name and no archive name
prefix specified, strip the dots off the archive name. This is targeting
Maildir++ subfolders.
Technically, this works just like the --suffix option. This commit also
updates the manpage accordingly.
Currently, the prefix is not checked for slashes, so it could contain path
components. (The same applies for the suffix, btw). Since the expanded
string is prepended to the archive base name, this can be used to dynamically
configure the archive directory, depending on the archive cutoff date. I'm
not sure if this can be considered a reasonable feature, though.
IMAP servers (Dovecot and UW-IMAP at least) may store mailbox meta data for
mboxes in a pseudo message. Such messages are now detected and never archived.
This commit includes a test case in the test suite.
On Unix, most scripts don't come with a file extension, it's not needed, and
we distribute the script as "archivemail" anyway. And most importantly, I
like it better without the extension. :)
With a little trick we can still load the script as a module from the test
suite.