Commit 149eb79e authored by Kevin J. McCarthy's avatar Kevin J. McCarthy

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.
parent 9ba2d8a7
......@@ -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;
......
......@@ -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
......
......@@ -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 */
......
......@@ -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;
......
......@@ -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)
......
......@@ -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;
......
......@@ -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);
......
......@@ -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;
......
......@@ -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;
}
}
......
......@@ -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 */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment