diff --git a/Changelog.draft.rst b/Changelog.draft.rst index 76a0ea3..bf0b460 100644 --- a/Changelog.draft.rst +++ b/Changelog.draft.rst @@ -10,11 +10,24 @@ others. `WIP (coming releases)` ======================= +* Gmail "realdelete" is considered harmful and has the potential for data loss. Analysis at http://article.gmane.org/gmane.mail.imap.offlineimap.general/5265 +Warnings were added to offlineimap.conf + New Features ------------ Changes ------- +* Rather than to write out the nametrans'lated folder names for mbnames, + we now write out the local untransformed box names. This is generally + what we want. This became relevant since we support nametrans rules on + the local side since only a short time. Reported by Paul Collignan. + +* Some sanity checks and improved error messages. + +* Revert 6.5.1.1 change to use public imaplib2 function, it was reported to + not always work. + Bug Fixes --------- diff --git a/Changelog.rst b/Changelog.rst index 59550b9..f7a7dd3 100644 --- a/Changelog.rst +++ b/Changelog.rst @@ -11,6 +11,18 @@ ChangeLog on releases. And because I'm lazy, it will also be used as a draft for the releases announces. +OfflineIMAP v6.5.2-rc1 (2012-01-09) +=================================== +Commits v6.5.1.1 - v6.5.2-rc1: +note: Proper Changelog still in Changelog-draft.rst +d72bb88 Improve error message +3284e01 Revert "use .response() rather _get_untagged_response()" +81f194a mbnames should write out local and not nametransformed box names +7184ec2 Sanity check return value of UIDVALIDTY response +50de217 Allow to pass 'force' arg to selectro() to enforce a new select +ed71805 Changelog entry about "realdelete" option +0a275b9 Add scary warnings about "realdelete" option + OfflineIMAP v6.5.1.2 (2012-01-07) - "Baby steps" ================================================ diff --git a/offlineimap/__init__.py b/offlineimap/__init__.py index 2bf4637..99fc2b0 100644 --- a/offlineimap/__init__.py +++ b/offlineimap/__init__.py @@ -1,7 +1,7 @@ __all__ = ['OfflineImap'] __productname__ = 'OfflineIMAP' -__version__ = "6.5.1.2" +__version__ = "6.5.2-rc1" __copyright__ = "Copyright 2002-2012 John Goerzen & contributors" __author__ = "John Goerzen" __author_email__= "john@complete.org" diff --git a/offlineimap/accounts.py b/offlineimap/accounts.py index 4644604..fc2687f 100644 --- a/offlineimap/accounts.py +++ b/offlineimap/accounts.py @@ -372,7 +372,7 @@ def syncfolder(account, remotefolder, quick): % localfolder) return # Write the mailboxes - mbnames.add(account.name, localfolder.getvisiblename()) + mbnames.add(account.name, localfolder.getname()) # Load status folder. statusfolder = statusrepos.getfolder(remotefolder.getvisiblename().\ diff --git a/offlineimap/folder/IMAP.py b/offlineimap/folder/IMAP.py index 93f0c56..75c731c 100644 --- a/offlineimap/folder/IMAP.py +++ b/offlineimap/folder/IMAP.py @@ -42,19 +42,19 @@ class IMAPFolder(BaseFolder): self.randomgenerator = random.Random() #self.ui is set in BaseFolder - def selectro(self, imapobj): + def selectro(self, imapobj, force = False): """Select this folder when we do not need write access. Prefer SELECT to EXAMINE if we can, since some servers (Courier) do not stabilize UID validity until the folder is selected. .. todo: Still valid? Needs verification - + :param: Enforce new SELECT even if we are on that folder already. :returns: raises :exc:`OfflineImapError` severity FOLDER on error""" try: - imapobj.select(self.getfullname()) + imapobj.select(self.getfullname(), force = force) except imapobj.readonly: - imapobj.select(self.getfullname(), readonly = True) + imapobj.select(self.getfullname(), readonly = True, force = force) def suggeststhreads(self): return 1 @@ -70,8 +70,12 @@ class IMAPFolder(BaseFolder): try: # SELECT receives UIDVALIDITY response self.selectro(imapobj) - typ, uidval = imapobj.response('UIDVALIDITY') - return long(uidval[0]) + # note: we would want to use .response() here but that + # often seems to return [None], even though we have + # data. TODO + uidval = imapobj._get_untagged_response('UIDVALIDITY') + assert uidval != [None], "response('UIDVALIDITY') returned [None]!" + return long(uidval[-1]) finally: self.imapserver.releaseconnection(imapobj) @@ -566,8 +570,11 @@ class IMAPFolder(BaseFolder): if use_uidplus or imapobj._get_untagged_response('APPENDUID', True): # get new UID from the APPENDUID response, it could look # like OK [APPENDUID 38505 3955] APPEND completed with - # 38505 bein folder UIDvalidity and 3955 the new UID - typ, resp = imapobj.response('APPENDUID') + # 38505 bein folder UIDvalidity and 3955 the new UID. + # note: we would want to use .response() here but that + # often seems to return [None], even though we have + # data. TODO + resp = imapobj._get_untagged_response('APPENDUID') if resp == [None]: self.ui.warn("Server supports UIDPLUS but got no APPENDUID " "appending a message.") diff --git a/offlineimap/folder/UIDMaps.py b/offlineimap/folder/UIDMaps.py index 1a6283c..ac0a9b4 100644 --- a/offlineimap/folder/UIDMaps.py +++ b/offlineimap/folder/UIDMaps.py @@ -191,7 +191,8 @@ class MappedIMAPFolder(IMAPFolder): newluid = self._mb.savemessage(-1, content, flags, rtime) if newluid < 1: - raise ValueError("Backend could not find uid for message") + raise ValueError("Backend could not find uid for message, returned " + "%s" % newluid) self.maplock.acquire() try: self.diskl2r[newluid] = uid diff --git a/offlineimap/imaplibutil.py b/offlineimap/imaplibutil.py index c9a7715..b4345fa 100644 --- a/offlineimap/imaplibutil.py +++ b/offlineimap/imaplibutil.py @@ -40,7 +40,7 @@ class UsefulIMAPMixIn(object): return self.mailbox return None - def select(self, mailbox='INBOX', readonly=False, force = 0): + def select(self, mailbox='INBOX', readonly=False, force = False): """Selects a mailbox on the IMAP server :returns: 'OK' on success, nothing if the folder was already