char *filename;
GKeyFile *key_file;
bool is_new;
-
- char *database_path;
- char *user_name;
- char *user_primary_email;
- const char **user_other_email;
- size_t user_other_email_length;
- const char **new_tags;
- size_t new_tags_length;
- const char **new_ignore;
- size_t new_ignore_length;
- bool maildir_synchronize_flags;
- const char **search_exclude_tags;
- size_t search_exclude_tags_length;
};
static int
return 0;
}
-
static bool
get_config_from_file (notmuch_config_t *config, bool create_new)
{
talloc_set_destructor (config, notmuch_config_destructor);
- /* non-zero defaults */
- config->maildir_synchronize_flags = true;
-
if (filename) {
config->filename = talloc_strdup (config, filename);
} else if ((notmuch_config_env = getenv ("NOTMUCH_CONFIG"))) {
talloc_free (config);
}
-const char *
-_notmuch_config_get_path (notmuch_config_t *config)
-{
- return config->filename;
-}
/* Save any changes made to the notmuch configuration.
*
* Any comments originally in the file will be preserved.
return config->is_new;
}
-static const char *
-_config_get (notmuch_config_t *config, char **field,
- const char *group, const char *key)
-{
- /* read from config file and cache value, if not cached already */
- if (*field == NULL) {
- char *value;
- value = g_key_file_get_string (config->key_file, group, key, NULL);
- if (value) {
- *field = talloc_strdup (config, value);
- free (value);
- }
- }
- return *field;
-}
-
static void
-_config_set (notmuch_config_t *config, char **field,
+_config_set (notmuch_config_t *config,
const char *group, const char *key, const char *value)
{
g_key_file_set_string (config->key_file, group, key, value);
-
- /* drop the cached value */
- talloc_free (*field);
- *field = NULL;
-}
-
-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);
-
- /* read from config file and cache value, if not cached already */
- 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 *key,
const char *list[],
- size_t length, const char ***config_var )
+ size_t length)
{
g_key_file_set_string_list (config->key_file, group, key, list, length);
-
- /* drop the cached value */
- talloc_free (*config_var);
- *config_var = NULL;
-}
-
-const char *
-notmuch_config_get_database_path (notmuch_config_t *config)
-{
- char *db_path = (char *) _config_get (config, &config->database_path, "database", "path");
-
- if (db_path && *db_path != '/') {
- /* If the path in the configuration file begins with any
- * character other than /, presume that it is relative to
- * $HOME and update as appropriate.
- */
- char *abs_path = talloc_asprintf (config, "%s/%s", getenv ("HOME"), db_path);
- talloc_free (db_path);
- db_path = config->database_path = abs_path;
- }
-
- return db_path;
}
void
notmuch_config_set_database_path (notmuch_config_t *config,
const char *database_path)
{
- _config_set (config, &config->database_path, "database", "path", database_path);
-}
-
-const char *
-notmuch_config_get_user_name (notmuch_config_t *config)
-{
- return _config_get (config, &config->user_name, "user", "name");
+ _config_set (config, "database", "path", database_path);
}
void
notmuch_config_set_user_name (notmuch_config_t *config,
const char *user_name)
{
- _config_set (config, &config->user_name, "user", "name", user_name);
-}
-
-const char *
-notmuch_config_get_user_primary_email (notmuch_config_t *config)
-{
- return _config_get (config, &config->user_primary_email, "user", "primary_email");
+ _config_set (config, "user", "name", user_name);
}
void
notmuch_config_set_user_primary_email (notmuch_config_t *config,
const char *primary_email)
{
- _config_set (config, &config->user_primary_email, "user", "primary_email", primary_email);
-}
-
-const char **
-notmuch_config_get_user_other_email (notmuch_config_t *config, size_t *length)
-{
- return _config_get_list (config, "user", "other_email",
- &(config->user_other_email),
- &(config->user_other_email_length), length);
-}
-
-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);
-}
-
-const char **
-notmuch_config_get_new_ignore (notmuch_config_t *config, size_t *length)
-{
- return _config_get_list (config, "new", "ignore",
- &(config->new_ignore),
- &(config->new_ignore_length), length);
+ _config_set (config, "user", "primary_email", primary_email);
}
void
const char *list[],
size_t length)
{
- _config_set_list (config, "user", "other_email", list, length,
- &(config->user_other_email));
+ _config_set_list (config, "user", "other_email", list, length);
}
void
const char *list[],
size_t length)
{
- _config_set_list (config, "new", "tags", list, length,
- &(config->new_tags));
+ _config_set_list (config, "new", "tags", list, length);
}
void
const char *list[],
size_t length)
{
- _config_set_list (config, "new", "ignore", list, length,
- &(config->new_ignore));
-}
-
-const char **
-notmuch_config_get_search_exclude_tags (notmuch_config_t *config, size_t *length)
-{
- return _config_get_list (config, "search", "exclude_tags",
- &(config->search_exclude_tags),
- &(config->search_exclude_tags_length), length);
+ _config_set_list (config, "new", "ignore", list, length);
}
void
const char *list[],
size_t length)
{
- _config_set_list (config, "search", "exclude_tags", list, length,
- &(config->search_exclude_tags));
+ _config_set_list (config, "search", "exclude_tags", list, length);
}
typedef struct config_key {
const char *name;
- bool in_db;
bool prefix;
bool (*validate)(const char *);
} config_key_info_t;
static struct config_key
config_key_table[] = {
- { "index.decrypt", true, false, NULL },
- { "index.header.", true, true, validate_field_name },
- { "query.", true, true, NULL },
+ { "index.decrypt", false, NULL },
+ { "index.header.", true, validate_field_name },
+ { "query.", true, NULL },
};
static config_key_info_t *
}
static int
-_set_db_config (notmuch_config_t *config, const char *key, int argc, char **argv)
+_set_db_config (notmuch_database_t *notmuch, const char *key, int argc, char **argv)
{
- notmuch_database_t *notmuch;
const char *val = "";
if (argc > 1) {
val = argv[0];
}
- if (notmuch_database_open (notmuch_config_get_database_path (config),
- NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much))
+ if (print_status_database ("notmuch config", notmuch,
+ notmuch_database_reopen (notmuch,
+ NOTMUCH_DATABASE_MODE_READ_WRITE)))
return EXIT_FAILURE;
- /* XXX Handle UUID mismatch? */
-
if (print_status_database ("notmuch config", notmuch,
notmuch_database_set_config (notmuch, key, val)))
return EXIT_FAILURE;
}
static int
-notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char *argv[])
+notmuch_config_command_set (notmuch_config_t *config, notmuch_database_t *notmuch,
+ int argc, char *argv[])
{
char *group, *key;
config_key_info_t *key_info;
+ bool update_database = false;
+ int opt_index;
+ char *item;
+
+ notmuch_opt_desc_t options[] = {
+ { .opt_bool = &update_database, .name = "database" },
+ { }
+ };
+
+ opt_index = parse_arguments (argc, argv, options, 1);
+ if (opt_index < 0)
+ return EXIT_FAILURE;
+
+ argc -= opt_index;
+ argv += opt_index;
+
+ if (argc < 1) {
+ fprintf (stderr, "Error: notmuch config set requires at least "
+ "one argument.\n");
+ return EXIT_FAILURE;
+ }
+
+ item = argv[0];
+ argv++;
+ argc--;
if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) {
fprintf (stderr, "Error: read only option: %s\n", item);
if (key_info && key_info->validate && (! key_info->validate (item)))
return 1;
- if (key_info && key_info->in_db) {
- return _set_db_config (config, item, argc, argv);
+ if (update_database) {
+ return _set_db_config (notmuch, item, argc, argv);
}
if (_item_split (item, &group, &key))
}
ret = notmuch_config_command_get (notmuch, argv[1]);
} else if (strcmp (argv[0], "set") == 0) {
- if (argc < 2) {
- fprintf (stderr, "Error: notmuch config set requires at least "
- "one argument.\n");
- return EXIT_FAILURE;
- }
- ret = notmuch_config_command_set (config, argv[1], argc - 2, argv + 2);
+ ret = notmuch_config_command_set (config, notmuch, argc, argv);
} else if (strcmp (argv[0], "list") == 0) {
ret = notmuch_config_command_list (notmuch);
} else {
}
-bool
-notmuch_config_get_maildir_synchronize_flags (notmuch_config_t *config)
-{
- return config->maildir_synchronize_flags;
-}
-
void
notmuch_config_set_maildir_synchronize_flags (notmuch_config_t *config,
bool synchronize_flags)
{
g_key_file_set_boolean (config->key_file,
"maildir", "synchronize_flags", synchronize_flags);
- config->maildir_synchronize_flags = synchronize_flags;
}