[OfflineIMAP] [PATCH] maxage uses the remote folder first to compute min_uid

Nicolas Sebrecht nicolas.s-dev at laposte.net
Tue Nov 8 06:20:06 GMT 2016


  Hi Janna,

I've changed a little change for maxage. Please, review & feedback.

Thanks!

-- 8< --

On each folder scan, we must compute the min_uid. Locally, this is done by
relying on the prefix timestamp in the filenames. If for whatever reason they do
not reflect the Date header of the email, changing maxage leads to undefined
behaviour.

To prevent from this, we rather rely on the remote folder. We assume that the
remotes are more reliable to provide correct sets of UIDs based on dates than we
are.

Github-ref: https://github.com/OfflineIMAP/offlineimap/issues/384
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev at laposte.net>
---
 offlineimap/accounts.py | 30 ++++++++++++++----------------
 1 file changed, 14 insertions(+), 16 deletions(-)

diff --git a/offlineimap/accounts.py b/offlineimap/accounts.py
index 2ebcc59..160492b 100644
--- a/offlineimap/accounts.py
+++ b/offlineimap/accounts.py
@@ -456,23 +456,21 @@ def syncfolder(account, remotefolder, quick):
     def cachemessagelists_upto_date(date):
         """Returns messages with uid > min(uids of messages newer than date)."""
 
-        # Warning: this makes sense only if the cached list is empty.
-        localfolder.cachemessagelist(min_date=date)
-        check_uid_validity(localfolder, remotefolder, statusfolder)
-        # Local messagelist had date restriction applied already. Restrict
-        # sync to messages with UIDs >= min_uid from this list.
-        #
-        # Local messagelist might contain new messages (with uid's < 0).
-        positive_uids = [uid for uid in localfolder.getmessageuidlist() if uid > 0]
-        if len(positive_uids) > 0:
-            remotefolder.cachemessagelist(min_uid=min(positive_uids))
+        remotefolder.cachemessagelist(
+            min_date=time.gmtime(time.mktime(date) + 24*60*60))
+        uids = remotefolder.getmessageuidlist()
+        localfolder.dropmessagelistcache()
+        if len(uids) > 0:
+            localfolder.cachemessagelist(min_uid=min(uids))
         else:
-            # No messages with UID > 0 in range in localfolder.
-            # date restriction was applied with respect to local dates but
-            # remote folder timezone might be different from local, so be
-            # safe and make sure the range isn't bigger than in local.
-            remotefolder.cachemessagelist(
-                min_date=time.gmtime(time.mktime(date) + 24*60*60))
+            # Remote folder UIDs list is empty for the given range. We still
+            # might have valid local UIDs for this range (e.g.: restored from
+            # backup).
+            localfolder.cachemessagelist(min_date=date)
+            uids = localfolder.getmessageuidlist()
+            if len(uids) > 0:
+                # Update the remote cache list for this new min(uids).
+                remotefolder.cachemessagelist(min_uid=min(uids))
 
     def cachemessagelists_startdate(new, partial, date):
         """Retrieve messagelists when startdate has been set for
-- 
2.10.0




More information about the OfflineIMAP-project mailing list