[PATCH 1/2] Rework undocumented listjoin to create UID sequences

Sebastian Spaeth Sebastian at SSpaeth.de
Mon Aug 22 10:21:11 UTC 2011


This function was badly named and completely undocumented. Rework it to
avoid copying the full UID list using an iterator. Make it possible to
hand it a list of UIDs as strings rather than implicitely relying on the
fact that they are numeric already. Document the code.

The behavior off the function itself remained otherwise unchanged.

Signed-off-by: Sebastian Spaeth <Sebastian at SSpaeth.de>
---
 offlineimap/folder/Gmail.py |    2 +-
 offlineimap/folder/IMAP.py  |    2 +-
 offlineimap/imaputil.py     |   46 ++++++++++++++++++++----------------------
 3 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/offlineimap/folder/Gmail.py b/offlineimap/folder/Gmail.py
index 6cd3446..3ca11cd 100644
--- a/offlineimap/folder/Gmail.py
+++ b/offlineimap/folder/Gmail.py
@@ -54,7 +54,7 @@ class GmailFolder(IMAPFolder):
             try:
                 imapobj.select(self.getfullname())
                 result = imapobj.uid('copy',
-                                     imaputil.listjoin(uidlist),
+                                     imaputil.uid_sequence(uidlist),
                                      self.trash_folder)
                 assert result[0] == 'OK', \
                        "Bad IMAPlib result: %s" % result[0]
diff --git a/offlineimap/folder/IMAP.py b/offlineimap/folder/IMAP.py
index 40eb31c..dec14ae 100644
--- a/offlineimap/folder/IMAP.py
+++ b/offlineimap/folder/IMAP.py
@@ -638,7 +638,7 @@ class IMAPFolder(BaseFolder):
                 self.ui.flagstoreadonly(self, uidlist, flags)
                 return
             r = imapobj.uid('store',
-                            imaputil.listjoin(uidlist),
+                            imaputil.uid_sequence(uidlist),
                             operation + 'FLAGS',
                             imaputil.flagsmaildir2imap(flags))
             assert r[0] == 'OK', 'Error with store: ' + '. '.join(r[1])
diff --git a/offlineimap/imaputil.py b/offlineimap/imaputil.py
index 80a2486..94d6ffc 100644
--- a/offlineimap/imaputil.py
+++ b/offlineimap/imaputil.py
@@ -188,33 +188,31 @@ def flagsmaildir2imap(maildirflaglist):
     retval.sort()
     return '(' + ' '.join(retval) + ')'
 
-def listjoin(list):
-    start = None
-    end = None
-    retval = []
-
-    def getlist(start, end):
+def uid_sequence(uidlist):
+    """Collapse UID lists into shorter sequence sets
+
+    [1,2,3,4,5,10,12,13] will return "1:5,10,12:13".  This function does
+    not sort the list, and only collapses if subsequent entries form a
+    range.
+    :returns: The collapsed UID list as string"""
+    def getrange(start, end):
         if start == end:
             return(str(start))
-        else:
-            return(str(start) + ":" + str(end))
-        
+        return "%s:%s" % (start, end)
 
-    for item in list:
-        if start == None:
-            # First item.
-            start = item
-            end = item
-        elif item == end + 1:
-            # An addition to the list.
-            end = item
-        else:
-            # Here on: starting a new list.
-            retval.append(getlist(start, end))
-            start = item
-            end = item
+    if not len(uidlist): return '' # Empty list, return
+    start, end = None, None
+    retval = []
 
-    if start != None:
-        retval.append(getlist(start, end))
+    for item in iter(uidlist):
+        item = int(item)
+        if start == None:     # First item
+            start, end = item, item
+        elif item == end + 1: # Next item in a range
+            end = item
+        else:                 # Starting a new range
+            retval.append(getrange(start, end))
+            start, end = item, item
 
+    retval.append(getrange(start, end)) # Add final range/item
     return ",".join(retval)
-- 
1.7.4.1




More information about the OfflineIMAP-project mailing list