config: Add 'config list' command
authorPeter Wang <novalazy@gmail.com>
Sat, 14 Apr 2012 01:41:05 +0000 (11:41 +1000)
committerDavid Bremner <bremner@debian.org>
Sat, 28 Apr 2012 13:45:31 +0000 (10:45 -0300)
Add a command to list all configuration items with their associated
values.

One use is as follows: a MUA may prefer to store data in a central
notmuch configuration file so that the data is accessible across
different machines, e.g. an addressbook.  The list command helps
to implement features such as tab completion on the keys.

notmuch-config.c
test/config

index f9eb97780c54673ca61bcae292e077c22b66745f..3e37a2d654b5c57df4d3a39d07afe97b5e9095e6 100644 (file)
@@ -799,6 +799,51 @@ notmuch_config_command_set (void *ctx, char *item, int argc, char *argv[])
     return ret;
 }
 
+static int
+notmuch_config_command_list (void *ctx)
+{
+    notmuch_config_t *config;
+    char **groups;
+    size_t g, groups_length;
+
+    config = notmuch_config_open (ctx, NULL, NULL);
+    if (config == NULL)
+       return 1;
+
+    groups = g_key_file_get_groups (config->key_file, &groups_length);
+    if (groups == NULL)
+       return 1;
+
+    for (g = 0; g < groups_length; g++) {
+       char **keys;
+       size_t k, keys_length;
+
+       keys = g_key_file_get_keys (config->key_file,
+                                   groups[g], &keys_length, NULL);
+       if (keys == NULL)
+           continue;
+
+       for (k = 0; k < keys_length; k++) {
+           char *value;
+
+           value = g_key_file_get_string (config->key_file,
+                                          groups[g], keys[k], NULL);
+           if (value != NULL) {
+               printf ("%s.%s=%s\n", groups[g], keys[k], value);
+               free (value);
+           }
+       }
+
+       g_strfreev (keys);
+    }
+
+    g_strfreev (groups);
+
+    notmuch_config_close (config);
+
+    return 0;
+}
+
 int
 notmuch_config_command (void *ctx, int argc, char *argv[])
 {
@@ -823,6 +868,8 @@ notmuch_config_command (void *ctx, int argc, char *argv[])
            return 1;
        }
        return notmuch_config_command_set (ctx, argv[1], argc - 2, argv + 2);
+    } else if (strcmp (argv[0], "list") == 0) {
+       return notmuch_config_command_list (ctx);
     }
 
     fprintf (stderr, "Unrecognized argument for notmuch config: %s\n",
index 3bf809802d346693dbe45857f4915bca4315158b..93ecb13997768194777d52f886505df4ebc29b76 100755 (executable)
@@ -43,7 +43,6 @@ notmuch config set foo.nonexistent
 test_expect_equal "$(notmuch config get foo.nonexistent)" ""
 
 test_begin_subtest "List all items"
-test_subtest_known_broken
 notmuch config set database.path "/canonical/path"
 output=$(notmuch config list)
 test_expect_equal "$output" "\