]> granicus.if.org Git - mutt/commitdiff
Make hcache+bcache paths always UTF-8. Closes #3284.
authorRocco Rutte <pdmef@gmx.net>
Tue, 7 Jul 2009 11:16:59 +0000 (13:16 +0200)
committerRocco Rutte <pdmef@gmx.net>
Tue, 7 Jul 2009 11:16:59 +0000 (13:16 +0200)
ChangeLog
UPDATING
bcache.c
doc/manual.xml.head
hcache.c
muttlib.c
protos.h

index 950cd0d78b29ed2d53d4015cf87036a4329e8ba6..c1e76a0d3902a65d6e0998881382e059722c1246 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2009-07-07 13:00 +0200  Rocco Rutte  <pdmef@gmx.net>  (376545d6909c)
+
+       * UPDATING, globals.h, init.h, sendlib.c: Add $wrap_headers. Closes
+       #3135
+
+2009-07-07 12:53 +0200  Rocco Rutte  <pdmef@gmx.net>  (0980cdb206d2)
+
+       * doc/manual.xml.head: Manual: mention terminal setup for
+       charsets, more unicode pros.
+
+       Closes #3292.
+
 2009-07-06 15:28 +0200  Rocco Rutte  <pdmef@gmx.net>  (ccab6c56b557)
 
        * doc/manual.xml.head: Manual: Add a note about when/why to use utf-8
index 515d9529a30a357f7336c82c2c30c9c592f63e64..593f6fb31f63bbc4363243175e770532c8da1f1f 100644 (file)
--- a/UPDATING
+++ b/UPDATING
@@ -6,6 +6,7 @@ The keys used are:
 
 hg tip:
 
+  ! header/body cache paths are always UTF-8
   + $wrap_headers to control outgoing message's header length
   + all text/* parts can be displayed inline without mailcap
 
index 81538d22ab9fef4f8a3e83ece058431a3042da3d..1ba5b727d47cb3195123fbd77ae9bdb9ae227642 100644 (file)
--- a/bcache.c
+++ b/bcache.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2006-7 Brendan Cully <brendan@kublai.com>
- * Copyright (C) 2006 Rocco Rutte <pdmef@gmx.net>
+ * Copyright (C) 2006, 2009 Rocco Rutte <pdmef@gmx.net>
  *
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
@@ -42,6 +42,7 @@ static int bcache_path(ACCOUNT *account, const char *mailbox,
                       char *dst, size_t dstlen)
 {
   char host[STRING];
+  char path[_POSIX_PATH_MAX];
   ciss_url_t url;
   int len;
 
@@ -62,12 +63,14 @@ static int bcache_path(ACCOUNT *account, const char *mailbox,
     return -1;
   }
 
-  dprint (3, (debugfile, "bcache_path: URL: '%s'\n", host));
+  mutt_encode_path (path, sizeof (path), NONULL (mailbox));
 
   len = snprintf (dst, dstlen-1, "%s/%s%s%s", MessageCachedir,
-                 host, NONULL(mailbox),
-                 (mailbox && *mailbox &&
-                  mailbox[mutt_strlen(mailbox) - 1] == '/') ? "" : "/");
+                 host, NONULL (path),
+                 (*path && path[mutt_strlen (path) - 1] == '/') ? "" : "/");
+
+  dprint (3, (debugfile, "bcache_path: rc: %d, path: '%s'\n", len, dst));
+
   if (len < 0 || len >= dstlen-1)
     return -1;
 
index 6ff51f3f3475cb8d8ea0a4745fe07ae591e1dd07..5a2390848a90d42b867d905c9e40c2eaba66b7ca 100644 (file)
@@ -7720,10 +7720,11 @@ support as these use it (body caching requires no external library).
 <para>
 Mutt provides optional support for caching message headers for the
 following types of folders: IMAP, POP, Maildir and MH. Header caching
-greatly improves speed because for remote folders, headers usually only
-need to be downloaded once. For Maildir and MH, reading the headers from
-a single file is much faster than looking at possibly thousands of
-single files (since Maildir and MH use one file per message.)
+greatly speeds up opening large folders because for remote folders,
+headers usually only need to be downloaded once. For Maildir and MH,
+reading the headers from a single file is much faster than looking at
+possibly thousands of single files (since Maildir and MH use one file
+per message.)
 </para>
 
 <para>
@@ -7752,7 +7753,6 @@ Both cache methods can be combined using the same directory for storage
 manual maintenance tasks.
 </para>
 
-
 <para>
 In addition to caching message headers only, Mutt can also cache whole
 message bodies. This results in faster display of messages for POP and
@@ -7762,12 +7762,36 @@ IMAP folders because messages usually have to be downloaded only once.
 <para>
 For configuration, the variable <link linkend="message-cachedir"
 >$message_cachedir</link> must point to a directory. There, Mutt will
-create a hierarchy of subdirectories named like:
-<literal>proto:user@hostname</literal> where <literal>proto</literal> is
-either <quote>pop</quote> or <quote>imap.</quote> Within there for each
-folder, Mutt stores messages in single files.  All files can be removed
-as needed if the consumed disk space becomes an issue as Mutt will
-silently fetch missing items again.
+create a hierarchy of subdirectories named like the account and mailbox
+path the cache is for.
+</para>
+
+</sect2>
+
+<sect2 id="cache-dirs">
+<title>Cache Directories</title>
+
+<para>
+For using both, header and body caching, <link
+linkend="header-cache">$header_cache</link> and <link
+linkend="message-cachedir" >$message_cachedir</link> can be safely set
+to the same value.
+</para>
+
+<para>
+In a header or body cache directory, Mutt creates a directory hierarchy
+named like: <literal>proto:user@hostname</literal> where
+<literal>proto</literal> is either <quote>pop</quote> or
+<quote>imap.</quote> Within there, for each folder, Mutt stores messages
+in single files and header caches in files with the
+<quote>.hcache</quote> extension.  All files can be removed as needed if
+the consumed disk space becomes an issue as Mutt will silently fetch
+missing items again. Pathnames are always stored in UTF-8 encoding.
+</para>
+
+<para>
+For Maildir and MH, the header cache files are named after the MD5
+checksum of the path.
 </para>
 
 </sect2>
index 8b14aef1bf85dbfed7489e0b3079cd46cd605753..5195918d8d15ffbdba278ebf2b5fcb0d738d8bef 100644 (file)
--- a/hcache.c
+++ b/hcache.c
@@ -828,19 +828,23 @@ mutt_hcache_store_raw (header_cache_t* h, const char* filename, void* data,
 #endif
 }
 
-static char* get_foldername(const char *folder) {
+static char* get_foldername(const char *folder)
+{
   char *p = NULL;
+  char path[_POSIX_PATH_MAX];
   struct stat st;
 
+  mutt_encode_path (path, sizeof (path), folder);
+
   /* if the folder is local, canonify the path to avoid
    * to ensure equivalent paths share the hcache */
-  if (stat (folder, &st) == 0)
+  if (stat (path, &st) == 0)
   {
     p = safe_malloc (PATH_MAX+1);
-    if (!realpath (folder, p))
-      mutt_str_replace (&p, folder);
+    if (!realpath (path, p))
+      mutt_str_replace (&p, path);
   } else
-    p = safe_strdup (folder);
+    p = safe_strdup (path);
 
   return p;
 }
index ab04a0de5f48313aacd3d55a59a15d5250ff777a..dd5fa9881ec727078d200afaf0d86adbeac6e588 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -1874,3 +1874,10 @@ int mutt_match_spam_list (const char *s, SPAM_LIST *l, char *text, int x)
   return 0;
 }
 
+void mutt_encode_path (char *dest, size_t dlen, const char *src)
+{
+  char *p = safe_strdup (src);
+  int rc = mutt_convert_string (&p, Charset, "utf-8", 0);
+  strfcpy (dest, rc == 0 ? p : src, dlen);
+  FREE (&p);
+}
index 4606c202ab5d0ccf8b46bbf3840368fb6206b405..d0e1d3f125c586994de0112c0c90921006a6b517 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -190,6 +190,7 @@ void mutt_edit_headers (const char *, const char *, HEADER *, char *, size_t);
 int mutt_filter_unprintable (char **);
 void mutt_curses_error (const char *, ...);
 void mutt_curses_message (const char *, ...);
+void mutt_encode_path (char *, size_t, const char *);
 void mutt_enter_command (void);
 void mutt_expand_aliases_env (ENVELOPE *);
 void mutt_expand_file_fmt (char *, size_t, const char *, const char *);