X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-config.c;h=01bb185990bb31f2965ab0a0aab7f967ea5c4232;hp=8d286538c086180ef9c88ef6a00315c95fc67fea;hb=eac29763896e457a738f811b2c2ba8f877498e62;hpb=28d7544ae2adfe6467c6b64a3284f5ed13f81e1a diff --git a/notmuch-config.c b/notmuch-config.c index 8d286538..01bb1859 100644 --- a/notmuch-config.c +++ b/notmuch-config.c @@ -101,12 +101,21 @@ static const char search_config_comment[] = "\t\tsearch results by default. Using an excluded tag in a\n" "\t\tquery will override that exclusion.\n"; +static const char crypto_config_comment[] = + " Cryptography related configuration\n" + "\n" + " The following option is supported here:\n" + "\n" + "\tgpg_path\n" + "\t\tbinary name or full path to invoke gpg.\n"; + struct _notmuch_config { char *filename; GKeyFile *key_file; notmuch_bool_t is_new; char *database_path; + char *crypto_gpg_path; char *user_name; char *user_primary_email; const char **user_other_email; @@ -217,9 +226,10 @@ get_username_from_passwd_file (void *ctx) * These default configuration settings are determined as * follows: * - * database_path: $HOME/mail + * database_path: $MAILDIR, otherwise $HOME/mail * - * user_name: From /etc/passwd + * user_name: $NAME variable if set, otherwise + * read from /etc/passwd * * user_primary_mail: $EMAIL variable if set, otherwise * constructed from the username and @@ -243,6 +253,7 @@ notmuch_config_open (void *ctx, int file_had_user_group; int file_had_maildir_group; int file_had_search_group; + int file_had_crypto_group; notmuch_config_t *config = talloc (ctx, notmuch_config_t); if (config == NULL) { @@ -276,22 +287,29 @@ notmuch_config_open (void *ctx, config->maildir_synchronize_flags = TRUE; config->search_exclude_tags = NULL; config->search_exclude_tags_length = 0; + config->crypto_gpg_path = NULL; if (! g_key_file_load_from_file (config->key_file, config->filename, G_KEY_FILE_KEEP_COMMENTS, &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 (create_new && - error->domain == G_FILE_ERROR && - error->code == G_FILE_ERROR_NOENT) - { - g_error_free (error); - config->is_new = TRUE; + if (error->domain == G_FILE_ERROR && error->code == G_FILE_ERROR_NOENT) { + /* If create_new is true, then the caller is prepared for a + * default configuration file in the case of FILE NOT + * FOUND. + */ + if (create_new) { + g_error_free (error); + config->is_new = TRUE; + } else { + fprintf (stderr, "Configuration file %s not found.\n" + "Try running 'notmuch setup' to create a configuration.\n", + config->filename); + talloc_free (config); + g_error_free (error); + return NULL; + } } else { @@ -319,17 +337,25 @@ notmuch_config_open (void *ctx, 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"); file_had_search_group = g_key_file_has_group (config->key_file, "search"); - + file_had_crypto_group = g_key_file_has_group (config->key_file, "crypto"); if (notmuch_config_get_database_path (config) == NULL) { - char *path = talloc_asprintf (config, "%s/mail", - getenv ("HOME")); + char *path = getenv ("MAILDIR"); + if (path) + path = talloc_strdup (config, path); + else + path = talloc_asprintf (config, "%s/mail", + getenv ("HOME")); notmuch_config_set_database_path (config, path); talloc_free (path); } if (notmuch_config_get_user_name (config) == NULL) { - char *name = get_name_from_passwd_file (config); + char *name = getenv ("NAME"); + if (name) + name = talloc_strdup (config, name); + else + name = get_name_from_passwd_file (config); notmuch_config_set_user_name (config, name); talloc_free (name); } @@ -391,6 +417,10 @@ notmuch_config_open (void *ctx, g_error_free (error); } + if (notmuch_config_get_crypto_gpg_path (config) == NULL) { + notmuch_config_set_crypto_gpg_path (config, "gpg"); + } + /* 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. */ @@ -418,6 +448,10 @@ notmuch_config_open (void *ctx, g_key_file_set_comment (config->key_file, "search", NULL, search_config_comment, NULL); + if (! file_had_crypto_group) + g_key_file_set_comment (config->key_file, "crypto", NULL, + crypto_config_comment, NULL); + return config; } @@ -454,7 +488,7 @@ notmuch_config_save (notmuch_config_t *config) } /* Try not to overwrite symlinks. */ - filename = realpath (config->filename, NULL); + filename = canonicalize_file_name (config->filename); if (! filename) { if (errno == ENOENT) { filename = strdup (config->filename); @@ -675,6 +709,20 @@ notmuch_config_set_search_exclude_tags (notmuch_config_t *config, &(config->search_exclude_tags)); } +const char * +notmuch_config_get_crypto_gpg_path (notmuch_config_t *config) +{ + return _config_get (config, &config->crypto_gpg_path, "crypto", "gpg_path"); +} + +void +notmuch_config_set_crypto_gpg_path (notmuch_config_t *config, + const char *gpg_path) +{ + _config_set (config, &config->crypto_gpg_path, "crypto", "gpg_path", gpg_path); +} + + /* Given a configuration item of the form . return the * component group and key. If any error occurs, print a message on * stderr and return 1. Otherwise, return 0. @@ -702,6 +750,8 @@ _item_split (char *item, char **group, char **key) return 0; } +#define BUILT_WITH_PREFIX "built_with." + static int notmuch_config_command_get (notmuch_config_t *config, char *item) { @@ -725,6 +775,9 @@ notmuch_config_command_get (notmuch_config_t *config, char *item) tags = notmuch_config_get_new_tags (config, &length); for (i = 0; i < length; i++) printf ("%s\n", tags[i]); + } else if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) { + printf ("%s\n", + notmuch_built_with (item + strlen (BUILT_WITH_PREFIX)) ? "true" : "false"); } else { char **value; size_t i, length; @@ -756,6 +809,11 @@ notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char { char *group, *key; + if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) { + fprintf (stderr, "Error: read only option: %s\n", item); + return 1; + } + if (_item_split (item, &group, &key)) return 1; @@ -782,6 +840,18 @@ notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char return notmuch_config_save (config); } +static +void +_notmuch_config_list_built_with () +{ + printf("%scompact=%s\n", + BUILT_WITH_PREFIX, + notmuch_built_with ("compact") ? "true" : "false"); + printf("%sfield_processor=%s\n", + BUILT_WITH_PREFIX, + notmuch_built_with ("field_processor") ? "true" : "false"); +} + static int notmuch_config_command_list (notmuch_config_t *config) { @@ -817,6 +887,7 @@ notmuch_config_command_list (notmuch_config_t *config) g_strfreev (groups); + _notmuch_config_list_built_with (); return 0; } @@ -824,8 +895,19 @@ int notmuch_config_command (notmuch_config_t *config, int argc, char *argv[]) { int ret; + int opt_index; + + opt_index = notmuch_minimal_options ("config", argc, argv); + if (opt_index < 0) + return EXIT_FAILURE; + + if (notmuch_requested_db_uuid) + fprintf (stderr, "Warning: ignoring --uuid=%s\n", + notmuch_requested_db_uuid); - argc--; argv++; /* skip subcommand argument */ + /* skip at least subcommand argument */ + argc-= opt_index; + argv+= opt_index; if (argc < 1) { fprintf (stderr, "Error: notmuch config requires at least one argument.\n");