unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] cli: try to run external notmuch- prefixed commands as subcommands
@ 2016-10-22 12:50 Jani Nikula
  2016-10-22 16:24 ` [PATCH] completion: complete notmuch emacs-mua Jani Nikula
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Jani Nikula @ 2016-10-22 12:50 UTC (permalink / raw)
  To: notmuch

If the given subcommand is not known to notmuch, try to execute
external notmuch-<subcommand> instead. This allows users to have their
own notmuch related tools be run via the notmuch command, not unlike
git does. Also notmuch-emacs-mua will be executable via 'notmuch
emacs-mua'.

By design, this does not allow notmuch's own subcommands to be
overriden using external commands.

---

Whether internal subcommands can be overridden or not is up to debate,
can be consider either a bug or a feature depending on how you look at
it.
---
 notmuch.c | 39 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

diff --git a/notmuch.c b/notmuch.c
index 38b73c1d2acc..b9c320329dd5 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -363,6 +363,39 @@ notmuch_command (notmuch_config_t *config,
     return EXIT_SUCCESS;
 }
 
+/*
+ * Try to run subcommand in argv[0] as notmuch- prefixed external
+ * command. argv must be NULL terminated (argv passed to main always
+ * is).
+ *
+ * Does not return if the external command is found and
+ * executed. Return TRUE if external command is not found. Return
+ * FALSE on errors.
+ */
+static notmuch_bool_t try_external_command(char *argv[])
+{
+    char *old_argv0 = argv[0];
+    notmuch_bool_t ret = TRUE;
+
+    argv[0] = talloc_asprintf (NULL, "notmuch-%s", old_argv0);
+
+    /*
+     * This will only return on errors. Not finding an external
+     * command (ENOENT) is not an error from our perspective.
+     */
+    execvp (argv[0], argv);
+    if (errno != ENOENT) {
+	fprintf (stderr, "Error: Running external command '%s' failed: %s\n",
+		 argv[0], strerror(errno));
+	ret = FALSE;
+    }
+
+    talloc_free (argv[0]);
+    argv[0] = old_argv0;
+
+    return ret;
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -406,8 +439,10 @@ main (int argc, char *argv[])
 
     command = find_command (command_name);
     if (!command) {
-	fprintf (stderr, "Error: Unknown command '%s' (see \"notmuch help\")\n",
-		 command_name);
+	/* This won't return if the external command is found. */
+	if (try_external_command(argv + opt_index))
+	    fprintf (stderr, "Error: Unknown command '%s' (see \"notmuch help\")\n",
+		     command_name);
 	ret = EXIT_FAILURE;
 	goto DONE;
     }
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 9+ messages in thread
* [PATCH] man: advertize notmuch-emacs-mua as notmuch emacs-mua subcommand
@ 2016-11-02 18:38 Jani Nikula
  0 siblings, 0 replies; 9+ messages in thread
From: Jani Nikula @ 2016-11-02 18:38 UTC (permalink / raw)
  To: notmuch

With subcommand handling for external commands we can now hide the
implementation detail of emacs-mua being a separate notmuch-emacs-mua
script.
---
 doc/man1/notmuch-emacs-mua.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/doc/man1/notmuch-emacs-mua.rst b/doc/man1/notmuch-emacs-mua.rst
index 651d00fa4eb8..b80aa5f9b2e5 100644
--- a/doc/man1/notmuch-emacs-mua.rst
+++ b/doc/man1/notmuch-emacs-mua.rst
@@ -5,7 +5,7 @@ notmuch-emacs-mua
 SYNOPSIS
 ========
 
-**notmuch-emacs-mua** [options ...] [<to-address> ... | <mailto-url>]
+**notmuch** **emacs-mua** [options ...] [<to-address> ... | <mailto-url>]
 
 DESCRIPTION
 ===========
@@ -13,7 +13,7 @@ DESCRIPTION
 Start composing an email in the Notmuch Emacs UI with the specified
 subject, recipients, and message body, or mailto: URL.
 
-Supported options for **notmuch-emacs-mua** include
+Supported options for **emacs-mua** include
 
     ``-h, --help``
         Display help.
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-11-02 18:43 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-22 12:50 [PATCH] cli: try to run external notmuch- prefixed commands as subcommands Jani Nikula
2016-10-22 16:24 ` [PATCH] completion: complete notmuch emacs-mua Jani Nikula
2016-10-22 16:32   ` [PATCH] man: advertize notmuch-emacs-mua as notmuch emacs-mua subcommand Jani Nikula
2016-11-02 10:42     ` David Bremner
2016-11-02 18:41       ` Jani Nikula
2016-10-23  3:22 ` [PATCH] cli: try to run external notmuch- prefixed commands as subcommands Mark Walters
2016-10-23 18:49   ` Jani Nikula
2016-10-31 11:18 ` David Bremner
  -- strict thread matches above, loose matches on Subject: below --
2016-11-02 18:38 [PATCH] man: advertize notmuch-emacs-mua as notmuch emacs-mua subcommand Jani Nikula

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).