]> git.notmuchmail.org Git - notmuch/commitdiff
config: allow custom separators in author lists
authorLars Kotthoff <larsko@uwyo.edu>
Fri, 22 Dec 2023 21:06:34 +0000 (14:06 -0700)
committerDavid Bremner <david@tethera.net>
Fri, 26 Jul 2024 06:59:11 +0000 (15:59 +0900)
Allow distinguishing between commas separating authors and separating
first and last names.

Amended by db: reformat NEWS entry and commit message. Tweaked
whitespace in lib/thread.cc.

NEWS
doc/man1/notmuch-config.rst
lib/config.cc
lib/notmuch.h
lib/thread.cc
test/T030-config.sh
test/T055-path-config.sh
test/T206-author-separator.sh [new file with mode: 0755]
test/T590-libconfig.sh

diff --git a/NEWS b/NEWS
index cf8107f26362431549dc410cb8379de5c10221f1..8c0ab15bf6ef8255e006144ce1a9df395f6dd341 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,14 @@
+Notmuch 0.39 (UNRELEASED)
+=========================
+
+General
+-------
+
+Allow to customize the separator between individual and matched and
+non-matched authors when showing threads. See
+`search.authors_separator` and `search.authors_matched_separator` in
+notmuch-config(1).
+
 Notmuch 0.38.3 (2024-03-09)
 ===========================
 
index bd34afa40ee6975a7f1aa316bd4e22e3f1605070..5106655f40d283fbccc3554ea272d6f55ce217a0 100644 (file)
@@ -273,6 +273,19 @@ paths are presumed relative to `$HOME` for items in section
     Default: empty list. Note that :any:`notmuch-setup(1)` puts
     ``deleted;spam`` here when creating new configuration file.
 
+.. nmconfig:: search.authors_separator
+
+    The string to separate authors when showing a thread.
+
+    Default: ,
+
+.. nmconfig:: search.authors_matched_separator
+
+    The string to separate matched from non-matched authors when showing a
+    thread.
+
+    Default: |
+
 .. nmconfig:: show.extra_headers
 
     By default :any:`notmuch-show(1)` includes the following headers
index 6cd15fab26bc16610e1c56e1b5e0019b41279259..acb397ecc14efbd093f167df41747b69c2277cbb 100644 (file)
@@ -608,6 +608,10 @@ _notmuch_config_key_to_string (notmuch_config_key_t key)
        return "database.autocommit";
     case NOTMUCH_CONFIG_EXTRA_HEADERS:
        return "show.extra_headers";
+    case NOTMUCH_CONFIG_AUTHORS_SEPARATOR:
+       return "search.authors_separator";
+    case NOTMUCH_CONFIG_AUTHORS_MATCHED_SEPARATOR:
+       return "search.authors_matched_separator";
     case NOTMUCH_CONFIG_INDEX_AS_TEXT:
        return "index.as_text";
     default:
@@ -658,6 +662,10 @@ _notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
        return "";
     case NOTMUCH_CONFIG_AUTOCOMMIT:
        return "8000";
+    case NOTMUCH_CONFIG_AUTHORS_SEPARATOR:
+       return ", ";
+    case NOTMUCH_CONFIG_AUTHORS_MATCHED_SEPARATOR:
+       return "| ";
     case NOTMUCH_CONFIG_EXTRA_HEADERS:
     case NOTMUCH_CONFIG_HOOK_DIR:
     case NOTMUCH_CONFIG_BACKUP_DIR:
index 4e2b0fa48d3daf46dc75f51ded735a95424e9477..937fa24edf069aa3bb2cef64ecf0c05e0851bf56 100644 (file)
@@ -2565,6 +2565,8 @@ typedef enum {
     NOTMUCH_CONFIG_AUTOCOMMIT,
     NOTMUCH_CONFIG_EXTRA_HEADERS,
     NOTMUCH_CONFIG_INDEX_AS_TEXT,
+    NOTMUCH_CONFIG_AUTHORS_SEPARATOR,
+    NOTMUCH_CONFIG_AUTHORS_MATCHED_SEPARATOR,
     NOTMUCH_CONFIG_LAST
 } notmuch_config_key_t;
 
index 60e9a666ec1b348c7b2f413c6da94d4655188831..168a9e8b397fc9418c2a873c3b56e2cab0494c74 100644 (file)
@@ -122,21 +122,28 @@ _thread_add_matched_author (notmuch_thread_t *thread,
 
 /* Construct an authors string from matched_authors_array and
  * authors_array. The string contains matched authors first, then
- * non-matched authors (with the two groups separated by '|'). Within
- * each group, authors are listed in date order. */
+ * non-matched authors (with the two groups separated by '|' or the custom
+ * separator defined in the configuration). Within each group, authors are
+ * listed in date order and separated by ',' or the custom separator defined in
+ * the configuration. */
 static void
 _resolve_thread_authors_string (notmuch_thread_t *thread)
 {
     unsigned int i;
     char *author;
     int first_non_matched_author = 1;
+    const char *authors_sep = notmuch_config_get (thread->notmuch,
+                                                 NOTMUCH_CONFIG_AUTHORS_SEPARATOR);
+    const char *authors_matched_sep = notmuch_config_get (thread->notmuch,
+                                                         NOTMUCH_CONFIG_AUTHORS_MATCHED_SEPARATOR);
 
     /* First, list all matched authors in date order. */
     for (i = 0; i < thread->matched_authors_array->len; i++) {
        author = (char *) g_ptr_array_index (thread->matched_authors_array, i);
        if (thread->authors)
-           thread->authors = talloc_asprintf (thread, "%s%s",
+           thread->authors = talloc_asprintf (thread, "%s%s%s",
                                               thread->authors,
+                                              authors_sep,
                                               author);
        else
            thread->authors = author;
@@ -149,12 +156,14 @@ _resolve_thread_authors_string (notmuch_thread_t *thread)
                                          author, NULL, NULL))
            continue;
        if (first_non_matched_author) {
-           thread->authors = talloc_asprintf (thread, "%s%s",
+           thread->authors = talloc_asprintf (thread, "%s%s%s",
                                               thread->authors,
+                                              authors_matched_sep,
                                               author);
        } else {
-           thread->authors = talloc_asprintf (thread, "%s%s",
+           thread->authors = talloc_asprintf (thread, "%s%s%s",
                                               thread->authors,
+                                              authors_sep,
                                               author);
        }
 
index 621e0b69721091a5f7383db7db726004fadc2c4f..1d2b7df8def6c605fe82841abb25fe7f57edb065 100755 (executable)
@@ -63,6 +63,8 @@ index.as_text=
 maildir.synchronize_flags=true
 new.ignore=
 new.tags=unread;inbox
+search.authors_matched_separator=| 
+search.authors_separator=, 
 search.exclude_tags=
 user.name=Notmuch Test Suite
 user.other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org
index 1feb5624c41b8af06fab0750f7bc70395b7a4504..049b745e0a6d807218ad5c0c6526b8e59116ea34 100755 (executable)
@@ -303,6 +303,8 @@ index.as_text=
 maildir.synchronize_flags=true
 new.ignore=
 new.tags=unread;inbox
+search.authors_matched_separator=| 
+search.authors_separator=, 
 search.exclude_tags=
 user.name=Notmuch Test Suite
 user.other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org
@@ -325,6 +327,8 @@ database.mail_root
 database.path
 maildir.synchronize_flags
 new.tags
+search.authors_matched_separator
+search.authors_separator
 user.name
 user.other_email
 user.primary_email
diff --git a/test/T206-author-separator.sh b/test/T206-author-separator.sh
new file mode 100755 (executable)
index 0000000..b8b1afb
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+test_description="custom separator for authors"
+. $(dirname "$0")/test-lib.sh || exit 1
+
+test_begin_subtest "Adding parent message"
+generate_message [body]=findme [id]=new-parent-id [subject]=author-reorder-threadtest '[from]="User <user@example.com>"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
+output=$(NOTMUCH_NEW)
+test_expect_equal "$output" "Added 1 new message to the database."
+
+test_begin_subtest "Adding initial child message"
+generate_message [body]=findme "[in-reply-to]=\<new-parent-id\>" [subject]=author-reorder-threadtest '[from]="last name, first name <user1@example.com>"' '[date]="Sat, 01 Jan 2000 12:01:00 -0000"'
+output=$(NOTMUCH_NEW)
+test_expect_equal "$output" "Added 1 new message to the database."
+
+test_begin_subtest "Adding second child message"
+generate_message [body]=findme "[in-reply-to]=\<new-parent-id\>" [subject]=author-reorder-threadtest '[from]="first last <user2@example.com>"' '[date]="Sat, 01 Jan 2000 12:02:00 -0000"'
+output=$(NOTMUCH_NEW)
+test_expect_equal "$output" "Added 1 new message to the database."
+
+test_begin_subtest "Custom separarator is used"
+notmuch config set search.authors_matched_separator "#"
+notmuch config set search.authors_separator ";"
+output=$(notmuch search from:user | notmuch_search_sanitize)
+test_expect_equal "$output" "thread:XXX   2000-01-01 [1/3] User#last name, first name;first last; author-reorder-threadtest (inbox unread)"
+
+test_done
index 9326ba3e3d72fa856a02458dfcfe0f67084ed1b4..9b3648957b6a10eb1963815078f4bbf056ff2c80 100755 (executable)
@@ -441,6 +441,8 @@ cat <<'EOF' >EXPECTED
 11: '8000'
 12: 'NULL'
 13: ''
+14: ', '
+15: '| '
 == stderr ==
 EOF
 unset MAILDIR
@@ -725,6 +727,8 @@ test_expect_equal_file EXPECTED OUTPUT
 
 test_begin_subtest "list by keys (ndlc)"
 notmuch config set search.exclude_tags "foo;bar;fub"
+notmuch config set search.authors_matched_separator "| "
+notmuch config set search.authors_separator ", "
 notmuch config set new.ignore "sekrit_junk"
 notmuch config set index.as_text "text/"
 cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
@@ -754,6 +758,8 @@ cat <<'EOF' >EXPECTED
 11: '8000'
 12: 'NULL'
 13: 'text/'
+14: ', '
+15: '| '
 == stderr ==
 EOF
 test_expect_equal_file EXPECTED OUTPUT
@@ -789,6 +795,8 @@ cat <<'EOF' >EXPECTED
 11: '8000'
 12: 'NULL'
 13: ''
+14: ', '
+15: '| '
 == stderr ==
 EOF
 test_expect_equal_file EXPECTED OUTPUT.clean
@@ -865,6 +873,8 @@ key with spaces value, with, spaces!
 maildir.synchronize_flags true
 new.ignore sekrit_junk
 new.tags unread;inbox
+search.authors_matched_separator | 
+search.authors_separator , 
 search.exclude_tags foo;bar;fub
 show.extra_headers (null)
 test.key1 testvalue1