]> granicus.if.org Git - neomutt/commitdiff
Sort by UID so sequence ranges in UID STORE make sense
authorPietro Cerutti <gahr@gahr.ch>
Tue, 8 Jan 2019 10:22:31 +0000 (10:22 +0000)
committerPietro Cerutti <gahr@gahr.ch>
Tue, 8 Jan 2019 11:52:34 +0000 (11:52 +0000)
This fixes the use case where a bunch of messages are tagged, removed,
then the mailbox is sync'd in a thread view. In this case, the sequence
number given by email->index is not monotonic, which results in weird
sequence sets being passed to UID STORE.

imap/imap.c

index 260fd859d1ecfce31704391ac10ea9b3f2c37762..bba5a764c9500a9a2418363261ee38c326b07c4d 100644 (file)
@@ -979,6 +979,13 @@ bool imap_has_flag(struct ListHead *flag_list, const char *flag)
   return false;
 }
 
+static int compare_uid(const void *a, const void *b)
+{
+  struct Email **ea = (struct Email **) a;
+  struct Email **eb = (struct Email **) b;
+  return imap_edata_get(*ea)->uid - imap_edata_get(*eb)->uid;
+}
+
 /**
  * imap_exec_msgset - Prepare commands for all messages matching conditions
  * @param m       Selected Imap Mailbox
@@ -1020,7 +1027,7 @@ int imap_exec_msgset(struct Mailbox *m, const char *pre, const char *post,
     memcpy(m->emails, emails, m->msg_count * sizeof(struct Email *));
 
     Sort = SORT_ORDER;
-    qsort(m->emails, m->msg_count, sizeof(struct Email *), mutt_get_sort_func(SORT_ORDER));
+    qsort(m->emails, m->msg_count, sizeof(struct Email *), compare_uid);
   }
 
   pos = 0;