]> git.cworth.org Git - notmuch/blobdiff - notmuch-config.c
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / notmuch-config.c
index c42835762e959e72973b3227144e292d2db97aa7..8123e4381003bd89509edc8d7970737893b1992b 100644 (file)
@@ -24,6 +24,7 @@
 #include <netdb.h>
 #include <assert.h>
 
+#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);