changeset: 6698:b45c8ec1e54c user: Kevin McCarthy <ke...@8t8.us> 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 */