[PATCH] imaputil: make uid_sequence sort all items to improve collapsing

Sebastian Spaeth Sebastian at SSpaeth.de
Tue Aug 30 08:22:33 BST 2011

To preserve previous behavior and save a few CPU cycles, we were not
sorting UID lists and only collapsed them if they were alreay sorted.
Vincent Beffara <vbeffara at ens-lyon.fr> pointed out that this is not
always the case and unsorted lists lead to non-optimally collapsing.

Force lists to numeric types and sort them before collapsing.

Signed-off-by: Sebastian Spaeth <Sebastian at SSpaeth.de>
Vincent, is that what you had in mind?

 offlineimap/imaputil.py |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/offlineimap/imaputil.py b/offlineimap/imaputil.py
index 94d6ffc..e628df5 100644
--- a/offlineimap/imaputil.py
+++ b/offlineimap/imaputil.py
@@ -191,9 +191,10 @@ def flagsmaildir2imap(maildirflaglist):
 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.
+    [1,2,3,4,5,10,12,13] will return "1:5,10,12:13".  This function
+    converts items to numeric type and sorts the list to always produce
+    the minimal collapsed set.
     :returns: The collapsed UID list as string"""
     def getrange(start, end):
         if start == end:
@@ -203,9 +204,10 @@ def uid_sequence(uidlist):
     if not len(uidlist): return '' # Empty list, return
     start, end = None, None
     retval = []
+    # Force items to be longs and sort them
+    sorted_uids = sorted(map(int, uidlist))
-    for item in iter(uidlist):
-        item = int(item)
+    for item in iter(sorted_uids):
         if start == None:     # First item
             start, end = item, item
         elif item == end + 1: # Next item in a range

More information about the OfflineIMAP-project mailing list