+Notmuch 0.33 (UNRELEASED)
+=========================
+
+Emacs
+-----
+
+`notmuch` no longer sets `mail-user-agent` on load. To restore the
+previous behaviour of using notmuch to send mail by default, customize
+`mail-user-agent` to `notmuch-user-agent`.
+
+`notmuch-company` now works in `org-msg`.
+
+Vim
+---
+
+Respect excluded tags when showing a thread.
+
+ Notmuch 0.32.3 (2021-08-17)
+ ===========================
+
+ Library
+ -------
+
+ Restore location of database via `MAILDIR` environment variable, which
+ was broken in 0.32.
+
+ Bump libnotmuch minor version to match the documentation in
+ `notmuch.h`.
+
+ Correct documentation for deprecated database opening functions to
+ point out that they (still) do not load configuration information.
+
+ CLI
+ ---
+
+ Restore "notmuch config get built_with.*", which was broken in 0.32.
+
Notmuch 0.32.2 (2021-06-27)
===========================
Restore the dynamically bound variables `tag-changes` and `query` in
in `notmuch-before-tag-hook` and `notmuch-after-tag-hook`.
+Add `notmuch-jump-key` face to fontify keys in `notmuch-jump` and
+related functions. To ensure backward compatibility, the new face
+inherits from `minibuffer-prompt`.
+
Notmuch 0.32 (2021-05-02)
=========================
* version in Makefile.local.
*/
#define LIBNOTMUCH_MAJOR_VERSION 5
- #define LIBNOTMUCH_MINOR_VERSION 3
+ #define LIBNOTMUCH_MINOR_VERSION 4
#define LIBNOTMUCH_MICRO_VERSION 0
/**
* Deprecated alias for notmuch_database_open_with_config with
- * config_path=error_message=NULL
+ * config_path="" and error_message=NULL
* @deprecated Deprecated as of libnotmuch 5.4 (notmuch 0.32)
*/
/* NOTMUCH_DEPRECATED(5, 4) */
notmuch_database_t **database);
/**
* Deprecated alias for notmuch_database_open_with_config with
- * config_path=NULL
+ * config_path=""
*
* @deprecated Deprecated as of libnotmuch 5.4 (notmuch 0.32)
*
* have no effect.
*
* For writable databases, notmuch_database_close commits all changes
- * to disk before closing the database. If the caller is currently in
- * an atomic section (there was a notmuch_database_begin_atomic
- * without a matching notmuch_database_end_atomic), this will discard
- * changes made in that atomic section (but still commit changes made
- * prior to entering the atomic section).
+ * to disk before closing the database, unless the caller is currently
+ * in an atomic section (there was a notmuch_database_begin_atomic
+ * without a matching notmuch_database_end_atomic). In this case
+ * changes since the last commit are discarded. @see
+ * notmuch_database_end_atomic for more information.
*
* Return value:
*
notmuch_database_begin_atomic (notmuch_database_t *notmuch);
/**
- * Indicate the end of an atomic database operation.
+ * Indicate the end of an atomic database operation. If repeated
+ * (with matching notmuch_database_begin_atomic) "database.autocommit"
+ * times, commit the the transaction and all previous (non-cancelled)
+ * transactions to the database.
*
* Return value:
*
NOTMUCH_CONFIG_PRIMARY_EMAIL,
NOTMUCH_CONFIG_OTHER_EMAIL,
NOTMUCH_CONFIG_USER_NAME,
+ NOTMUCH_CONFIG_AUTOCOMMIT,
NOTMUCH_CONFIG_LAST
} notmuch_config_key_t;
}
}
+ if (! *database_path) {
+ *database_path = getenv ("MAILDIR");
+ }
+
if (! *database_path) {
notmuch_status_t status;
return NOTMUCH_STATUS_SUCCESS;
}
-notmuch_database_t *
+static notmuch_database_t *
_alloc_notmuch ()
{
notmuch_database_t *notmuch;
notmuch->writable_xapian_db = NULL;
notmuch->config_path = NULL;
notmuch->atomic_nesting = 0;
+ notmuch->transaction_count = 0;
+ notmuch->transaction_threshold = 0;
notmuch->view = 1;
return notmuch;
}
_notmuch_config_cache (notmuch, NOTMUCH_CONFIG_DATABASE_PATH, path);
}
-static void
-_init_libs ()
-{
-
- static int initialized = 0;
-
- /* Initialize the GLib type system and threads */
-#if ! GLIB_CHECK_VERSION (2, 35, 1)
- g_type_init ();
-#endif
-
- /* Initialize gmime */
- if (! initialized) {
- g_mime_init ();
- initialized = 1;
- }
-}
-
static void
_load_database_state (notmuch_database_t *notmuch)
{
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
char *incompat_features;
char *message = NULL;
+ const char *autocommit_str;
+ char *autocommit_end;
unsigned int version;
const char *database_path = notmuch_database_get_path (notmuch);
if (status)
goto DONE;
+ autocommit_str = notmuch_config_get (notmuch, NOTMUCH_CONFIG_AUTOCOMMIT);
+ if (unlikely (! autocommit_str)) {
+ INTERNAL_ERROR ("missing configuration for autocommit");
+ }
+ notmuch->transaction_threshold = strtoul (autocommit_str, &autocommit_end, 10);
+ if (*autocommit_end != '\0')
+ INTERNAL_ERROR ("Malformed database database.autocommit value: %s", autocommit_str);
+
status = _notmuch_database_setup_standard_query_fields (notmuch);
if (status)
goto DONE;
GKeyFile *key_file = NULL;
bool split = false;
- _init_libs ();
+ _notmuch_init ();
notmuch = _alloc_notmuch ();
if (! notmuch) {
int err;
bool split = false;
- _init_libs ();
+ _notmuch_init ();
notmuch = _alloc_notmuch ();
if (! notmuch) {
return NOTMUCH_STATUS_SUCCESS;
}
-notmuch_status_t
+static notmuch_status_t
_maybe_load_config_from_database (notmuch_database_t *notmuch,
GKeyFile *key_file,
const char *database_path,
GKeyFile *key_file = NULL;
bool split = false;
- _init_libs ();
+ _notmuch_init ();
notmuch = _alloc_notmuch ();
if (! notmuch) {
"\n"
" For more information about notmuch, see https://notmuchmail.org";
-struct config_group {
+static const struct config_group {
const char *group_name;
const char *comment;
} group_comment_table [] = {
bool (*validate)(const char *);
} config_key_info_t;
-static struct config_key
+static const struct config_key
config_key_table[] = {
{ "index.decrypt", false, NULL },
{ "index.header.", true, validate_field_name },
{ "query.", true, NULL },
};
-static config_key_info_t *
+static const config_key_info_t *
_config_key_info (const char *item)
{
for (size_t i = 0; i < ARRAY_SIZE (config_key_table); i++) {
{
notmuch_config_values_t *list;
- for (list = notmuch_config_get_values_string (notmuch, item);
- notmuch_config_values_valid (list);
- notmuch_config_values_move_to_next (list)) {
- const char *val = notmuch_config_values_get (list);
- puts (val);
+ if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) {
+ if (notmuch_built_with (item + strlen (BUILT_WITH_PREFIX)))
+ puts ("true");
+ else
+ puts ("false");
+ } else {
+ for (list = notmuch_config_get_values_string (notmuch, item);
+ notmuch_config_values_valid (list);
+ notmuch_config_values_move_to_next (list)) {
+ const char *val = notmuch_config_values_get (list);
+ puts (val);
+ }
}
return EXIT_SUCCESS;
}
int argc, char *argv[])
{
char *group, *key;
- config_key_info_t *key_info;
+ const config_key_info_t *key_info;
notmuch_conffile_t *config;
bool update_database = false;
int opt_index, ret;
built_with.compact=something
built_with.field_processor=something
built_with.retry_lock=something
+database.autocommit=8000
database.mail_root=MAIL_DIR
database.path=MAIL_DIR
foo.list=this;is another;list value;
output=$(notmuch config get ${key})
test_expect_equal "${output}" "${value}"
+ test_begin_subtest "set built_with.* yields error"
+ test_expect_code 1 "notmuch config set built_with.compact false"
+
+ test_begin_subtest "get built_with.{compact,field_processor} prints true"
+ for key in compact field_processor; do
+ notmuch config get built_with.${key}
+ done > OUTPUT
+ cat <<EOF > EXPECTED
+ true
+ true
+ EOF
+ test_expect_equal_file EXPECTED OUTPUT
+
+ test_begin_subtest "get built_with.nonexistent prints false"
+ output=$(notmuch config get built_with.nonexistent)
+ test_expect_equal "$output" "false"
+
test_done
unset DATABASE_PATH
unset NOTMUCH_PROFILE
unset XAPIAN_PATH
+ unset MAILDIR
rm -f "$HOME/mail"
cp notmuch-config-backup.${test_name} ${NOTMUCH_CONFIG}
}
unset DATABASE_PATH
}
+ maildir_env_config () {
+ local dir
+ backup_config
+ dir="${HOME}/env_points_here"
+ ln -s $MAIL_DIR $dir
+ export MAILDIR=$dir
+ notmuch config set database.path
+ notmuch config set database.mail_root
+ XAPIAN_PATH="${MAIL_DIR}/.notmuch/xapian"
+ unset DATABASE_PATH
+ }
+
xdg_config () {
local dir
local profile=${1:-default}
notmuch --config=${CONFIG_PATH} config set database.path
}
- for config in traditional split XDG XDG+profile symlink home_mail; do
+ for config in traditional split XDG XDG+profile symlink home_mail maildir_env; do
#start each set of tests with an known set of messages
add_email_corpus
home_mail)
home_mail_config
;;
+ maildir_env)
+ maildir_env_config
+ ;;
esac
test_begin_subtest "count ($config)"
> basic reply test
EOF
test_expect_equal_file EXPECTED OUTPUT
+
test_begin_subtest "insert+search ($config)"
generate_message \
"[subject]=\"insert-subject\"" \
test_expect_equal "${output}+${output2}" "${value}+"
test_begin_subtest "Config list ($config)"
- notmuch config list | notmuch_dir_sanitize | sed -e "s/^database.backup_dir=.*$/database.backup_dir/" \
- -e "s/^database.hook_dir=.*$/database.hook_dir/" \
- -e "s/^database.path=.*$/database.path/" \
- -e "s,^database.mail_root=CWD/home/mail,database.mail_root=MAIL_DIR," \
- > OUTPUT
+ notmuch config list | notmuch_dir_sanitize | \
+ sed -e "s/^database.backup_dir=.*$/database.backup_dir/" \
+ -e "s/^database.hook_dir=.*$/database.hook_dir/" \
+ -e "s/^database.path=.*$/database.path/" \
+ -e "s,^database.mail_root=CWD/home/mail,database.mail_root=MAIL_DIR," \
+ -e "s,^database.mail_root=CWD/home/env_points_here,database.mail_root=MAIL_DIR," \
+ > OUTPUT
cat <<EOF > EXPECTED
built_with.compact=true
built_with.field_processor=true
built_with.retry_lock=true
+database.autocommit=8000
database.backup_dir
database.hook_dir
database.mail_root=MAIL_DIR