]> granicus.if.org Git - neomutt/commitdiff
Fix sorting when using '/' as a namespace separator
authorPietro Cerutti <gahr@gahr.ch>
Tue, 17 Jan 2017 12:34:07 +0000 (12:34 +0000)
committerRichard Russon <rich@flatcap.org>
Thu, 19 Jan 2017 16:06:08 +0000 (16:06 +0000)
Closes: #301
browser.c
lib.c
lib.h
sidebar.c

index 360a0432389a561b41e1ca6c380cd45c8e3184b1..fd18d9b59a8856d4f1e5856a5bf6f8bd8e02e742 100644 (file)
--- a/browser.c
+++ b/browser.c
@@ -103,9 +103,9 @@ static int browser_compare_subject (const void *a, const void *b)
   struct folder_file *pb = (struct folder_file *) b;
 
   /* inbox should be sorted ahead of its siblings */
-  int same_path = mutt_same_path (pa->name, pb->name);
-  int r = (same_path && mutt_is_inbox (pa->name)) ? -1 :
-          (same_path && mutt_is_inbox (pb->name)) ?  1 :
+  int common_subpath = mutt_have_common_subpath (pa->name, pb->name);
+  int r = (common_subpath && mutt_is_inbox (pa->name)) ? -1 :
+          (common_subpath && mutt_is_inbox (pb->name)) ?  1 :
           mutt_strcoll  (pa->name, pb->name);
 
   return ((BrowserSort & SORT_REVERSE) ? -r : r);
diff --git a/lib.c b/lib.c
index 86d12f615e8b26e46375d4cc1da142ce40022ede..85374e486a173ff00258c0ec10a09d85379f0951 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -1113,7 +1113,20 @@ int mutt_is_inbox (const char *path)
   return ((plen >= 6) && (mutt_strcasecmp (path + plen - 6, "/inbox") == 0));
 }
 
-int mutt_same_path (const char *a, const char *b)
+/**
+ * mutt_have_common_subpath - check whether two paths have a common subpath.
+ * @param a First path.
+ * @param b Second path.
+ *
+ * @return 1 if a and b have a common subpath, 0 otherwise
+ *
+ * This function checks whether two paths (where the path separator is assumed
+ * to be '/', have a common subpath. Examples:
+ *
+ * /foo/bar/baz and /foo/hey/you do have a common subpath (/foo/)
+ * /apple/banana and /apples/bananas do NOT have a common subpath
+ */
+int mutt_have_common_subpath(const char *a, const char *b)
 {
   const char *a_end = strrchr (a, '/');
   const char *b_end = strrchr (b, '/');
@@ -1128,7 +1141,10 @@ int mutt_same_path (const char *a, const char *b)
 
   /* Compare the paths */
   size_t a_len = a_end - a;
-  return ((a_len == (b_end - b)) && (mutt_strncasecmp (a, b, a_len) == 0));
+  size_t b_len = b_end - b;
+  size_t min = MIN(a_len, b_len);
+  return (a[min] == '/') && (b[min] == '/') &&
+         (mutt_strncasecmp(a, b, min) == 0);
 }
 
 char * strfcpy (char *dest, const char *src, size_t dlen)
diff --git a/lib.h b/lib.h
index 7328bbcac7ef567d85a535948449540ec5f2167b..bc2e373b2357813394b33d79fe91deadcbab2cfe 100644 (file)
--- a/lib.h
+++ b/lib.h
@@ -227,7 +227,7 @@ void mutt_unlink (const char *);
 void safe_free (void *);
 void safe_realloc (void *, size_t);
 int  mutt_is_inbox (const char *path);
-int  mutt_same_path (const char *a, const char *b);
+int  mutt_have_common_subpath (const char *a, const char *b);
 
 const char *mutt_strsysexit(int e);
 #endif
index b455f3adfd0c0918a9794141cc277b698b919940..4c0baed7fd670096d4ae20dd358db7fe383c4849 100644 (file)
--- a/sidebar.c
+++ b/sidebar.c
@@ -321,9 +321,9 @@ static int cb_qsort_sbe (const void *a, const void *b)
       break;
     case SORT_PATH:
     {
-      int same_path = mutt_same_path (b1->path, b2->path);
-      result = (same_path && mutt_is_inbox (b1->path)) ? -1 :
-               (same_path && mutt_is_inbox (b2->path)) ?  1 :
+      int common_subpath = mutt_have_common_subpath (b1->path, b2->path);
+      result = (common_subpath && mutt_is_inbox (b1->path)) ? -1 :
+               (common_subpath && mutt_is_inbox (b2->path)) ?  1 :
                mutt_strcoll (b1->path, b2->path);           
       break;
     }