X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-config.c;h=247fbe4ba1e394c0d4dc34b7142dd2c2f9da3f57;hp=e9b275096acb999103db4b5a68a74f27f0a5dcf1;hb=e76f6517de020783d828be59f461f1d4f465c4b4;hpb=2ee1d8e1c70ce20728bc3faada389a4802636352 diff --git a/notmuch-config.c b/notmuch-config.c index e9b27509..247fbe4b 100644 --- a/notmuch-config.c +++ b/notmuch-config.c @@ -49,8 +49,9 @@ static const char new_config_comment[] = "\tignore A list (separated by ';') of file and directory names\n" "\t that will not be searched for messages by \"notmuch new\".\n" "\n" - "\t NOTE: *Every* file/directory that goes by one of those names will\n" - "\t be ignored, independent of its depth/location in the mail store.\n"; + "\t NOTE: *Every* file/directory that goes by one of those\n" + "\t names will be ignored, independent of its depth/location\n" + "\t in the mail store.\n"; static const char user_config_comment[] = " User configuration\n" @@ -103,6 +104,7 @@ static const char search_config_comment[] = struct _notmuch_config { char *filename; GKeyFile *key_file; + notmuch_bool_t is_new; char *database_path; char *user_name; @@ -231,10 +233,9 @@ get_username_from_passwd_file (void *ctx) notmuch_config_t * notmuch_config_open (void *ctx, const char *filename, - notmuch_bool_t *is_new_ret) + notmuch_bool_t create_new) { GError *error = NULL; - int is_new = 0; size_t tmp; char *notmuch_config_env = NULL; int file_had_database_group; @@ -243,9 +244,6 @@ notmuch_config_open (void *ctx, int file_had_maildir_group; int file_had_search_group; - if (is_new_ret) - *is_new_ret = 0; - notmuch_config_t *config = talloc (ctx, notmuch_config_t); if (config == NULL) { fprintf (stderr, "Out of memory.\n"); @@ -265,6 +263,7 @@ notmuch_config_open (void *ctx, config->key_file = g_key_file_new (); + config->is_new = FALSE; config->database_path = NULL; config->user_name = NULL; config->user_primary_email = NULL; @@ -283,17 +282,16 @@ notmuch_config_open (void *ctx, G_KEY_FILE_KEEP_COMMENTS, &error)) { - /* If the caller passed a non-NULL value for is_new_ret, then - * the caller is prepared for a default configuration file in - * the case of FILE NOT FOUND. Otherwise, any read failure is - * an error. + /* If create_new is true, then the caller is prepared for a + * default configuration file in the case of FILE NOT + * FOUND. Otherwise, any read failure is an error. */ - if (is_new_ret && + if (create_new && error->domain == G_FILE_ERROR && error->code == G_FILE_ERROR_NOENT) { g_error_free (error); - is_new = 1; + config->is_new = TRUE; } else { @@ -376,7 +374,7 @@ notmuch_config_open (void *ctx, } if (notmuch_config_get_search_exclude_tags (config, &tmp) == NULL) { - if (is_new) { + if (config->is_new) { const char *tags[] = { "deleted", "spam" }; notmuch_config_set_search_exclude_tags (config, tags, 2); } else { @@ -396,7 +394,7 @@ notmuch_config_open (void *ctx, /* Whenever we know of configuration sections that don't appear in * the configuration file, we add some comments to help the user * understand what can be done. */ - if (is_new) + if (config->is_new) { g_key_file_set_comment (config->key_file, NULL, NULL, toplevel_config_comment, NULL); @@ -431,9 +429,6 @@ notmuch_config_open (void *ctx, search_config_comment, NULL); } - if (is_new_ret) - *is_new_ret = is_new; - return config; } @@ -481,6 +476,13 @@ notmuch_config_save (notmuch_config_t *config) return 0; } +notmuch_bool_t +notmuch_config_is_new (notmuch_config_t *config) +{ + return config->is_new; +} + + static const char ** _config_get_list (notmuch_config_t *config, const char *section, const char *key, @@ -707,7 +709,7 @@ notmuch_config_command_get (void *ctx, char *item) { notmuch_config_t *config; - config = notmuch_config_open (ctx, NULL, NULL); + config = notmuch_config_open (ctx, NULL, FALSE); if (config == NULL) return 1; @@ -751,7 +753,7 @@ notmuch_config_command_get (void *ctx, char *item) for (i = 0; i < length; i++) printf ("%s\n", value[i]); - free (value); + g_strfreev (value); } notmuch_config_close (config); @@ -769,7 +771,7 @@ notmuch_config_command_set (void *ctx, char *item, int argc, char *argv[]) if (_item_split (item, &group, &key)) return 1; - config = notmuch_config_open (ctx, NULL, NULL); + config = notmuch_config_open (ctx, NULL, FALSE); if (config == NULL) return 1; @@ -799,20 +801,78 @@ 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, FALSE); + 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[]) { argc--; argv++; /* skip subcommand argument */ - if (argc < 2) { - fprintf (stderr, "Error: notmuch config requires at least two arguments.\n"); + if (argc < 1) { + fprintf (stderr, "Error: notmuch config requires at least one argument.\n"); return 1; } - if (strcmp (argv[0], "get") == 0) + if (strcmp (argv[0], "get") == 0) { + if (argc != 2) { + fprintf (stderr, "Error: notmuch config get requires exactly " + "one argument.\n"); + return 1; + } return notmuch_config_command_get (ctx, argv[1]); - else if (strcmp (argv[0], "set") == 0) + } else if (strcmp (argv[0], "set") == 0) { + if (argc < 2) { + fprintf (stderr, "Error: notmuch config set requires at least " + "one argument.\n"); + 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", argv[0]);