[Patch v2 04/13] lib/cli: add library API / CLI for compile time options
Tomi Ollila
tomi.ollila at iki.fi
Wed Apr 27 10:47:04 PDT 2016
On Sat, Mar 26 2016, David Bremner <david at tethera.net> wrote:
> This is intentionally low tech; if we have more than two options it may
> make sense to build up what infrastructure is provided.
2 quick notes for this patch -- since it has been like a month when I
looked this it takes time to get re-acquainted to the series again
...IMO this compile time "options" feels a bit odd; what options those are
if those are not options (but fixed things on what is available on the
underlying libraries). something like "features" would be a little less
odd (if there were no "database features" there ;/)
another thing is that these fixed things that were resolved by compile time
is (re-)checked in compile time. instead of that just the
HAVE_XAPIAN_COMPACT and HAVE_XAPIAN_FIELD_PROCESSOR could be used
... like:
notmuch_bool_t
notmuch_options_get (const char *name) {
if (STRNCMP_LITERAL (name, "compact") == 0) {
return HAVE_XAPIAN_COMPACT;
// or return HAVE_XAPIAN_COMPACT? TRUE: FALSE;
// or return !! HAVE_XAPIAN_COMPACT;
} else if (STRNCMP_LITERAL (name, "field_processor") == 0) {
return HAVE_XAPIAN_FIELD_PROCESSOR;
} else {
return FALSE;
}
}
... note: if this notmuch_options_present () function prevails, fix
the later #if check ;D
... and
void
_notmuch_config_list_options () {
printf("options.compact=%s\n",
HAVE_XAPIAN_COMPACT ? "true" : "false");
printf("options.field_processor=%s\n",
HAVE_XAPIAN_FIELD_PROCESSOR ? "true" : "false");
}
(kept the 'options' naming and prefix in this context)
otoh, all this "options" reading using notmuch config interface could
be pos^H^H^H^H put into another series and this naming thing could be
resolved there (proviced that these #if HAVE_XAPIAN ... #endif constructs
can be used conveniently here)
this is how these things look to me now; as usual i may not have
caught all of the considerations here.
Tomi
> ---
> doc/man1/notmuch-config.rst | 5 +++++
> lib/Makefile.local | 1 +
> lib/notmuch.h | 10 +++++++++
> lib/options.c | 50 +++++++++++++++++++++++++++++++++++++++++++++
> notmuch-config.c | 20 ++++++++++++++++++
> test/T030-config.sh | 6 ++++--
> test/T040-setup.sh | 6 ++++--
> test/test-lib.sh | 6 ++++++
> 8 files changed, 100 insertions(+), 4 deletions(-)
> create mode 100644 lib/options.c
>
> diff --git a/doc/man1/notmuch-config.rst b/doc/man1/notmuch-config.rst
> index 40c1272..150d764 100644
> --- a/doc/man1/notmuch-config.rst
> +++ b/doc/man1/notmuch-config.rst
> @@ -132,6 +132,11 @@ The available configuration items are described below.
>
> Default: ``gpg``.
>
> + **options.<name>**
> +
> + Compile time option <name>. Current possibilities include
> + "compact" (see **notmuch-compact(1)**)
> + and "field_processor" (see **notmuch-search-terms(7)**).
>
> ENVIRONMENT
> ===========
> diff --git a/lib/Makefile.local b/lib/Makefile.local
> index 3a07090..4ad0158 100644
> --- a/lib/Makefile.local
> +++ b/lib/Makefile.local
> @@ -39,6 +39,7 @@ libnotmuch_c_srcs = \
> $(dir)/message-file.c \
> $(dir)/messages.c \
> $(dir)/sha1.c \
> + $(dir)/options.c \
> $(dir)/tags.c
>
> libnotmuch_cxx_srcs = \
> diff --git a/lib/notmuch.h b/lib/notmuch.h
> index cb46fc0..b29dd5f 100644
> --- a/lib/notmuch.h
> +++ b/lib/notmuch.h
> @@ -1838,6 +1838,16 @@ notmuch_filenames_move_to_next (notmuch_filenames_t *filenames);
> void
> notmuch_filenames_destroy (notmuch_filenames_t *filenames);
>
> +typedef enum {
> + NOTMUCH_OPTION_COMPACT = 1,
> + NOTMUCH_OPTION_FIELD_PROCESSOR = 2
> +} notmuch_option_t;
> +
> +notmuch_bool_t
> +notmuch_options_present (notmuch_option_t mask);
> +
> +notmuch_bool_t
> +notmuch_options_get (const char *name);
> /* @} */
>
> NOTMUCH_END_DECLS
> diff --git a/lib/options.c b/lib/options.c
> new file mode 100644
> index 0000000..4e15d92
> --- /dev/null
> +++ b/lib/options.c
> @@ -0,0 +1,50 @@
> +/* notmuch - Not much of an email program, (just index and search)
> + *
> + * Copyright © 2016 David Bremner
> + *
> + * 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: David Bremner <david at tethera.net>
> + */
> +
> +#include "notmuch.h"
> +#include "notmuch-private.h"
> +
> +notmuch_bool_t
> +notmuch_options_present (notmuch_option_t mask)
> +{
> + notmuch_option_t present = 0;
> +
> +#if HAVE_XAPIAN_COMPACT
> + present |= NOTMUCH_OPTION_COMPACT;
> +#endif
> +
> +#if HAVE_XAPIAN_COMPACT
> + present |= NOTMUCH_OPTION_FIELD_PROCESSOR;
> +#endif
> +
> + return (mask & present) != 0;
> +
> +}
> +
> +notmuch_bool_t
> +notmuch_options_get (const char *name) {
> + if (STRNCMP_LITERAL (name, "compact") == 0) {
> + return notmuch_options_present (NOTMUCH_OPTION_COMPACT);
> + } else if (STRNCMP_LITERAL (name, "field_processor") == 0) {
> + return notmuch_options_present (NOTMUCH_OPTION_FIELD_PROCESSOR);
> + } else {
> + return FALSE;
> + }
> +}
> diff --git a/notmuch-config.c b/notmuch-config.c
> index d252bb2..cfc549d 100644
> --- a/notmuch-config.c
> +++ b/notmuch-config.c
> @@ -750,6 +750,8 @@ _item_split (char *item, char **group, char **key)
> return 0;
> }
>
> +#define OPTION_PREFIX "options."
> +
> static int
> notmuch_config_command_get (notmuch_config_t *config, char *item)
> {
> @@ -773,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, OPTION_PREFIX) == 0) {
> + printf ("%s\n",
> + notmuch_options_get (item + strlen (OPTION_PREFIX)) ? "true" : "false");
> } else {
> char **value;
> size_t i, length;
> @@ -804,6 +809,11 @@ notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char
> {
> char *group, *key;
>
> + if (STRNCMP_LITERAL (item, OPTION_PREFIX) == 0) {
> + fprintf (stderr, "Error: read only option: %s\n", item);
> + return 1;
> + }
> +
> if (_item_split (item, &group, &key))
> return 1;
>
> @@ -830,6 +840,15 @@ notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char
> return notmuch_config_save (config);
> }
>
> +static
> +void
> +_notmuch_config_list_options () {
> + printf("options.compact=%s\n",
> + notmuch_options_present(NOTMUCH_OPTION_COMPACT) ? "true" : "false");
> + printf("options.field_processor=%s\n",
> + notmuch_options_present(NOTMUCH_OPTION_FIELD_PROCESSOR) ? "true" : "false");
> +}
More information about the notmuch
mailing list