]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-config.c
moved _config_(get|set)_list () functions earlier in the file
[notmuch] / notmuch-config.c
index e98c39755f2f6e52d389481d06fbc333fd570c64..a124e34cf2d8a1beff94704c7a6179026ff85743 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <pwd.h>
 #include <netdb.h>
+#include <assert.h>
 
 static const char toplevel_config_comment[] =
     " .notmuch-config - Configuration file for the notmuch mail system\n"
@@ -69,7 +70,7 @@ static const char maildir_config_comment[] =
     "\tsynchronize_flags      Valid values are true and false.\n"
     "\n"
     "\tIf true, then the following maildir flags (in message filenames)\n"
-    "\twill be syncrhonized with the corresponding notmuch tags:\n"
+    "\twill be synchronized with the corresponding notmuch tags:\n"
     "\n"
     "\t\tFlag  Tag\n"
     "\t\t----  -------\n"
@@ -77,12 +78,22 @@ static const char maildir_config_comment[] =
     "\t\tF     flagged\n"
     "\t\tP     passed\n"
     "\t\tR     replied\n"
-    "\t\tS     unread (added when 'S' tag is not present)\n"
+    "\t\tS     unread (added when 'S' flag is not present)\n"
     "\n"
     "\tThe \"notmuch new\" command will notice flag changes in filenames\n"
     "\tand update tags, while the \"notmuch tag\" and \"notmuch restore\"\n"
     "\tcommands will notice tag changes and update flags in filenames\n";
 
+static const char search_config_comment[] =
+    " Search configuration\n"
+    "\n"
+    " The following option is supported here:\n"
+    "\n"
+    "\texclude_tags\n"
+    "\t\tA ;-separated list of tags that will be excluded from\n"
+    "\t\tsearch results by default.  Using an excluded tag in a\n"
+    "\t\tquery will override that exclusion.\n";
+
 struct _notmuch_config {
     char *filename;
     GKeyFile *key_file;
@@ -95,6 +106,8 @@ struct _notmuch_config {
     const char **new_tags;
     size_t new_tags_length;
     notmuch_bool_t maildir_synchronize_flags;
+    const char **search_exclude_tags;
+    size_t search_exclude_tags_length;
 };
 
 static int
@@ -109,13 +122,15 @@ notmuch_config_destructor (notmuch_config_t *config)
 static char *
 get_name_from_passwd_file (void *ctx)
 {
-    long pw_buf_size = sysconf(_SC_GETPW_R_SIZE_MAX);
-    char *pw_buf = talloc_zero_size (ctx, pw_buf_size);
+    long pw_buf_size;
+    char *pw_buf;
     struct passwd passwd, *ignored;
     char *name;
     int e;
 
+    pw_buf_size = sysconf(_SC_GETPW_R_SIZE_MAX);
     if (pw_buf_size == -1) pw_buf_size = 64;
+    pw_buf = talloc_size (ctx, pw_buf_size);
 
     while ((e = getpwuid_r (getuid (), &passwd, pw_buf,
                             pw_buf_size, &ignored)) == ERANGE) {
@@ -142,13 +157,16 @@ get_name_from_passwd_file (void *ctx)
 static char *
 get_username_from_passwd_file (void *ctx)
 {
-    long pw_buf_size = sysconf(_SC_GETPW_R_SIZE_MAX);
-    char *pw_buf = talloc_zero_size (ctx, pw_buf_size);
+    long pw_buf_size;
+    char *pw_buf;
     struct passwd passwd, *ignored;
     char *name;
     int e;
 
+    pw_buf_size = sysconf(_SC_GETPW_R_SIZE_MAX);
     if (pw_buf_size == -1) pw_buf_size = 64;
+    pw_buf = talloc_zero_size (ctx, pw_buf_size);
+
     while ((e = getpwuid_r (getuid (), &passwd, pw_buf,
                             pw_buf_size, &ignored)) == ERANGE) {
         pw_buf_size = pw_buf_size * 2;
@@ -215,6 +233,7 @@ notmuch_config_open (void *ctx,
     int file_had_new_group;
     int file_had_user_group;
     int file_had_maildir_group;
+    int file_had_search_group;
 
     if (is_new_ret)
        *is_new_ret = 0;
@@ -246,6 +265,8 @@ notmuch_config_open (void *ctx,
     config->new_tags = NULL;
     config->new_tags_length = 0;
     config->maildir_synchronize_flags = TRUE;
+    config->search_exclude_tags = NULL;
+    config->search_exclude_tags_length = 0;
 
     if (! g_key_file_load_from_file (config->key_file,
                                     config->filename,
@@ -289,6 +310,7 @@ notmuch_config_open (void *ctx,
     file_had_new_group = g_key_file_has_group (config->key_file, "new");
     file_had_user_group = g_key_file_has_group (config->key_file, "user");
     file_had_maildir_group = g_key_file_has_group (config->key_file, "maildir");
+    file_had_search_group = g_key_file_has_group (config->key_file, "search");
 
 
     if (notmuch_config_get_database_path (config) == NULL) {
@@ -339,6 +361,15 @@ notmuch_config_open (void *ctx,
        notmuch_config_set_new_tags (config, tags, 2);
     }
 
+    if (notmuch_config_get_search_exclude_tags (config, &tmp) == NULL) {
+       if (is_new) {
+           const char *tags[] = { "deleted", "spam" };
+           notmuch_config_set_search_exclude_tags (config, tags, 2);
+       } else {
+           notmuch_config_set_search_exclude_tags (config, NULL, 0);
+       }
+    }
+
     error = NULL;
     config->maildir_synchronize_flags =
        g_key_file_get_boolean (config->key_file,
@@ -381,6 +412,11 @@ notmuch_config_open (void *ctx,
                                maildir_config_comment, NULL);
     }
 
+    if (! file_had_search_group) {
+       g_key_file_set_comment (config->key_file, "search", NULL,
+                               search_config_comment, NULL);
+    }
+
     if (is_new_ret)
        *is_new_ret = is_new;
 
@@ -431,6 +467,48 @@ notmuch_config_save (notmuch_config_t *config)
     return 0;
 }
 
+static const char **
+_config_get_list (notmuch_config_t *config,
+                 const char *section, const char *key,
+                 const char ***outlist, size_t *list_length, size_t *ret_length)
+{
+    assert(outlist);
+
+    if (*outlist == NULL) {
+
+       char **inlist = g_key_file_get_string_list (config->key_file,
+                                            section, key, list_length, NULL);
+       if (inlist) {
+           unsigned int i;
+
+           *outlist = talloc_size (config, sizeof (char *) * (*list_length + 1));
+
+           for (i = 0; i < *list_length; i++)
+               (*outlist)[i] = talloc_strdup (*outlist, inlist[i]);
+
+           (*outlist)[i] = NULL;
+
+           g_strfreev (inlist);
+       }
+    }
+
+    if (ret_length)
+       *ret_length = *list_length;
+
+    return *outlist;
+}
+
+static void
+_config_set_list (notmuch_config_t *config,
+                 const char *group, const char *name,
+                 const char *list[],
+                 size_t length, const char ***config_var )
+{
+    g_key_file_set_string_list (config->key_file, group, name, list, length);
+    talloc_free (*config_var);
+    *config_var = NULL;
+}
+
 const char *
 notmuch_config_get_database_path (notmuch_config_t *config)
 {
@@ -516,91 +594,54 @@ notmuch_config_set_user_primary_email (notmuch_config_t *config,
 }
 
 const char **
-notmuch_config_get_user_other_email (notmuch_config_t *config,
-                                    size_t *length)
+notmuch_config_get_user_other_email (notmuch_config_t *config,   size_t *length)
 {
-    char **emails;
-    size_t emails_length;
-    unsigned int i;
-
-    if (config->user_other_email == NULL) {
-       emails = g_key_file_get_string_list (config->key_file,
-                                            "user", "other_email",
-                                            &emails_length, NULL);
-       if (emails) {
-           config->user_other_email = talloc_size (config,
-                                                   sizeof (char *) *
-                                                   (emails_length + 1));
-           for (i = 0; i < emails_length; i++)
-               config->user_other_email[i] = talloc_strdup (config->user_other_email,
-                                                            emails[i]);
-           config->user_other_email[i] = NULL;
-
-           g_strfreev (emails);
-
-           config->user_other_email_length = emails_length;
-       }
-    }
+    return _config_get_list (config, "user", "other_email",
+                            &(config->user_other_email),
+                            &(config->user_other_email_length), length);
+}
 
-    *length = config->user_other_email_length;
-    return config->user_other_email;
+const char **
+notmuch_config_get_new_tags (notmuch_config_t *config,   size_t *length)
+{
+    return _config_get_list (config, "new", "tags",
+                            &(config->new_tags),
+                            &(config->new_tags_length), length);
 }
 
 void
 notmuch_config_set_user_other_email (notmuch_config_t *config,
-                                    const char *other_email[],
+                                    const char *list[],
                                     size_t length)
 {
-    g_key_file_set_string_list (config->key_file,
-                               "user", "other_email",
-                               other_email, length);
+    _config_set_list (config, "user", "other_email", list, length,
+                    &(config->user_other_email));
+}
 
-    talloc_free (config->user_other_email);
-    config->user_other_email = NULL;
+void
+notmuch_config_set_new_tags (notmuch_config_t *config,
+                                    const char *list[],
+                                    size_t length)
+{
+    _config_set_list (config, "new", "tags", list, length,
+                    &(config->new_tags));
 }
 
 const char **
-notmuch_config_get_new_tags (notmuch_config_t *config,
-                            size_t *length)
+notmuch_config_get_search_exclude_tags (notmuch_config_t *config, size_t *length)
 {
-    char **tags;
-    size_t tags_length;
-    unsigned int i;
-
-    if (config->new_tags == NULL) {
-       tags = g_key_file_get_string_list (config->key_file,
-                                          "new", "tags",
-                                          &tags_length, NULL);
-       if (tags) {
-           config->new_tags = talloc_size (config,
-                                           sizeof (char *) *
-                                           (tags_length + 1));
-           for (i = 0; i < tags_length; i++)
-               config->new_tags[i] = talloc_strdup (config->new_tags,
-                                                    tags[i]);
-           config->new_tags[i] = NULL;
-
-           g_strfreev (tags);
-
-           config->new_tags_length = tags_length;
-       }
-    }
-
-    *length = config->new_tags_length;
-    return config->new_tags;
+    return _config_get_list (config, "search", "exclude_tags",
+                            &(config->search_exclude_tags),
+                            &(config->search_exclude_tags_length), length);
 }
 
 void
-notmuch_config_set_new_tags (notmuch_config_t *config,
-                            const char *new_tags[],
-                            size_t length)
+notmuch_config_set_search_exclude_tags (notmuch_config_t *config,
+                                     const char *list[],
+                                     size_t length)
 {
-    g_key_file_set_string_list (config->key_file,
-                               "new", "tags",
-                               new_tags, length);
-
-    talloc_free (config->new_tags);
-    config->new_tags = NULL;
+    _config_set_list (config, "search", "exclude_tags", list, length,
+                     &(config->search_exclude_tags));
 }
 
 /* Given a configuration item of the form <group>.<key> return the
@@ -730,6 +771,8 @@ notmuch_config_command_set (void *ctx, char *item, int argc, char *argv[])
 int
 notmuch_config_command (void *ctx, int argc, char *argv[])
 {
+    argc--; argv++; /* skip subcommand argument */
+
     if (argc < 2) {
        fprintf (stderr, "Error: notmuch config requires at least two arguments.\n");
        return 1;