-# vi: ft=diff
-This is the maildir mtime patch by Dale Woolridge.
-
-The home page for this patch is:
-
- http://www.mutt.ca/maildir-mtime.html
-
-* Patch last synced with upstream:
- - Date: 2004-08-10
- - File: http://www.mutt.ca/patches/patch-1.5.6.dw.maildir-mtime.1
-
-* Changes made:
- - removed a spurious const in add_folder() definition.
- - added a $maildir_mtime option to allow this patch to be disabled at
- runtime (see Bug#253261, comments from Zephaniah E. Hull).
- - 2007-04-03 myon: resolved conflict in browser.c
-
-== END PATCH
---- a/buffy.c
-+++ b/buffy.c
-@@ -257,6 +257,7 @@
- (*tmp)->new = 0;
- (*tmp)->notified = 1;
- (*tmp)->newly_created = 0;
-+ (*tmp)->mtime = 0;
-
- /* for check_mbox_size, it is important that if the folder is new (tested by
- * reading it), the size is set to 0 so that later when we check we see
-@@ -285,6 +286,7 @@
- {
- BUFFY *tmp;
- struct stat sb;
-+ struct stat smd;
- struct dirent *de;
- DIR *dirp;
- char path[_POSIX_PATH_MAX];
-@@ -333,6 +335,7 @@
- if (tmp->magic != M_IMAP)
- #endif
- tmp->new = 0;
-+ tmp->mtime = 0;
-
- #ifdef USE_IMAP
- if (tmp->magic != M_IMAP)
-@@ -415,10 +418,20 @@
- if (*de->d_name != '.' &&
- (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
- {
-- /* one new and undeleted message is enough */
-- BuffyCount++;
-- tmp->new = 1;
-- break;
-+ if (!tmp->new)
-+ {
-+ /* one new and undeleted message is enough */
-+ BuffyCount++;
-+ tmp->new = 1;
-+
-+ if (! option (OPTMAILDIRMTIME)) /* prevent stat calls */
-+ break;
-+ }
-+ snprintf (path, sizeof (path), "%s/new/%s", tmp->path, de->d_name);
-+ if (!stat (path, &smd) && smd.st_mtime > tmp->mtime)
-+ {
-+ tmp->mtime = smd.st_mtime;
-+ }
- }
- }
- closedir (dirp);
---- a/init.h
-+++ b/init.h
-@@ -1350,6 +1350,16 @@
- ** \fBDON'T CHANGE THIS SETTING UNLESS YOU ARE REALLY SURE WHAT YOU ARE
- ** DOING!\fP
- */
-+ { "maildir_mtime", DT_BOOL, R_NONE, OPTMAILDIRMTIME, 0 },
-+ /*
-+ ** .pp
-+ ** If set, the sort-by-date option in the browser will sort maildirs
-+ ** smartly, not using the mtime of the maildir itself but that of the
-+ ** newest message in the new subdirectory, making the sorting by
-+ ** reverse date much more useful. People with maildirs over NFS may
-+ ** wish to leave this option unset.
-+ **
-+ */
- #ifdef USE_HCACHE
- { "maildir_header_cache_verify", DT_BOOL, R_NONE, OPTHCACHEVERIFY, 1 },
- /*
---- a/mutt.h
-+++ b/mutt.h
-@@ -384,6 +384,7 @@
- OPTINCLUDEONLYFIRST,
- OPTKEEPFLAGGED,
- OPTMAILCAPSANITIZE,
-+ OPTMAILDIRMTIME,
- OPTMAILDIRTRASH,
- OPTMARKERS,
- OPTMARKOLD,
---- a/browser.c
-+++ b/browser.c
-@@ -32,6 +32,7 @@
- #ifdef USE_IMAP
- #include "imap.h"
- #endif
-+#include "mx.h"
-
- #include <stdlib.h>
- #include <dirent.h>
-@@ -308,8 +309,10 @@
- }
-
- static void add_folder (MUTTMENU *m, struct browser_state *state,
-- const char *name, const struct stat *s, int new)
-+ const char *name, /*DEB const IAN*/ struct stat *s, BUFFY *mbuf)
- {
-+ int new = (mbuf) ? mbuf->new : 0;
-+
- if (state->entrylen == state->entrymax)
- {
- /* need to allocate more space */
-@@ -321,6 +324,9 @@
- m->data = state->entry;
- }
-
-+ if (mbuf && mbuf->magic == M_MAILDIR && mbuf->mtime)
-+ s->st_mtime = mbuf->mtime;
-+
- if (s != NULL)
- {
- (state->entry)[state->entrylen].mode = s->st_mode;
-@@ -415,7 +421,7 @@
- tmp = Incoming;
- while (tmp && mutt_strcmp (buffer, tmp->path))
- tmp = tmp->next;
-- add_folder (menu, state, de->d_name, &s, (tmp) ? tmp->new : 0);
-+ add_folder (menu, state, de->d_name, &s, tmp);
- }
- closedir (dp);
- browser_sort (state);
-@@ -443,14 +449,15 @@
- if (mx_is_imap (tmp->path))
- {
- imap_mailbox_state (tmp->path, &mbox);
-- add_folder (menu, state, tmp->path, NULL, mbox.new);
-+ tmp->new = mbox.new;
-+ add_folder (menu, state, tmp->path, NULL, tmp);
- continue;
- }
- #endif
- #ifdef USE_POP
- if (mx_is_pop (tmp->path))
- {
-- add_folder (menu, state, tmp->path, NULL, tmp->new);
-+ add_folder (menu, state, tmp->path, NULL, tmp);
- continue;
- }
- #endif
-@@ -479,7 +486,7 @@
- strfcpy (buffer, NONULL(tmp->path), sizeof (buffer));
- mutt_pretty_mailbox (buffer, sizeof (buffer));
-
-- add_folder (menu, state, buffer, &s, tmp->new);
-+ add_folder (menu, state, buffer, &s, tmp);
- }
- while ((tmp = tmp->next));
- browser_sort (state);
---- a/buffy.h
-+++ b/buffy.h
-@@ -25,6 +25,7 @@
- char path[_POSIX_PATH_MAX];
- off_t size;
- struct buffy_t *next;
-+ time_t mtime; /* for maildirs...time of newest entry */
- short new; /* mailbox has new mail */
- short notified; /* user has been notified */
- short magic; /* mailbox type */