[PATCH] notmuch-config: ENOENT vs generic handling when file open fails.

Jani Nikula jani at nikula.org
Wed Jan 18 09:59:18 PST 2017


On Thu, 05 Jan 2017, Tomi Ollila <tomi.ollila at iki.fi> wrote:
> When opening configuration file fails, ENOENT (file not found) is
> handled specially -- in setup missing file is ok (often expected),
> and otherwise user can be informed to run notmuch setup.
>
> In any other case the the reason is unknown, so there is no other
> option but to print generic error message to stderr.

The only problem here is that 'notmuch help' will fail if there are any
other errors than ENOENT. And if there are, 'notmuch help' might be a
command the user would like to succeed.

Since 'notmuch help' doesn't really need the config file, we could do
something like this (untested):


>From c171292f8b2ac20704d46e0e418208fc24cc1553 Mon Sep 17 00:00:00 2001
From: Jani Nikula <jani at nikula.org>
Date: Wed, 18 Jan 2017 19:55:06 +0200
Subject: [PATCH] cli/config: don't try to open config file for 'notmuch help'

The help command does not really need to try to open the config
file. So don't.
---
 notmuch-client.h |  7 ++++++-
 notmuch-config.c | 12 ++++++++----
 notmuch.c        | 34 +++++++++++++++++-----------------
 3 files changed, 31 insertions(+), 22 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index d026e6004239..d0dfdf2ce374 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -263,10 +263,15 @@ json_quote_str (const void *ctx, const char *str);
 
 /* notmuch-config.c */
 
+typedef enum {
+    NOTMUCH_CONFIG_OPEN	= 1 << 0,
+    NOTMUCH_CONFIG_CREATE = 1 << 1,
+} notmuch_config_mode_t;
+
 notmuch_config_t *
 notmuch_config_open (void *ctx,
 		     const char *filename,
-		     notmuch_bool_t create_new);
+		     notmuch_config_mode_t config_mode);
 
 void
 notmuch_config_close (notmuch_config_t *config);
diff --git a/notmuch-config.c b/notmuch-config.c
index b202bb1e2299..959410cce7b8 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -322,7 +322,7 @@ out:
 notmuch_config_t *
 notmuch_config_open (void *ctx,
 		     const char *filename,
-		     notmuch_bool_t create_new)
+		     notmuch_config_mode_t config_mode)
 {
     GError *error = NULL;
     size_t tmp;
@@ -356,9 +356,13 @@ notmuch_config_open (void *ctx,
 
     config->key_file = g_key_file_new ();
 
-    if (! get_config_from_file (config, create_new)) {
-	talloc_free (config);
-	return NULL;
+    if (config_mode & NOTMUCH_CONFIG_OPEN) {
+	notmuch_bool_t create_new = (config_mode & NOTMUCH_CONFIG_CREATE) != 0;
+
+	if (! get_config_from_file (config, create_new)) {
+	    talloc_free (config);
+	    return NULL;
+	}
     }
 
     /* Whenever we know of configuration sections that don't appear in
diff --git a/notmuch.c b/notmuch.c
index b9c320329dd5..8e332ce64410 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -33,7 +33,7 @@ typedef int (*command_function_t) (notmuch_config_t *config, int argc, char *arg
 typedef struct command {
     const char *name;
     command_function_t function;
-    notmuch_bool_t create_config;
+    notmuch_config_mode_t config_mode;
     const char *summary;
 } command_t;
 
@@ -97,35 +97,35 @@ int notmuch_minimal_options (const char *subcommand_name,
 }
 
 static command_t commands[] = {
-    { NULL, notmuch_command, TRUE,
+    { NULL, notmuch_command, NOTMUCH_CONFIG_OPEN | NOTMUCH_CONFIG_CREATE,
       "Notmuch main command." },
-    { "setup", notmuch_setup_command, TRUE,
+    { "setup", notmuch_setup_command, NOTMUCH_CONFIG_OPEN | NOTMUCH_CONFIG_CREATE,
       "Interactively set up notmuch for first use." },
-    { "new", notmuch_new_command, FALSE,
+    { "new", notmuch_new_command, NOTMUCH_CONFIG_OPEN,
       "Find and import new messages to the notmuch database." },
-    { "insert", notmuch_insert_command, FALSE,
+    { "insert", notmuch_insert_command, NOTMUCH_CONFIG_OPEN,
       "Add a new message into the maildir and notmuch database." },
-    { "search", notmuch_search_command, FALSE,
+    { "search", notmuch_search_command, NOTMUCH_CONFIG_OPEN,
       "Search for messages matching the given search terms." },
-    { "address", notmuch_address_command, FALSE,
+    { "address", notmuch_address_command, NOTMUCH_CONFIG_OPEN,
       "Get addresses from messages matching the given search terms." },
-    { "show", notmuch_show_command, FALSE,
+    { "show", notmuch_show_command, NOTMUCH_CONFIG_OPEN,
       "Show all messages matching the search terms." },
-    { "count", notmuch_count_command, FALSE,
+    { "count", notmuch_count_command, NOTMUCH_CONFIG_OPEN,
       "Count messages matching the search terms." },
-    { "reply", notmuch_reply_command, FALSE,
+    { "reply", notmuch_reply_command, NOTMUCH_CONFIG_OPEN,
       "Construct a reply template for a set of messages." },
-    { "tag", notmuch_tag_command, FALSE,
+    { "tag", notmuch_tag_command, NOTMUCH_CONFIG_OPEN,
       "Add/remove tags for all messages matching the search terms." },
-    { "dump", notmuch_dump_command, FALSE,
+    { "dump", notmuch_dump_command, NOTMUCH_CONFIG_OPEN,
       "Create a plain-text dump of the tags for each message." },
-    { "restore", notmuch_restore_command, FALSE,
+    { "restore", notmuch_restore_command, NOTMUCH_CONFIG_OPEN,
       "Restore the tags from the given dump file (see 'dump')." },
-    { "compact", notmuch_compact_command, FALSE,
+    { "compact", notmuch_compact_command, NOTMUCH_CONFIG_OPEN,
       "Compact the notmuch database." },
-    { "config", notmuch_config_command, FALSE,
+    { "config", notmuch_config_command, NOTMUCH_CONFIG_OPEN,
       "Get or set settings in the notmuch configuration file." },
-    { "help", notmuch_help_command, TRUE, /* create but don't save config */
+    { "help", notmuch_help_command, NOTMUCH_CONFIG_CREATE, /* create but don't save config */
       "This message, or more detailed help for the named command." }
 };
 
@@ -447,7 +447,7 @@ main (int argc, char *argv[])
 	goto DONE;
     }
 
-    config = notmuch_config_open (local, config_file_name, command->create_config);
+    config = notmuch_config_open (local, config_file_name, command->config_mode);
     if (!config) {
 	ret = EXIT_FAILURE;
 	goto DONE;
-- 
2.11.0



More information about the notmuch mailing list