X-Git-Url: https://git.cworth.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-config.c;h=e9456d794456c080e81abbd6a00efcb6b123c3c4;hp=c42835762e959e72973b3227144e292d2db97aa7;hb=HEAD;hpb=dd9112e7d8e89e8566b90379f5f3b1461a2d2845 diff --git a/notmuch-config.c b/notmuch-config.c index c4283576..8123e438 100644 --- a/notmuch-config.c +++ b/notmuch-config.c @@ -24,6 +24,7 @@ #include #include +#include "path-util.h" #include "unicode-util.h" static const char toplevel_config_comment[] = @@ -31,7 +32,7 @@ static const char toplevel_config_comment[] = "\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 [] = { @@ -114,14 +115,14 @@ struct config_group { }, }; -struct _notmuch_config { +struct _notmuch_conffile { char *filename; GKeyFile *key_file; bool is_new; }; static int -notmuch_config_destructor (notmuch_config_t *config) +notmuch_conffile_destructor (notmuch_conffile_t *config) { if (config->key_file) g_key_file_free (config->key_file); @@ -130,7 +131,7 @@ notmuch_config_destructor (notmuch_config_t *config) } static bool -get_config_from_file (notmuch_config_t *config, bool create_new) +get_config_from_file (notmuch_conffile_t *config, bool create_new) { #define BUF_SIZE 4096 char *config_str = NULL; @@ -245,21 +246,21 @@ get_config_from_file (notmuch_config_t *config, bool create_new) * The default configuration also contains comments to guide the * user in editing the file directly. */ -notmuch_config_t * -notmuch_config_open (notmuch_database_t *notmuch, - const char *filename, - notmuch_command_mode_t config_mode) +notmuch_conffile_t * +notmuch_conffile_open (notmuch_database_t *notmuch, + const char *filename, + bool create) { char *notmuch_config_env = NULL; - notmuch_config_t *config = talloc_zero (notmuch, notmuch_config_t); + notmuch_conffile_t *config = talloc_zero (notmuch, notmuch_conffile_t); if (config == NULL) { fprintf (stderr, "Out of memory.\n"); return NULL; } - talloc_set_destructor (config, notmuch_config_destructor); + talloc_set_destructor (config, notmuch_conffile_destructor); if (filename) { config->filename = talloc_strdup (config, filename); @@ -272,40 +273,42 @@ notmuch_config_open (notmuch_database_t *notmuch, config->key_file = g_key_file_new (); - if (config_mode & NOTMUCH_COMMAND_CONFIG_OPEN) { - bool create_new = (config_mode & NOTMUCH_COMMAND_CONFIG_CREATE) != 0; - - if (! get_config_from_file (config, create_new)) { - talloc_free (config); - return NULL; - } + if (! get_config_from_file (config, create)) { + talloc_free (config); + return NULL; } - if (config->is_new) - g_key_file_set_comment (config->key_file, NULL, NULL, - toplevel_config_comment, NULL); - for (size_t i = 0; i < ARRAY_SIZE (group_comment_table); i++) { const char *name = group_comment_table[i].group_name; if (! g_key_file_has_group (config->key_file, name)) { /* Force group to exist before adding comment */ g_key_file_set_value (config->key_file, name, "dummy_key", "dummy_val"); g_key_file_remove_key (config->key_file, name, "dummy_key", NULL); - g_key_file_set_comment (config->key_file, name, NULL, - group_comment_table[i].comment, NULL); + if (config->is_new && (i == 0) ) { + const char *comment; + + comment = talloc_asprintf (config, "%s\n%s", + toplevel_config_comment, + group_comment_table[i].comment); + g_key_file_set_comment (config->key_file, name, NULL, comment, + NULL); + } else { + g_key_file_set_comment (config->key_file, name, NULL, + group_comment_table[i].comment, NULL); + } } } return config; } -/* Close the given notmuch_config_t object, freeing all resources. +/* Close the given notmuch_conffile_t object, freeing all resources. * * Note: Any changes made to the configuration are *not* saved by this - * function. To save changes, call notmuch_config_save before - * notmuch_config_close. + * function. To save changes, call notmuch_conffile_save before + * notmuch_conffile_close. */ void -notmuch_config_close (notmuch_config_t *config) +notmuch_conffile_close (notmuch_conffile_t *config) { talloc_free (config); } @@ -318,7 +321,7 @@ notmuch_config_close (notmuch_config_t *config) * printing a description of the error to stderr). */ int -notmuch_config_save (notmuch_config_t *config) +notmuch_conffile_save (notmuch_conffile_t *config) { size_t length; char *data, *filename; @@ -331,7 +334,7 @@ notmuch_config_save (notmuch_config_t *config) } /* Try not to overwrite symlinks. */ - filename = canonicalize_file_name (config->filename); + filename = notmuch_canonicalize_file_name (config->filename); if (! filename) { if (errno == ENOENT) { filename = strdup (config->filename); @@ -368,76 +371,79 @@ notmuch_config_save (notmuch_config_t *config) } bool -notmuch_config_is_new (notmuch_config_t *config) +notmuch_conffile_is_new (notmuch_conffile_t *config) { return config->is_new; } static void -_config_set (notmuch_config_t *config, +_config_set (notmuch_conffile_t *config, const char *group, const char *key, const char *value) { g_key_file_set_string (config->key_file, group, key, value); } static void -_config_set_list (notmuch_config_t *config, +_config_set_list (notmuch_conffile_t *config, const char *group, const char *key, const char *list[], size_t length) { - g_key_file_set_string_list (config->key_file, group, key, list, length); + if (length > 1) + g_key_file_set_string_list (config->key_file, group, key, list, length); + else + g_key_file_set_string (config->key_file, group, key, list[0]); } void -notmuch_config_set_database_path (notmuch_config_t *config, - const char *database_path) +notmuch_conffile_set_database_path (notmuch_conffile_t *config, + const char *database_path) { _config_set (config, "database", "path", database_path); } void -notmuch_config_set_user_name (notmuch_config_t *config, - const char *user_name) +notmuch_conffile_set_user_name (notmuch_conffile_t *config, + const char *user_name) { _config_set (config, "user", "name", user_name); } void -notmuch_config_set_user_primary_email (notmuch_config_t *config, - const char *primary_email) +notmuch_conffile_set_user_primary_email (notmuch_conffile_t *config, + const char *primary_email) { _config_set (config, "user", "primary_email", primary_email); } void -notmuch_config_set_user_other_email (notmuch_config_t *config, - const char *list[], - size_t length) +notmuch_conffile_set_user_other_email (notmuch_conffile_t *config, + const char *list[], + size_t length) { _config_set_list (config, "user", "other_email", list, length); } void -notmuch_config_set_new_tags (notmuch_config_t *config, - const char *list[], - size_t length) +notmuch_conffile_set_new_tags (notmuch_conffile_t *config, + const char *list[], + size_t length) { _config_set_list (config, "new", "tags", list, length); } void -notmuch_config_set_new_ignore (notmuch_config_t *config, - const char *list[], - size_t length) +notmuch_conffile_set_new_ignore (notmuch_conffile_t *config, + const char *list[], + size_t length) { _config_set_list (config, "new", "ignore", list, length); } void -notmuch_config_set_search_exclude_tags (notmuch_config_t *config, - const char *list[], - size_t length) +notmuch_conffile_set_search_exclude_tags (notmuch_conffile_t *config, + const char *list[], + size_t length) { _config_set_list (config, "search", "exclude_tags", list, length); } @@ -515,14 +521,15 @@ typedef struct config_key { 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 }, + { "squery.", true, validate_field_name }, }; -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++) { @@ -541,11 +548,18 @@ notmuch_config_command_get (notmuch_database_t *notmuch, char *item) { 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; } @@ -582,13 +596,14 @@ _set_db_config (notmuch_database_t *notmuch, const char *key, int argc, char **a } static int -notmuch_config_command_set (notmuch_config_t *config, notmuch_database_t *notmuch, +notmuch_config_command_set (notmuch_database_t *notmuch, 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; + int opt_index, ret; char *item; notmuch_opt_desc_t options[] = { @@ -629,6 +644,11 @@ notmuch_config_command_set (notmuch_config_t *config, notmuch_database_t *notmuc if (_item_split (item, &group, &key)) return 1; + config = notmuch_conffile_open (notmuch, + notmuch_config_path (notmuch), false); + if (! config) + return 1; + /* With only the name of an item, we clear it from the * configuration file. * @@ -649,7 +669,11 @@ notmuch_config_command_set (notmuch_config_t *config, notmuch_database_t *notmuc break; } - return notmuch_config_save (config); + ret = notmuch_conffile_save (config); + + notmuch_conffile_close (config); + + return ret; } static @@ -665,6 +689,9 @@ _notmuch_config_list_built_with () printf ("%sretry_lock=%s\n", BUILT_WITH_PREFIX, notmuch_built_with ("retry_lock") ? "true" : "false"); + printf ("%ssexp_queries=%s\n", + BUILT_WITH_PREFIX, + notmuch_built_with ("sexp_queries") ? "true" : "false"); } static int @@ -685,8 +712,7 @@ notmuch_config_command_list (notmuch_database_t *notmuch) } int -notmuch_config_command (notmuch_config_t *config, notmuch_database_t *notmuch, - int argc, char *argv[]) +notmuch_config_command (notmuch_database_t *notmuch, int argc, char *argv[]) { int ret; int opt_index; @@ -695,10 +721,6 @@ notmuch_config_command (notmuch_config_t *config, notmuch_database_t *notmuch, if (opt_index < 0) return EXIT_FAILURE; - if (notmuch_requested_db_uuid) - fprintf (stderr, "Warning: ignoring --uuid=%s\n", - notmuch_requested_db_uuid); - /* skip at least subcommand argument */ argc -= opt_index; argv += opt_index; @@ -716,7 +738,7 @@ notmuch_config_command (notmuch_config_t *config, notmuch_database_t *notmuch, } ret = notmuch_config_command_get (notmuch, argv[1]); } else if (strcmp (argv[0], "set") == 0) { - ret = notmuch_config_command_set (config, notmuch, argc, argv); + ret = notmuch_config_command_set (notmuch, argc, argv); } else if (strcmp (argv[0], "list") == 0) { ret = notmuch_config_command_list (notmuch); } else { @@ -730,8 +752,8 @@ notmuch_config_command (notmuch_config_t *config, notmuch_database_t *notmuch, } void -notmuch_config_set_maildir_synchronize_flags (notmuch_config_t *config, - bool synchronize_flags) +notmuch_conffile_set_maildir_synchronize_flags (notmuch_conffile_t *config, + bool synchronize_flags) { g_key_file_set_boolean (config->key_file, "maildir", "synchronize_flags", synchronize_flags);