]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-config.c
cli: add standard option processing to config, help and setup
[notmuch] / notmuch-config.c
index db487dbe828ba808b6c3223a8d33df581864d74f..934827874b1eb3548fa6b9fa1fdf4d9955174ee6 100644 (file)
@@ -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;
@@ -244,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) {
@@ -277,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
        {
@@ -320,7 +337,7 @@ 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 = getenv ("MAILDIR");
@@ -400,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. */
@@ -427,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;
 }
 
@@ -684,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 <group>.<key> return the
  * component group and key. If any error occurs, print a message on
  * stderr and return 1. Otherwise, return 0.
@@ -833,8 +872,15 @@ 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;
 
-    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");