" recipient list of replies, and will set the From address based on the\n"
" address to which the original email was addressed.\n";
+static const char maildir_config_comment[] =
+ " Maildir compatibility configuration\n"
+ "\n"
+ " Here you can configure whether notmuch will synchronize its tags with\n"
+ " maildir flags."
+ "\n"
+ "\tsynchronize_flags Valid values are true and false.\n";
+
struct _notmuch_config {
char *filename;
GKeyFile *key_file;
char *database_path;
char *user_name;
char *user_primary_email;
- char **user_other_email;
+ const char **user_other_email;
size_t user_other_email_length;
const char **new_tags;
size_t new_tags_length;
+ notmuch_bool_t maildir_synchronize_flags;
};
+#define MAILDIR_SYNC_UNDEF ((notmuch_bool_t)-1)
+
static int
notmuch_config_destructor (notmuch_config_t *config)
{
int file_had_database_group;
int file_had_new_group;
int file_had_user_group;
+ int file_had_maildir_group;
if (is_new_ret)
*is_new_ret = 0;
config->user_other_email_length = 0;
config->new_tags = NULL;
config->new_tags_length = 0;
+ config->maildir_synchronize_flags = MAILDIR_SYNC_UNDEF;
if (! g_key_file_load_from_file (config->key_file,
config->filename,
"database");
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");
if (notmuch_config_get_database_path (config) == NULL) {
notmuch_config_set_new_tags (config, tags, 2);
}
+ if (notmuch_config_get_maildir_synchronize_flags (config) == MAILDIR_SYNC_UNDEF) {
+ notmuch_config_set_maildir_synchronize_flags (config, FALSE);
+ }
+
/* 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. */
user_config_comment, NULL);
}
+ if (! file_had_maildir_group)
+ {
+ g_key_file_set_comment (config->key_file, "maildir", NULL,
+ maildir_config_comment, NULL);
+ }
+
if (is_new_ret)
*is_new_ret = is_new;
config->user_primary_email = NULL;
}
-char **
+const char **
notmuch_config_get_user_other_email (notmuch_config_t *config,
size_t *length)
{
config->new_tags = NULL;
}
+/* 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)
+{
+ char *period;
+
+ *group = item;
+
+ 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;
+
+ if (strcmp(item, "database.path") == 0) {
+ printf ("%s\n", notmuch_config_get_database_path (config));
+ } else if (strcmp(item, "user.name") == 0) {
+ printf ("%s\n", notmuch_config_get_user_name (config));
+ } else if (strcmp(item, "user.primary_email") == 0) {
+ printf ("%s\n", notmuch_config_get_user_primary_email (config));
+ } else if (strcmp(item, "user.other_email") == 0) {
+ const char **other_email;
+ size_t i, length;
+
+ other_email = notmuch_config_get_user_other_email (config, &length);
+ for (i = 0; i < length; i++)
+ printf ("%s\n", other_email[i]);
+ } else if (strcmp(item, "new.tags") == 0) {
+ const char **tags;
+ size_t i, length;
+
+ tags = notmuch_config_get_new_tags (config, &length);
+ for (i = 0; i < length; i++)
+ printf ("%s\n", tags[i]);
+ } else {
+ char **value;
+ size_t i, length;
+ char *group, *key;
+
+ if (_item_split (item, &group, &key))
+ return 1;
+
+ value = g_key_file_get_string_list (config->key_file,
+ group, key,
+ &length, NULL);
+ if (value == NULL) {
+ fprintf (stderr, "Unknown configuration item: %s.%s\n",
+ group, key);
+ return 1;
+ }
+
+ for (i = 0; i < length; i++)
+ printf ("%s\n", value[i]);
+
+ free (value);
+ }
+
+ notmuch_config_close (config);
+
+ 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;
+}
+
+notmuch_bool_t
+notmuch_config_get_maildir_synchronize_flags (notmuch_config_t *config)
+{
+ GError *err = NULL;
+ if (config->maildir_synchronize_flags == MAILDIR_SYNC_UNDEF) {
+ config->maildir_synchronize_flags =
+ g_key_file_get_boolean (config->key_file,
+ "maildir", "synchronize_flags", &err);
+ if (err) {
+ config->maildir_synchronize_flags = MAILDIR_SYNC_UNDEF;
+ g_error_free (err);
+ }
+ }
+ return config->maildir_synchronize_flags;
+}
+
+void
+notmuch_config_set_maildir_synchronize_flags (notmuch_config_t *config,
+ notmuch_bool_t synchronize_flags)
+{
+ g_key_file_set_boolean (config->key_file,
+ "maildir", "synchronize_flags", synchronize_flags);
+ config->maildir_synchronize_flags = synchronize_flags;
+}