]> git.notmuchmail.org Git - notmuch/commitdiff
notmuch config: Allow for new "notmuch config set" in addition to get
authorCarl Worth <cworth@cworth.org>
Wed, 27 Oct 2010 22:38:16 +0000 (15:38 -0700)
committerCarl Worth <cworth@cworth.org>
Wed, 27 Oct 2010 22:38:16 +0000 (15:38 -0700)
It is now possible to set configuration items from the command-line in
a manner quite similar to the support for querying configuration
items.

notmuch-config.c
notmuch.1
notmuch.c

index 188ecd7170486e44e8f5d7685b4eb7db0ee46619..dcdb0369c917cc562c28c5088c3443df0a616f6a 100644 (file)
@@ -562,29 +562,42 @@ notmuch_config_set_new_tags (notmuch_config_t *config,
     config->new_tags = NULL;
 }
 
-int
-notmuch_config_command (void *ctx, int argc, char *argv[])
+/* Given a configuration item of the form <group>.<key> return the
+ * component group and key. If any error occurs, print a message on
+ * stderr and return 1. Otherwise, return 0.
+ *
+ * Note: This function modifies the original 'item' string.
+ */
+static int
+_item_split (char *item, char **group, char **key)
 {
-    notmuch_config_t *config;
-    char *item;
+    char *period;
 
-    if (argc != 2) {
-       fprintf (stderr, "Error: notmuch config requires two arguments.\n");
-       return 1;
-    }
+    *group = item;
 
-    if (strcmp (argv[0], "get")) {
-       fprintf (stderr, "Unrecognized argument for notmuch config: %s\n",
-                argv[0]);
+    period = index (item, '.');
+    if (period == NULL || *(period+1) == '\0') {
+       fprintf (stderr,
+                "Invalid configuration name: %s\n"
+                "(Should be of the form <section>.<item>)\n", item);
        return 1;
     }
 
+    *period = '\0';
+    *key = period + 1;
+
+    return 0;
+}
+
+static int
+notmuch_config_command_get (void *ctx, char *item)
+{
+    notmuch_config_t *config;
+
     config = notmuch_config_open (ctx, NULL, NULL);
     if (config == NULL)
        return 1;
 
-    item = argv[1];
-
     if (strcmp(item, "database.path") == 0) {
        printf ("%s\n", notmuch_config_get_database_path (config));
     } else if (strcmp(item, "user.name") == 0) {
@@ -608,20 +621,10 @@ notmuch_config_command (void *ctx, int argc, char *argv[])
     } else {
        char **value;
        size_t i, length;
-       char *group, *period, *key;
-
-       group = item;
+       char *group, *key;
 
-       period = index (item, '.');
-       if (period == NULL || *(period+1) == '\0') {
-           fprintf (stderr,
-                    "Invalid configuration name: %s\n"
-                    "(Should be of the form <section>.<item>)\n", item);
+       if (_item_split (item, &group, &key))
            return 1;
-       }
-
-       *period = '\0';
-       key = period + 1;
 
        value = g_key_file_get_string_list (config->key_file,
                                            group, key,
@@ -642,3 +645,61 @@ notmuch_config_command (void *ctx, int argc, char *argv[])
 
     return 0;
 }
+
+static int
+notmuch_config_command_set (void *ctx, char *item, int argc, char *argv[])
+{
+    notmuch_config_t *config;
+    char *group, *key;
+    int ret;
+
+    if (_item_split (item, &group, &key))
+       return 1;
+
+    config = notmuch_config_open (ctx, NULL, NULL);
+    if (config == NULL)
+       return 1;
+
+    /* With only the name of an item, we clear it from the
+     * configuration file.
+     *
+     * With a single value, we set it as a string.
+     *
+     * With multiple values, we set them as a string list.
+     */
+    switch (argc) {
+    case 0:
+       g_key_file_remove_key (config->key_file, group, key, NULL);
+       break;
+    case 1:
+       g_key_file_set_string (config->key_file, group, key, argv[0]);
+       break;
+    default:
+       g_key_file_set_string_list (config->key_file, group, key,
+                                   (const gchar **) argv, argc);
+       break;
+    }
+
+    ret = notmuch_config_save (config);
+    notmuch_config_close (config);
+
+    return ret;
+}
+
+int
+notmuch_config_command (void *ctx, int argc, char *argv[])
+{
+    if (argc < 2) {
+       fprintf (stderr, "Error: notmuch config requires at least two arguments.\n");
+       return 1;
+    }
+
+    if (strcmp (argv[0], "get") == 0)
+       return notmuch_config_command_get (ctx, argv[1]);
+    else if (strcmp (argv[0], "set") == 0)
+       return notmuch_config_command_set (ctx, argv[1], argc - 2, argv + 2);
+
+    fprintf (stderr, "Unrecognized argument for notmuch config: %s\n",
+            argv[0]);
+    return 1;
+}
index 41f7c7e450826a703e8d14585d09d1a17849dbe7..f803f908f1a447f104de11ade9c3058c657a2203 100644 (file)
--- a/notmuch.1
+++ b/notmuch.1
@@ -406,15 +406,13 @@ section below for details of the supported syntax for <search-terms>.
 
 The
 .B config
-command can be used to get settings from the notmuch configuration
-file.
+command can be used to get or set settings int the notmuch
+configuration file.
 
 .RS 4
 .TP 4
 .BR "config get " <section> . <item>
 
-Get settings from the notmuch configuration file.
-
 The value of the specified configuration item is printed to stdout. If
 the item has multiple values, each value is separated by a newline
 character.
@@ -432,6 +430,18 @@ Available configuration items include at least
        new.tags
 .RE
 
+.RS 4
+.TP 4
+.BR "config set " <section> . "<item> [values ...]"
+
+The specified configuration item is set to the given value.  To
+specify a multiple-value item, provide each value as a separate
+command-line argument.
+
+If no values are provided, the specified configuration item will be
+removed from the configuration file.
+.RE
+
 .SH SEARCH SYNTAX
 Several notmuch commands accept a common syntax for search terms.
 
index f9acfa36aa23ef7dc88abdfdefd577085b792acb..326aa4c8f6341737a29838b746e883612c386158 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -322,19 +322,30 @@ command_t commands[] = {
       "\tmessage specified by the search terms does not include a\n"
       "\tpart with the specified \"id\" there will be no output." },
     { "config", notmuch_config_command,
-      "get <section>.<item>",
-      "Get settings from the notmuch configuration file.",
+      "[get|set] <section>.<item> [value ...]",
+      "Get or set settings in the notmuch configuration file.",
+      "    config get <section>.<item>\n"
+      "\n"
       "\tThe value of the specified configuration item is printed\n"
       "\tto stdout. If the item has multiple values, each value\n"
       "\tis separated by a newline character.\n"
       "\n"
-      "\tAvailable configuration items include at least"
+      "\tAvailable configuration items include at least\n"
       "\n"
       "\t\tdatabase.path\n"
       "\t\tuser.name\n"
       "\t\tuser.primary_email\n"
       "\t\tuser.other_email\n"
-      "\t\tnew.tags\n" },
+      "\t\tnew.tags\n"
+      "\n"
+      "    config set <section>.<item> [value ...]\n"
+      "\n"
+      "\tThe specified configuration item is set to the given value.\n"
+      "\tTo specify a multiple-value item, provide each value as\n"
+      "\ta separate command-line argument.\n"
+      "\n"
+      "\tIf no values are provided, the specified configuration item\n"
+      "\twill be removed from the configuration file." },
     { "help", notmuch_help_command,
       "[<command>]",
       "This message, or more detailed help for the named command.",