<<< Date Index >>>     <<< Thread Index >>>

Re: What's needed for mutt 1.6? (maildir_indicator)



* Brendan Cully on Thursday, February 22, 2007 at 09:30:33 -0800:
> I intend to cut 1.5.14 this weekend. I'd like to make 1.5.15 the last
> proper dev release for 1.6 - that is, feature-freeze after
> 1.5.15. So, I'd like to hear once again which patches everyone would
> like to see in 1.6 (and which patches people object to).

The maildir_indicator patch by Olaf Hering overcomes an annoying
shortcoming when reading Maildir folders. I'm using it for quite
some time now, and didn't have any problems with it.

I attach a version against current tip.

c
-- 
_B A U S T E L L E N_ lesen! --->> <http://www.blacktrash.org/baustellen.html>
# HG changeset patch
# User Christian Ebert <blacktrash@xxxxxxx>
# Date 1172751178 -3600
# Node ID 819ef6a7be0672ac8461faea6e4a9e940b9c7427
# Parent  42595801073eb5bfca435a65de87162a1c2c0824
Maildir indicator patch by Olaf Hering

Apply patch from Message-Id: <E1GmK4L-0006yI-Kz@xxxxxxxxxxxxxxxxxxxx>
against 1.5.14.
Original patch by: Olaf Hering <olaf@xxxxxxxxx>

diff -r 42595801073e -r 819ef6a7be06 PATCHES
--- a/PATCHES   Thu Mar 01 06:05:39 2007 +0000
+++ b/PATCHES   Thu Mar 01 13:12:58 2007 +0100
@@ -0,0 +1,1 @@
+patch-1.5.14.oh.maildir_indicator.1
diff -r 42595801073e -r 819ef6a7be06 browser.c
--- a/browser.c Thu Mar 01 06:05:39 2007 +0000
+++ b/browser.c Thu Mar 01 13:12:58 2007 +0100
@@ -351,6 +351,22 @@ static void init_state (struct browser_s
     menu->data = state->entry;
 }
 
+static unsigned short walk_maildir_new(const char *path)
+{
+  struct dirent *de;
+  DIR *d = opendir(path);
+  unsigned short count = 0;
+  if (d) {
+    while ((de = readdir(d))) {
+      if (de->d_name[0] == '.' && (!de->d_name[1] || (de->d_name[1] == '.' && 
!de->d_name[2])))
+       continue;
+      count++;
+    }
+    closedir(d);
+  }
+  return count;
+}
+
 static int examine_directory (MUTTMENU *menu, struct browser_state *state,
                              char *d, const char *prefix)
 {
@@ -358,6 +374,8 @@ static int examine_directory (MUTTMENU *
   DIR *dp;
   struct dirent *de;
   char buffer[_POSIX_PATH_MAX + SHORT_STRING];
+  char md_path[_POSIX_PATH_MAX];
+  unsigned short new;
   BUFFY *tmp;
 
   while (stat (d, &s) == -1)
@@ -404,17 +422,27 @@ static int examine_directory (MUTTMENU *
       continue;
 
     mutt_concat_path (buffer, d, de->d_name, sizeof (buffer));
-    if (lstat (buffer, &s) == -1)
-      continue;
-    
-    if ((! S_ISREG (s.st_mode)) && (! S_ISDIR (s.st_mode)) &&
-       (! S_ISLNK (s.st_mode)))
-      continue;
-    
-    tmp = Incoming;
-    while (tmp && mutt_strcmp (buffer, tmp->path))
-      tmp = tmp->next;
-    add_folder (menu, state, de->d_name, &s, (tmp) ? tmp->new : 0);
+       if (mx_is_maildir (buffer)) {
+               snprintf (md_path, sizeof(md_path), "%s/new", buffer);
+               if (lstat (md_path, &s) == -1)
+                       continue;
+               s.st_size = new = walk_maildir_new(md_path);
+       } else {
+               if (lstat (buffer, &s) == -1)
+                       continue;
+
+               if ((! S_ISREG (s.st_mode)) && (! S_ISDIR (s.st_mode)) &&
+                       (! S_ISLNK (s.st_mode)))
+                       continue;
+               tmp = Incoming;
+               while (tmp && mutt_strcmp (buffer, tmp->path))
+                       tmp = tmp->next;
+               if (tmp)
+                       new = tmp->new;
+               else
+                       new = 0;
+       }
+    add_folder (menu, state, de->d_name, &s, new);
   }
   closedir (dp);  
   browser_sort (state);
@@ -425,6 +453,8 @@ static int examine_mailboxes (MUTTMENU *
 {
   struct stat s;
   char buffer[LONG_STRING];
+  char md_path[_POSIX_PATH_MAX];
+  unsigned short new;
   BUFFY *tmp = Incoming;
 
   if (!Incoming)
@@ -449,17 +479,24 @@ static int examine_mailboxes (MUTTMENU *
       continue;
     }
 #endif
-    if (lstat (tmp->path, &s) == -1)
-      continue;
-
-    if ((! S_ISREG (s.st_mode)) && (! S_ISDIR (s.st_mode)) &&
-       (! S_ISLNK (s.st_mode)))
-      continue;
-    
+    if (mx_is_maildir (tmp->path)) {
+       snprintf (md_path, sizeof(md_path), "%s/new", tmp->path);
+       if (lstat (md_path, &s) == -1)
+               continue;
+       s.st_size = new = walk_maildir_new(md_path);
+    } else {
+       new = tmp->new;
+       if (lstat (tmp->path, &s) == -1)
+               continue;
+       if ((! S_ISREG (s.st_mode)) && (! S_ISDIR (s.st_mode)) &&
+               (! S_ISLNK (s.st_mode)))
+               continue;
+    }
+
     strfcpy (buffer, NONULL(tmp->path), sizeof (buffer));
     mutt_pretty_mailbox (buffer);
 
-    add_folder (menu, state, buffer, &s, tmp->new);
+    add_folder (menu, state, buffer, &s, new);
   }
   while ((tmp = tmp->next));
   browser_sort (state);
diff -r 42595801073e -r 819ef6a7be06 mailbox.h
--- a/mailbox.h Thu Mar 01 06:05:39 2007 +0000
+++ b/mailbox.h Thu Mar 01 13:12:58 2007 +0100
@@ -74,6 +74,7 @@ int mx_is_imap (const char *);
 #ifdef USE_POP
 int mx_is_pop (const char *);
 #endif
+int mx_is_maildir (const char *s);
 
 int mx_access (const char*, int);
 int mx_check_empty (const char *);
diff -r 42595801073e -r 819ef6a7be06 mx.c
--- a/mx.c      Thu Mar 01 06:05:39 2007 +0000
+++ b/mx.c      Thu Mar 01 13:12:58 2007 +0100
@@ -457,6 +457,13 @@ int mx_get_magic (const char *path)
   return (magic);
 }
 
+/*
+ *
+ */
+int mx_is_maildir (const char *s)
+{
+  return mx_get_magic(s) == M_MAILDIR;
+}
 /*
  * set DefaultMagic to the given value
  */