changeset: 6698:b45c8ec1e54c
user: Kevin McCarthy <[email protected]>
date: Thu Jun 23 12:38:07 2016 -0700
link: http://dev.mutt.org/hg/mutt/rev/b45c8ec1e54c
Change sidebar to consistently use realpath for context and buffy comparison.
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.
diffs (281 lines):
diff -r c8613259dc38 -r b45c8ec1e54c buffy.c
--- a/buffy.c Wed Jun 22 09:20:39 2016 -0700
+++ b/buffy.c Thu Jun 23 12:38:07 2016 -0700
@@ -201,17 +201,13 @@
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 @@
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 @@
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 -r c8613259dc38 -r b45c8ec1e54c buffy.h
--- a/buffy.h Wed Jun 22 09:20:39 2016 -0700
+++ b/buffy.h Thu Jun 23 12:38:07 2016 -0700
@@ -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
diff -r c8613259dc38 -r b45c8ec1e54c curs_main.c
--- a/curs_main.c Wed Jun 22 09:20:39 2016 -0700
+++ b/curs_main.c Thu Jun 23 12:38:07 2016 -0700
@@ -1226,9 +1226,6 @@
}
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 @@
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 */
diff -r c8613259dc38 -r b45c8ec1e54c imap/imap.c
--- a/imap/imap.c Wed Jun 22 09:20:39 2016 -0700
+++ b/imap/imap.c Thu Jun 23 12:38:07 2016 -0700
@@ -588,7 +588,9 @@
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 -r c8613259dc38 -r b45c8ec1e54c main.c
--- a/main.c Wed Jun 22 09:20:39 2016 -0700
+++ b/main.c Thu Jun 23 12:38:07 2016 -0700
@@ -567,11 +567,7 @@
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 @@
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 @@
|| !explicit_folder)
{
#ifdef USE_SIDEBAR
- mutt_sb_set_open_buffy (folder);
+ mutt_sb_set_open_buffy ();
#endif
mutt_index_menu ();
if (Context)
diff -r c8613259dc38 -r b45c8ec1e54c mutt.h
--- a/mutt.h Wed Jun 22 09:20:39 2016 -0700
+++ b/mutt.h Thu Jun 23 12:38:07 2016 -0700
@@ -903,6 +903,7 @@
typedef struct _context
{
char *path;
+ char *realpath; /* used for buffy comparison and the sidebar */
FILE *fp;
time_t atime;
time_t mtime;
diff -r c8613259dc38 -r b45c8ec1e54c mx.c
--- a/mx.c Wed Jun 22 09:20:39 2016 -0700
+++ b/mx.c Thu Jun 23 12:38:07 2016 -0700
@@ -628,6 +628,8 @@
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 @@
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 -r c8613259dc38 -r b45c8ec1e54c pop.c
--- a/pop.c Wed Jun 22 09:20:39 2016 -0700
+++ b/pop.c Thu Jun 23 12:38:07 2016 -0700
@@ -421,7 +421,9 @@
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;
diff -r c8613259dc38 -r b45c8ec1e54c sidebar.c
--- a/sidebar.c Wed Jun 22 09:20:39 2016 -0700
+++ b/sidebar.c Thu Jun 23 12:38:07 2016 -0700
@@ -148,7 +148,7 @@
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 @@
(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 @@
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 @@
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 @@
}
/**
- * 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)
+ OpnBuffy = NULL;
+
+ if (!Context || !b)
return NULL;
- OpnBuffy = 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 @@
{
/* 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;
}
}
diff -r c8613259dc38 -r b45c8ec1e54c sidebar.h
--- a/sidebar.h Wed Jun 22 09:20:39 2016 -0700
+++ b/sidebar.h Thu Jun 23 12:38:07 2016 -0700
@@ -28,6 +28,6 @@
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 */