unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: Jani Nikula <jani@nikula.org>
To: Austin Clements <amdragon@MIT.EDU>
Cc: notmuch@notmuchmail.org
Subject: Re: [PATCH v2 1/2] cli: introduce the concept of user defined hooks
Date: Sun, 04 Dec 2011 14:35:43 +0200	[thread overview]
Message-ID: <87sjl0ldk0.fsf@nikula.org> (raw)
In-Reply-To: <20111204034210.GA16405@mit.edu>

On Sat, 3 Dec 2011 22:42:10 -0500, Austin Clements <amdragon@MIT.EDU> wrote:
> I like it.  See below for some nits.

Thanks for the review!

> Quoth Jani Nikula on Dec 04 at  1:16 am:
> > Add mechanism for running user defined hooks. Hooks are executables or
> > symlinks to executables stored under the new notmuch hooks directory,
> > <database-path>/.notmuch/hooks.
> > 
> > No hooks are introduced here, but adding support for a hook is now a simple
> > matter of calling the new notmuch_run_hook() function at an appropriate
> > location with the hook name.
> > 
> > Signed-off-by: Jani Nikula <jani@nikula.org>
> > 
> > ---
> > 
> > v2: Switch to git style hooks in a hook directory as suggested by Austin
> > Clements in IRC. Update manpage and add polish.
> > ---
> >  Makefile.local   |    1 +
> >  notmuch-client.h |    3 ++
> >  notmuch-hook.c   |   63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 67 insertions(+), 0 deletions(-)
> >  create mode 100644 notmuch-hook.c
> > 
> > diff --git a/Makefile.local b/Makefile.local
> > index c94402b..a1665e1 100644
> > --- a/Makefile.local
> > +++ b/Makefile.local
> > @@ -302,6 +302,7 @@ notmuch_client_srcs =		\
> >  	notmuch-config.c	\
> >  	notmuch-count.c		\
> >  	notmuch-dump.c		\
> > +	notmuch-hook.c		\
> >  	notmuch-new.c		\
> >  	notmuch-reply.c		\
> >  	notmuch-restore.c	\
> > diff --git a/notmuch-client.h b/notmuch-client.h
> > index b50cb38..a91ad6c 100644
> > --- a/notmuch-client.h
> > +++ b/notmuch-client.h
> > @@ -235,6 +235,9 @@ void
> >  notmuch_config_set_maildir_synchronize_flags (notmuch_config_t *config,
> >  					      notmuch_bool_t synchronize_flags);
> >  
> > +int
> > +notmuch_run_hook (const char *db_path, const char *hook);
> > +
> >  notmuch_bool_t
> >  debugger_is_active (void);
> >  
> > diff --git a/notmuch-hook.c b/notmuch-hook.c
> > new file mode 100644
> > index 0000000..fc32044
> > --- /dev/null
> > +++ b/notmuch-hook.c
> > @@ -0,0 +1,63 @@
> > +/* notmuch - Not much of an email program, (just index and search)
> > + *
> > + * This file is part of notmuch.
> > + *
> > + * Copyright © 2011 Jani Nikula
> > + *
> > + * This program is free software: you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License as published by
> > + * the Free Software Foundation, either version 3 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program.  If not, see http://www.gnu.org/licenses/ .
> > + *
> > + * Author: Jani Nikula <jani@nikula.org>
> > + */
> > +
> > +#include "notmuch-client.h"
> > +
> > +int
> > +notmuch_run_hook (const char *db_path, const char *hook)
> > +{
> > +    char *hook_path;
> > +    int status = 0;
> 
> You use status as both a notmuch_status_t and for generic C library
> results.  This seems a little weird.  You may or may not want to do
> anything about it.

True, it's not consistent. I'll want to do something about it. I wonder
if it's worth returning anything other than ok/fail from this function
anyway.

There seems to be some confusion in notmuch_status_t usage across
notmuch cli. Should notmuch cli return a notmuch_status_t as exit
status? It currently does at least in some cases, but it also returns
plain 1 too which is (unintentionally) NOTMUCH_STATUS_OUT_OF_MEMORY.

Does it make sense for the cli to use the lib statuses internally
anyway; you wouldn't want to add new status codes to the lib just to be
able to use them in cli.

> > +
> > +    if (asprintf (&hook_path, "%s/%s/%s/%s", db_path, ".notmuch", "hooks",
> > +		  hook) == -1)
> 
> asprintf isn't very portable.  Perhaps talloc_asprintf would be
> better?  (And more idiomatic.)

Agreed.

> > +	return NOTMUCH_STATUS_OUT_OF_MEMORY;
> > +
> > +    if (access (hook_path, X_OK) == -1) {
> > +	/* Ignore ENOENT. It's okay not to have a hook, hook dir, or even
> > +	 * notmuch dir. Dangling symbolic links also result in ENOENT, but
> > +	 * we'll ignore that too for simplicity. */
> > +	if (errno != ENOENT) {
> > +	    fprintf (stderr, "Error: %s hook access failed: %s\n", hook,
> > +		     strerror (errno));
> > +	    status = NOTMUCH_STATUS_FILE_ERROR;
> > +	}
> > +	goto DONE;
> > +    }
> > +
> > +    status = system (hook_path);
> 
> It would probably be better to fork/execl.  system is sensitive to all
> sorts of weird things because it invokes the shell (e.g., spaces or
> funny characters in db_path) and it plays funny games with signals.

Agreed. I initially chose system() because it is simple to use and
allowed shell expressions (pipes, redirects, etc.) within the config
file in v1 of the patches. But that's not applicable in v2 anyway.

> Really proper error handling with fork/exec is a pain, but I think you
> can get away with something simpler and even get rid of the access
> call in the process.  Something like
> 
> ret = fork();
> if (ret < 0) ...
> else if (ret == 0) {
>   ret = execl(hook_path, hook_path, NULL);
>   if (ret != ENOENT && ret != EACCESS)
>     print a real error message
>   exit(0);
> } else {
>   waitpid(ret, &status, 0);
>   if (status) .. checks you do now ..
> }
> 
> I guess this wastes a fork if there is no hook script, so maybe the
> access call is worth doing anyway.

I'll look into this.

> > +    if (status) {
> > +	if (WIFSIGNALED(status))
> > +	    fprintf(stderr, "Error: %s hook terminated with signal %d\n", hook,
> > +		    WTERMSIG(status));
> > +	else
> > +	    fprintf(stderr, "Error: %s hook failed with status %d\n", hook,
> > +		    WEXITSTATUS(status));
> > +
> > +	status = NOTMUCH_STATUS_FILE_ERROR; /* Close enough */
> > +    }
> > +
> > +  DONE:
> > +    free (hook_path);
> > +
> > +    return status;
> > +}

  reply	other threads:[~2011-12-04 12:35 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-02 21:00 [PATCH 1/2] cli: add mechanism for running user configurable hooks Jani Nikula
2011-12-02 21:00 ` [PATCH 2/2] cli: add support for running notmuch new pre and post hooks Jani Nikula
2011-12-02 21:05 ` [PATCH 1/2] cli: add mechanism for running user configurable hooks Jani Nikula
2011-12-03 23:16 ` [PATCH v2 1/2] cli: introduce the concept of user defined hooks Jani Nikula
2011-12-03 23:16   ` [PATCH v2 2/2] cli: add support for pre and post notmuch new hooks Jani Nikula
2011-12-04  4:00     ` Austin Clements
2011-12-04 19:36       ` Jani Nikula
2011-12-04 19:54         ` Tom Prince
2011-12-04 16:46     ` Tom Prince
2011-12-04 19:56       ` Jani Nikula
2011-12-04  3:42   ` [PATCH v2 1/2] cli: introduce the concept of user defined hooks Austin Clements
2011-12-04 12:35     ` Jani Nikula [this message]
2011-12-04 16:41       ` Austin Clements
2011-12-06 13:22 ` [PATCH v3 0/2] notmuch hooks Jani Nikula
2011-12-06 13:22   ` [PATCH v3 1/2] cli: introduce the concept of user defined hooks Jani Nikula
2011-12-06 13:30     ` Jani Nikula
2011-12-06 13:22   ` [PATCH v3 2/2] cli: add support for pre and post notmuch new hooks Jani Nikula
2011-12-07  2:27   ` [PATCH v3 0/2] notmuch hooks Jameson Graef Rollins
2011-12-07 19:42     ` Jani Nikula
2011-12-07 22:13       ` Jameson Graef Rollins
2011-12-08  8:49         ` Tomi Ollila
2011-12-08 16:29           ` Jameson Graef Rollins
2011-12-07  2:47   ` Jameson Graef Rollins
2011-12-07  3:16     ` Tom Prince
2011-12-07 18:05       ` Jani Nikula
2011-12-07 18:10         ` Jameson Graef Rollins
2011-12-07 20:11         ` Austin Clements
2011-12-08 22:48 ` [PATCH v4 0/3] " Jani Nikula
2011-12-08 22:48   ` [PATCH v4 1/3] cli: introduce the concept of user defined hooks Jani Nikula
2011-12-08 23:34     ` Austin Clements
2011-12-09 13:55       ` Jani Nikula
2011-12-09 15:59         ` Austin Clements
2011-12-08 22:48   ` [PATCH v4 2/3] cli: add support for pre and post notmuch new hooks Jani Nikula
2011-12-08 22:48   ` [PATCH v4 3/3] test: add tests for hooks Jani Nikula
2011-12-10 22:04   ` [PATCH v4 0/3] notmuch hooks Jameson Graef Rollins
2011-12-11 18:29   ` David Bremner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87sjl0ldk0.fsf@nikula.org \
    --to=jani@nikula.org \
    --cc=amdragon@MIT.EDU \
    --cc=notmuch@notmuchmail.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).