]> granicus.if.org Git - neomutt/commitdiff
Change sidebar to consistently use realpath for context and buffy comparison.
authorKevin McCarthy <kevin@8t8.us>
Thu, 23 Jun 2016 19:38:07 +0000 (12:38 -0700)
committerKevin McCarthy <kevin@8t8.us>
Thu, 23 Jun 2016 19:38:07 +0000 (12:38 -0700)
The original sidebar patch contained a half-implemented attempt to use
realpath() mailbox paths for comparison.  (Presumably so the open mailbox
remains highlighted despite symlink issues).

Add realpath to the Context, and set it when opening a mailbox.
Remove sidebar ifdef for the buffy member, and always set it there too.

Change the sidebar to use the realpath for comparison everywhere.

mutt_buffy_check() is using stat device and inode for comparison.
Perhaps this can be changed to use realpath instead, but that's beyond
the scope of this patch.

buffy.c
buffy.h
curs_main.c
imap/imap.c
main.c
mutt.h
mx.c
pop.c
sidebar.c
sidebar.h

diff --git a/buffy.c b/buffy.c
index 31dfcdf6130af4733208e4ef75cb162a2ffb247b..50bda350809d68aa90a186c1726c4fe85000c270 100644 (file)
--- a/buffy.c
+++ b/buffy.c
@@ -201,17 +201,13 @@ void mutt_update_mailbox (BUFFY * b)
 static BUFFY *buffy_new (const char *path)
 {
   BUFFY* buffy;
-#ifdef USE_SIDEBAR
   char rp[PATH_MAX] = "";
   char *r = NULL;
-#endif
 
   buffy = (BUFFY *) safe_calloc (1, sizeof (BUFFY));
   strfcpy (buffy->path, path, sizeof (buffy->path));
-#ifdef USE_SIDEBAR
   r = realpath (path, rp);
   strfcpy (buffy->realpath, r ? rp : path, sizeof (buffy->realpath));
-#endif
   buffy->next = NULL;
   buffy->magic = 0;
 
@@ -229,10 +225,7 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e
   char buf[_POSIX_PATH_MAX];
   struct stat sb;
   char f1[PATH_MAX];
-#ifndef USE_SIDEBAR
-  char f2[PATH_MAX];
-#endif
-  char *p, *q;
+  char *p;
 
   while (MoreArgs (s))
   {
@@ -262,13 +255,7 @@ int mutt_parse_mailboxes (BUFFER *path, BUFFER *s, unsigned long data, BUFFER *e
     p = realpath (buf, f1);
     for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next))
     {
-#ifdef USE_SIDEBAR
-      q = (*tmp)->realpath;
-      if (mutt_strcmp (p ? p : buf, q) == 0)
-#else
-      q = realpath ((*tmp)->path, f2);
-      if (mutt_strcmp (p ? p : buf, q ? q : (*tmp)->path) == 0)
-#endif
+      if (mutt_strcmp (p ? p : buf, (*tmp)->realpath) == 0)
       {
        dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path));
        break;
diff --git a/buffy.h b/buffy.h
index 61e4d43446d9e3785e3b91beae52536df2436d39..5a7cacfb739cb6584a599b2333ee6ff6cbe3aace 100644 (file)
--- a/buffy.h
+++ b/buffy.h
@@ -26,9 +26,8 @@
 typedef struct buffy_t
 {
   char path[_POSIX_PATH_MAX];
-#ifdef USE_SIDEBAR
-  char realpath[_POSIX_PATH_MAX];
-#endif
+  char realpath[_POSIX_PATH_MAX]; /* used for duplicate detection, context comparison,
+                                     and the sidebar */
   off_t size;
   struct buffy_t *next;
 #ifdef USE_SIDEBAR
index 68620fab3881929e00f64e3927f413fabe957a14..d0ff0aa6adc4c4bb6222c83f60a0630740d9ebd8 100644 (file)
@@ -1226,9 +1226,6 @@ int mutt_index_menu (void)
        }
 
        mutt_expand_path (buf, sizeof (buf));
-#ifdef USE_SIDEBAR
-       mutt_sb_set_open_buffy (buf);
-#endif
        if (mx_get_magic (buf) <= 0)
        {
          mutt_error (_("%s is not a mailbox."), buf);
@@ -1278,6 +1275,10 @@ int mutt_index_menu (void)
        else
          menu->current = 0;
 
+#ifdef USE_SIDEBAR
+        mutt_sb_set_open_buffy ();
+#endif
+
        mutt_clear_error ();
        mutt_buffy_check(1); /* force the buffy check after we have changed
                              the folder */
index 009c222c6d53217ddf27795b946325f7b2dd27de..f5066b2547308c7d102f64b9c4980abd2b81f60e 100644 (file)
@@ -588,7 +588,9 @@ static int imap_open_mailbox (CONTEXT* ctx)
   imap_qualify_path (buf, sizeof (buf), &mx, idata->mailbox);
 
   FREE (&(ctx->path));
+  FREE (&(ctx->realpath));
   ctx->path = safe_strdup (buf);
+  ctx->realpath = safe_strdup (ctx->path);
 
   idata->ctx = ctx;
 
diff --git a/main.c b/main.c
index 9effb13de42a6725c6b9f77e0b21e0fa6f4b3a47..ffbb350d7b4d7cd4ae230502c8cc78e8e7f1c9ff 100644 (file)
--- a/main.c
+++ b/main.c
@@ -567,11 +567,7 @@ init_extended_keys();
 
 int main (int argc, char **argv)
 {
-#ifdef USE_SIDEBAR
-  char folder[PATH_MAX] = "";
-#else
   char folder[_POSIX_PATH_MAX] = "";
-#endif
   char *subject = NULL;
   char *includeFile = NULL;
   char *draftFile = NULL;
@@ -1202,15 +1198,6 @@ int main (int argc, char **argv)
       strfcpy (folder, NONULL(Spoolfile), sizeof (folder));
     mutt_expand_path (folder, sizeof (folder));
 
-#ifdef USE_SIDEBAR
-    {
-      char tmpfolder[PATH_MAX] = "";
-      strfcpy (tmpfolder, folder, sizeof (tmpfolder));
-      if (!realpath (tmpfolder, folder))
-        strfcpy (folder, tmpfolder, sizeof (tmpfolder));
-    }
-#endif
-
     mutt_str_replace (&CurrentFolder, folder);
     mutt_str_replace (&LastFolder, folder);
 
@@ -1234,7 +1221,7 @@ int main (int argc, char **argv)
        || !explicit_folder)
     {
 #ifdef USE_SIDEBAR
-      mutt_sb_set_open_buffy (folder);
+      mutt_sb_set_open_buffy ();
 #endif
       mutt_index_menu ();
       if (Context)
diff --git a/mutt.h b/mutt.h
index 69abdd3b09ad95895d05a6fd33bd0d8fcd09934c..ce04a68a6bcb5650161ae13fd693471be1a8e503 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -903,6 +903,7 @@ struct mx_ops
 typedef struct _context
 {
   char *path;
+  char *realpath;               /* used for buffy comparison and the sidebar */
   FILE *fp;
   time_t atime;
   time_t mtime;
diff --git a/mx.c b/mx.c
index 1b7497a811b335f3f5ac45b2079353e1409d3ce3..fe956aac1724c0d2a43f1d2f1db61a5956155303 100644 (file)
--- a/mx.c
+++ b/mx.c
@@ -628,6 +628,8 @@ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx)
     ctx = safe_malloc (sizeof (CONTEXT));
   memset (ctx, 0, sizeof (CONTEXT));
   ctx->path = safe_strdup (path);
+  if (! (ctx->realpath = realpath (ctx->path, NULL)) )
+    ctx->realpath = safe_strdup (ctx->path);
 
   ctx->msgnotreadyet = -1;
   ctx->collapsed = 0;
@@ -740,6 +742,7 @@ void mx_fastclose_mailbox (CONTEXT *ctx)
   FREE (&ctx->hdrs);
   FREE (&ctx->v2r);
   FREE (&ctx->path);
+  FREE (&ctx->realpath);
   FREE (&ctx->pattern);
   if (ctx->limit_pattern) 
     mutt_pattern_free (&ctx->limit_pattern);
diff --git a/pop.c b/pop.c
index 9e0a14597cd9659d0b0e70c05221ae0d182a867a..972b7152dcb136c2d2ab97da40c79da27ac58eae 100644 (file)
--- a/pop.c
+++ b/pop.c
@@ -421,7 +421,9 @@ static int pop_open_mailbox (CONTEXT *ctx)
     return -1;
 
   FREE (&ctx->path);
+  FREE (&ctx->realpath);
   ctx->path = safe_strdup (buf);
+  ctx->realpath = safe_strdup (ctx->path);
 
   pop_data = safe_calloc (1, sizeof (POP_DATA));
   pop_data->conn = conn;
index 95a908008363fc2bd45d6fb57287f069311a2c2f..066e734ea6e6f3bfc5691277bb073edda3b94eb8 100644 (file)
--- a/sidebar.c
+++ b/sidebar.c
@@ -148,7 +148,7 @@ static const char *cb_format_str(char *dest, size_t destlen, size_t col, int col
   if (!b)
     return src;
 
-  int c = Context && (mutt_strcmp (Context->path, b->path) == 0);
+  int c = Context && (mutt_strcmp (Context->realpath, b->realpath) == 0);
 
   optional = flags & MUTT_FORMAT_OPTIONAL;
 
@@ -407,7 +407,7 @@ static void update_buffy_visibility (BUFFY **arr, int arr_len)
         (b == HilBuffy) || (b->msg_flagged > 0))
       continue;
 
-    if (Context && (strcmp (b->path, Context->path) == 0))
+    if (Context && (mutt_strcmp (b->realpath, Context->realpath) == 0))
       /* Spool directory */
       continue;
 
@@ -648,9 +648,8 @@ static void draw_sidebar (int num_rows, int num_cols, int div_width)
       SETCOLOR(MT_COLOR_NORMAL);
 
     mutt_window_move (MuttSidebarWindow, row, 0);
-    if (Context && Context->path &&
-        (!strcmp (b->path, Context->path)||
-         !strcmp (b->realpath, Context->path)))
+    if (Context && Context->realpath &&
+        !mutt_strcmp (b->realpath, Context->realpath))
     {
       b->msg_unread  = Context->unread;
       b->msg_count   = Context->msgcount;
@@ -844,8 +843,7 @@ void mutt_sb_set_buffystats (const CONTEXT *ctx)
 
   for (; b; b = b->next)
   {
-    if (!strcmp (b->path,     ctx->path) ||
-        !strcmp (b->realpath, ctx->path))
+    if (!mutt_strcmp (b->realpath, ctx->realpath))
     {
       b->msg_unread  = ctx->unread;
       b->msg_count   = ctx->msgcount;
@@ -875,27 +873,25 @@ const char *mutt_sb_get_highlight (void)
 }
 
 /**
- * mutt_sb_set_open_buffy - Set the OpnBuffy based on a mailbox path
- * @path: Mailbox path
+ * mutt_sb_set_open_buffy - Set the OpnBuffy based on a the global Context
  *
  * Search through the list of mailboxes.  If a BUFFY has a matching path, set
  * OpnBuffy to it.
  */
-BUFFY *mutt_sb_set_open_buffy (const char *path)
+BUFFY *mutt_sb_set_open_buffy (void)
 {
   /* Even if the sidebar is hidden */
 
   BUFFY *b = Incoming;
 
-  if (!path || !b)
-    return NULL;
-
   OpnBuffy = NULL;
 
+  if (!Context || !b)
+    return NULL;
+
   for (; b; b = b->next)
   {
-    if (!strcmp (b->path,     path) ||
-        !strcmp (b->realpath, path))
+    if (!mutt_strcmp (b->realpath, Context->realpath))
     {
       OpnBuffy = b;
       HilBuffy = b;
@@ -937,7 +933,7 @@ void mutt_sb_notify_mailbox (BUFFY *b, int created)
     {
       /* This might happen if the user "unmailboxes *", then
        * "mailboxes" our current mailbox back again */
-      if (mutt_strcmp (b->path, Context->path) == 0)
+      if (mutt_strcmp (b->realpath, Context->realpath) == 0)
         OpnBuffy = b;
     }
   }
index 885f5e64b4290c067e5a4522a616d77c8d163f36..3a04c5ed7840a30fc8fa2c01158c0ab0f7847de1 100644 (file)
--- a/sidebar.h
+++ b/sidebar.h
@@ -28,6 +28,6 @@ void         mutt_sb_draw (void);
 const char * mutt_sb_get_highlight (void);
 void         mutt_sb_notify_mailbox (BUFFY *b, int created);
 void         mutt_sb_set_buffystats (const CONTEXT *ctx);
-BUFFY *      mutt_sb_set_open_buffy (const char *path);
+BUFFY *      mutt_sb_set_open_buffy (void);
 
 #endif /* SIDEBAR_H */