From: Kevin McCarthy Date: Thu, 23 Jun 2016 19:38:07 +0000 (-0700) Subject: Change sidebar to consistently use realpath for context and buffy comparison. X-Git-Tag: neomutt-20160822~100 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=590e5426c34bb1223f5ced8ed65b18dcaf6244fc;p=neomutt 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. --- diff --git a/buffy.c b/buffy.c index 31dfcdf61..50bda3508 100644 --- 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 61e4d4344..5a7cacfb7 100644 --- 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 diff --git a/curs_main.c b/curs_main.c index 68620fab3..d0ff0aa6a 100644 --- a/curs_main.c +++ b/curs_main.c @@ -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 */ diff --git a/imap/imap.c b/imap/imap.c index 009c222c6..f5066b254 100644 --- a/imap/imap.c +++ b/imap/imap.c @@ -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 9effb13de..ffbb350d7 100644 --- 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 69abdd3b0..ce04a68a6 100644 --- 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 1b7497a81..fe956aac1 100644 --- 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 9e0a14597..972b7152d 100644 --- 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; diff --git a/sidebar.c b/sidebar.c index 95a908008..066e734ea 100644 --- 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; } } diff --git a/sidebar.h b/sidebar.h index 885f5e64b..3a04c5ed7 100644 --- 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 */