]> granicus.if.org Git - neomutt/commitdiff
Fix IMAP fast deletion. From Brendan.
authorThomas Roessler <roessler@does-not-exist.org>
Sat, 11 Sep 1999 13:49:37 +0000 (13:49 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Sat, 11 Sep 1999 13:49:37 +0000 (13:49 +0000)
imap/browse.c
imap/imap.c

index 4567767c1c72d237a2e49b65eeeaa21d96928724..7c4031367a98979061000961cce08ccef167e147 100644 (file)
@@ -162,7 +162,7 @@ int imap_init_browse (char *path, struct browser_state *state)
      *  folder + delimiter. Cyrus servers don't. So we ask for folder,
      *  and tack on delimiter ourselves. */
     for (n--; n >= 0 && mbox[n] != idata->delim ; n--);
-    if (n > 0)                 /* "aaaa/bbbb/" -> "aaaa/" */
+    if (n > 0)                 /* "aaaa/bbbb/" -> "aaaa" */
     {
       ctmp = mbox[n];
       mbox[n] = '\0';
index c15404515d266765733d5ce8df4db6518819bc20..e66e5ff2ab49d50301dde92ed68fccd33e7cc7aa 100644 (file)
@@ -1285,7 +1285,6 @@ int imap_sync_mailbox (CONTEXT *ctx, int expunge)
   char flags[LONG_STRING];
   char tmp[LONG_STRING];
   int n;
-  int setstart = 0;
 
   if (CTX_DATA->state != IMAP_SELECTED)
   {
@@ -1296,10 +1295,20 @@ int imap_sync_mailbox (CONTEXT *ctx, int expunge)
   /* if we are expunging anyway, we can do deleted messages very quickly... */
   if (expunge && mutt_bit_isset (CTX_DATA->rights, IMAP_ACL_DELETE))
   {
+    int setstart = 0;
+    HEADER** hdrs;
+
     buf[0] = '\0';
+
+    /* make copy of header pointers to sort in natural order */
+    hdrs = safe_calloc (ctx->msgcount, sizeof (HEADER*));
+    memcpy (hdrs, ctx->hdrs, ctx->msgcount * sizeof (HEADER*));
+    qsort ((void*) hdrs, ctx->msgcount, sizeof (HEADER*),
+      mutt_get_sort_func (SORT_ORDER));
+
     for (n = 0; n < ctx->msgcount; n++)
     {
-      if (ctx->hdrs[n]->changed && ctx->hdrs[n]->deleted)
+      if (hdrs[n]->changed && hdrs[n]->deleted)
       {
         if (setstart == 0)
         {
@@ -1319,15 +1328,21 @@ int imap_sync_mailbox (CONTEXT *ctx, int expunge)
           snprintf (buf, sizeof (buf), "%s:%u", tmp, n+1);
         }
         /* the normal flag update can skip this message */
-        ctx->hdrs[n]->changed = 0;
+        hdrs[n]->changed = 0;
       }
-      else if (setstart && (n > setstart))
+      else if (setstart)
       {
+        if (n > setstart)
+        {
+          strncpy (tmp, buf, sizeof (tmp));
+          snprintf (buf, sizeof (buf), "%s:%u", tmp, n);
+        }
         setstart = 0;
-        strncpy (tmp, buf, sizeof (tmp));
-        snprintf (buf, sizeof (buf), "%s:%u", tmp, n);
       }
     }
+
+    safe_free ((void**) &hdrs);
+
     /* if we have a message set, then let's delete */
     if (buf[0])
     {