diff options
| author | Nikolaus Schulz <microschulz@web.de> | 2007-10-22 22:03:44 +0000 | 
|---|---|---|
| committer | Nikolaus Schulz <microschulz@web.de> | 2007-10-22 22:03:44 +0000 | 
| commit | 255a4759782101812e807935c61e42881a9fae26 (patch) | |
| tree | 37443554664fdc84853cef62009b663a5946bfba | |
| parent | c67a75c2f7db0651c32c4ddd2fdc03ebdd42207a (diff) | |
| download | archivemail-255a4759782101812e807935c61e42881a9fae26.tar.gz archivemail-255a4759782101812e807935c61e42881a9fae26.tar.bz2 archivemail-255a4759782101812e807935c61e42881a9fae26.zip  | |
Use a wrapper around rfc822.Message.fp to find the filename for Maildir/MH
emails.  Python 2.5 broke backward compatibility for Maildirs. :-/
Closes: #1670422
| -rw-r--r-- | CHANGELOG | 4 | ||||
| -rwxr-xr-x | archivemail.py | 38 | 
2 files changed, 34 insertions, 8 deletions
@@ -1,3 +1,7 @@ +Version 0.7.1   - UNRELEASED + +  * Fixed incompatibility with Python 2.5 which broke Maildir handling. +    Closes: #1670422  Version 0.7.0   - 2 November 2006    * Fixed long options --filter-append and --pwfile to accept their arguments. diff --git a/archivemail.py b/archivemail.py index e27aaec..6e64e84 100755 --- a/archivemail.py +++ b/archivemail.py @@ -779,7 +779,7 @@ def guess_delivery_time(message):      # the headers have no valid dates -- last resort, try the file timestamp      # this will not work for mbox mailboxes      try: -        file_name = message.fp.name +        file_name = get_filename(message)      except AttributeError:          # we are looking at a 'mbox' mailbox - argh!           # Just return the current time - this will never get archived :( @@ -788,7 +788,7 @@ def guess_delivery_time(message):      if not os.path.isfile(file_name):          unexpected_error("mailbox file name '%s' has gone missing" % \              file_name)     -    time_message = os.path.getmtime(message.fp.name) +    time_message = os.path.getmtime(file_name)      vprint("using valid time found from '%s' last-modification time" % \          file_name)      return time_message @@ -806,7 +806,8 @@ def add_status_headers(message):      """      status = ""      x_status = "" -    match = re.search(":2,(.+)$", message.fp.name) +    file_name = get_filename(message) +    match = re.search(":2,(.+)$", file_name)      if match:          flags = match.group(1)          for flag in flags:  @@ -825,7 +826,7 @@ def add_status_headers(message):      # files in the maildir 'cur' directory are no longer new,      # they are the same as messages with 'Status: O' headers in mbox -    last_dir = os.path.basename(os.path.dirname(message.fp.name)) +    last_dir = os.path.basename(os.path.dirname(file_name))      if last_dir == "cur":          status = status + "O"  @@ -881,7 +882,7 @@ def is_flagged(message):          return 1      file_name = None      try: -        file_name = message.fp.name +        file_name = get_filename(message)      except AttributeError:          pass      # maildir mailboxes use the filename suffix to indicate flagged status @@ -901,7 +902,7 @@ def is_unread(message):          return 0      file_name = None      try: -        file_name = message.fp.name +        file_name = get_filename(message)      except AttributeError:          pass      # maildir mailboxes use the filename suffix to indicate read status @@ -918,7 +919,7 @@ def sizeof_message(message):      file_name = None      message_size = None      try: -        file_name = message.fp.name +        file_name = get_filename(message)      except AttributeError:          pass      if file_name: @@ -1269,7 +1270,7 @@ def _archive_dir(mailbox_name, final_archive_name, type):                      if type == "maildir":                          add_status_headers(msg)                      archive.write(msg) -            if not options.dry_run: delete_queue.append(msg.fp.name)  +            if not options.dry_run: delete_queue.append(get_filename(msg))           else:              vprint("decision: retain message")          msg = original.next() @@ -1463,6 +1464,27 @@ def nice_size_str(size):      if kb >= 1.0: return str(round(kb)) + 'kB'      return str(size) + 'B' +def get_filename(msg):  +    """If the given rfc822.Message can be identified with a file (no mbox), +    return the filename, otherwise raise AttributeError.""" +    try: +        return msg.fp.name +    except AttributeError: +        # Ugh, that's ugly.  msg.fp is not a plain file, it may be an  +        # instance of  +        # a. mailbox._Subfile  +        #    (msg from mailbox.UnixMailbox, Python <= 2.4)  +        #    File object is msg.fp.fp, we don't want that +        # b. mailbox._PartialFile, subclass of mailbox._ProxyFile +        #    (msg from mailbox.UnixMailbox, Python >= 2.5) +        #    File object is msg.fp._file, we don't want that +        # c. mailbox._ProxyFile +        #    (msg from mailbox.Maildir, Python >= 2.5) +        #    File object is msg.fp._file, we do want that. +        if msg.fp.__class__ == mailbox._ProxyFile:  +            assert(hasattr(mailbox, "_PartialFile")) +            return msg.fp._file.name +        raise  # this is where it all happens, folks  if __name__ == '__main__':  | 
