commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. release-3.1.1-26-g00c27bc


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-3.1.1-26-g00c27bc
Date: Wed, 4 Jan 2017 19:46:06 +0000 (UTC)

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=00c27bc22c1d032e0b9716bc87abbf6b68cbbb43

The branch, master has been updated
       via  00c27bc22c1d032e0b9716bc87abbf6b68cbbb43 (commit)
      from  5e425f04eeb5fad1f299fcf449404cef3b061c55 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 00c27bc22c1d032e0b9716bc87abbf6b68cbbb43
Author: Sergey Poznyakoff <address@hidden>
Date:   Wed Jan 4 21:40:31 2017 +0200

    Improve handling of namespace references
    
    * imap4d/list.c (refinfo) <pfxlen>: Remove.
    (list_fun): Change the algorithm for restoring the printable reference name.
    (imap4d_list): Use actual reference, not the prefix value.
    * imap4d/namespace.c: Fix handling of NS_OTHER prefixes.
    * imap4d/tests/list.at: Change the testcase.

-----------------------------------------------------------------------

Summary of changes:
 imap4d/list.c        |   61 +++++++++-----------------------------------------
 imap4d/namespace.c   |   47 ++++++++++++++++----------------------
 imap4d/tests/list.at |   15 +++++++------
 3 files changed, 38 insertions(+), 85 deletions(-)

diff --git a/imap4d/list.c b/imap4d/list.c
index 07cea67..4a25905 100644
--- a/imap4d/list.c
+++ b/imap4d/list.c
@@ -24,7 +24,6 @@ struct refinfo
   char *refptr;   /* Original reference */
   size_t reflen;  /* Length of the original reference */
   struct namespace_prefix const *pfx;
-  size_t pfxlen;
   size_t dirlen;  /* Length of the current directory prefix */
   char *buf;
   size_t bufsize;
@@ -43,8 +42,8 @@ list_fun (mu_folder_t folder, struct mu_list_response *resp, 
void *data)
   
   name = resp->name;
   size = strlen (name);
-  if (size == refinfo->pfxlen + 6
-      && memcmp (name + refinfo->pfxlen + 1, "INBOX", 5) == 0)
+  if (size == refinfo->reflen + 6
+      && memcmp (name + refinfo->reflen + 1, "INBOX", 5) == 0)
     return 0;
      
   io_sendf ("* %s", "LIST (");
@@ -59,37 +58,25 @@ list_fun (mu_folder_t folder, struct mu_list_response 
*resp, void *data)
   io_sendf (") \"%c\" ", refinfo->pfx->delim);
 
   name = resp->name + refinfo->dirlen + 1;
-  size = strlen (name) + refinfo->pfxlen + 2;
+  size = strlen (name) + refinfo->reflen + 2;
   if (size > refinfo->bufsize)
     {
       if (refinfo->buf == NULL)
        {
          refinfo->bufsize = size;
-         refinfo->buf = malloc (refinfo->bufsize);
-         if (!refinfo->buf)
-           {
-             mu_error ("%s", mu_strerror (errno));
-             return 1;
-           }
-         memcpy (refinfo->buf, refinfo->refptr, refinfo->reflen);
+         refinfo->buf = mu_alloc (refinfo->bufsize);
        }
       else
        {
-         char *p = realloc (refinfo->buf, size);
-         if (!p)
-           {
-             mu_error ("%s", mu_strerror (errno));
-             return 1;
-           }
-         refinfo->buf = p;
+         refinfo->buf = mu_realloc (refinfo->buf, size);
          refinfo->bufsize = size;
        }
     }
 
-  if (refinfo->pfxlen)
+  if (refinfo->refptr[0])
     {
-      p = mu_stpcpy (refinfo->buf, refinfo->pfx->prefix);
-      if (*name)
+      p = mu_stpcpy (refinfo->buf, refinfo->refptr);
+      if (refinfo->refptr[refinfo->reflen-1] != refinfo->pfx->delim)
        *p++ = refinfo->pfx->delim;
     }
   else
@@ -185,35 +172,16 @@ imap4d_list (struct imap4d_session *session,
       struct refinfo refinfo;
       size_t i;
       struct namespace_prefix const *pfx;
-
-      if (*wcard == '~')
-       {
-         for (i = 1;
-              mu_c_is_class (wcard[i], MU_CTYPE_ALPHA|MU_CTYPE_DIGIT)
-                || wcard[i] == '_'; i++)
-           ;
-         ref = mu_alloc (i + 1);
-         memcpy (ref, wcard, i);
-         ref[i] = 0;
-         wcard += i;
-       }
-      else
-       ref = mu_strdup (ref);
       
       cwd = namespace_translate_name (ref, 0, &pfx);
       if (!cwd)
        {
-         free (ref);
          return io_completion_response (command, RESP_NO,
                                      "The requested item could not be found.");
        }
       free (cwd);
-      
-      if (*wcard == pfx->delim && ref[0] != '~')
-       {
-         /* Absolute Path in wcard, dump the old ref.  */
-         ref[0] = 0;
-       }
+
+      ref = mu_strdup (ref);
       
       /* Find the longest directory prefix */
       i = strcspn (wcard, "%*");
@@ -223,14 +191,9 @@ imap4d_list (struct imap4d_session *session,
       if (i)
        {
          size_t reflen = strlen (ref);
-         int addslash = (reflen > 0
-                         && ref[reflen-1] != pfx->delim
-                         && *wcard != pfx->delim); 
-         size_t len = i + reflen + addslash;
+         size_t len = i + reflen;
 
          ref = mu_realloc (ref, len);
-         if (addslash)
-           ref[reflen++] = pfx->delim;
          memcpy (ref + reflen, wcard, i - 1); /* omit the trailing / */
          ref[len-1] = 0;
 
@@ -278,8 +241,6 @@ imap4d_list (struct imap4d_session *session,
       mu_url_sget_path (url, &dir);
       refinfo.dirlen = strlen (dir);
             
-      refinfo.pfxlen = strlen (pfx->prefix);
-
       /* The special name INBOX is included in the output from LIST, if
         INBOX is supported by this server for this user and if the
         uppercase string "INBOX" matches the interpreted reference and
diff --git a/imap4d/namespace.c b/imap4d/namespace.c
index cd3ae43..cf5e550 100644
--- a/imap4d/namespace.c
+++ b/imap4d/namespace.c
@@ -104,7 +104,6 @@ namespace_init (void)
            }
          pfx->ns = i;
 
-         trim_delim (pfx->prefix, pfx->delim);
          trim_delim (pfx->dir, '/');
          
          rc = mu_assoc_install (prefixes, pfx->prefix, pfx);
@@ -182,9 +181,7 @@ prefix_translate_name (struct namespace_prefix const *pfx, 
char const *name,
 {
   size_t pfxlen = strlen (pfx->prefix);
 
-  if (pfxlen <= namelen
-      && memcmp (pfx->prefix, name, pfxlen) == 0
-      && (pfxlen == 0 || pfxlen == namelen || name[pfxlen] == pfx->delim))
+  if (pfxlen <= namelen && memcmp (pfx->prefix, name, pfxlen) == 0)
     {
       char *tmpl, *p;
 
@@ -212,10 +209,17 @@ prefix_translate_name (struct namespace_prefix const 
*pfx, char const *name,
       p = mu_stpcpy (p, pfx->dir);
       if (*name)
        {
-         *p++ = '/';
+         if (pfx->ns == NS_OTHER
+             && pfx->prefix[strlen(pfx->prefix) - 1] != pfx->delim)
+           {
+             while (*name && *name != pfx->delim)
+               name++;
+           }
+         else if (*name != pfx->delim)
+           *p++ = '/';
          translate_delim (p, name, '/', pfx->delim);
        }
-
+      
       return tmpl;
     }
   return NULL;
@@ -230,15 +234,6 @@ i_translate_name (char const *name, int url, int ns,
   char *res = NULL;
   size_t namelen = strlen (name);
 
-#if 0
-  FIXME
-   if (namelen >= 5
-      && strcmp (name + namelen - 5, "INBOX") == 0
-      && (namelen == 5 && name[namelen - 6] == '/'))
-    {
-    } 
-#endif
-  
   rc = mu_assoc_get_iterator (prefixes, &itr);
   if (rc)
     {
@@ -285,7 +280,10 @@ extract_username (char const *name, struct 
namespace_prefix const *pfx)
     len = end - p;
   else
     len = strlen (p);
-  
+
+  if (len == 0)
+    return mu_strdup (auth_data->name);
+
   user = mu_alloc (len + 1);
   memcpy (user, p, len);
   user[len] = 0;
@@ -310,17 +308,10 @@ namespace_translate_name (char const *name, int url,
   struct namespace_prefix const *pfx;
   char *env[] = ENV_INITIALIZER;
   
-  if (name[0] == '~')
+  if (mu_c_strcasecmp (name, "INBOX") == 0 && auth_data->change_uid)
     {
-      if (name[1] == 0 || name[1] == '/')
-       {
-         if (mu_c_strcasecmp (name, "INBOX") == 0 && auth_data->change_uid)
-           res = mu_strdup (auth_data->mailbox);
-         else
-           res = i_translate_name (name, url, NS_PRIVATE, &pfx);
-       }
-      else 
-       res = i_translate_name (name, url, NS_OTHER, &pfx);
+      res = mu_strdup (auth_data->mailbox);
+      pfx = mu_assoc_get (prefixes, "");
     }
   else
     res = i_translate_name (name, url, NS_MAX, &pfx);
@@ -336,7 +327,7 @@ namespace_translate_name (char const *name, int url,
          env[ENV_HOME] = real_homedir;
          break;
 
-       case NS_SHARED:
+       case NS_OTHER:
          {
            struct mu_auth_data *adata;
            env[ENV_USER] = extract_username (name, pfx);
@@ -349,7 +340,7 @@ namespace_translate_name (char const *name, int url,
          }
          break;
 
-       case NS_OTHER:
+       case NS_SHARED:
          break;
        }
       
diff --git a/imap4d/tests/list.at b/imap4d/tests/list.at
index d880b90..f49eb59 100644
--- a/imap4d/tests/list.at
+++ b/imap4d/tests/list.at
@@ -76,16 +76,17 @@ LIST_CHECK([empty ref + asterisk],[list02],
 * LIST (\NoInferiors) NIL INBOX
 ])
 
+# FIXME: I'm not sure whether it should include / in the reply.
 LIST_CHECK([root ref + asterisk],[list03],
 ["/" "*"],
 [dnl
-* LIST (\NoInferiors) "/" bigto.mbox
-* LIST (\NoInferiors) "/" mbox
-* LIST (\NoInferiors) "/" mbox1
-* LIST (\NoInferiors) "/" relational.mbox
-* LIST (\NoInferiors) "/" search.mbox
-* LIST (\NoInferiors) "/" sieve.mbox
-* LIST (\NoInferiors) "/" teaparty.mbox
+* LIST (\NoInferiors) "/" /bigto.mbox
+* LIST (\NoInferiors) "/" /mbox
+* LIST (\NoInferiors) "/" /mbox1
+* LIST (\NoInferiors) "/" /relational.mbox
+* LIST (\NoInferiors) "/" /search.mbox
+* LIST (\NoInferiors) "/" /sieve.mbox
+* LIST (\NoInferiors) "/" /teaparty.mbox
 ])
 
 LIST_CHECK([absolute reference + asterisk],[list04],


hooks/post-receive
-- 
GNU Mailutils



reply via email to

[Prev in Thread] Current Thread [Next in Thread]