* RFC: add space as argument separator
@ 2017-03-28 12:00 David Bremner
2017-03-28 12:00 ` [rfc patch 1/2] cli: change api of parse_option David Bremner
2017-03-28 12:00 ` [rfc patch 2/2] cli: add space seperator for keyword, string, and int arguments David Bremner
0 siblings, 2 replies; 3+ messages in thread
From: David Bremner @ 2017-03-28 12:00 UTC (permalink / raw)
To: notmuch
I guess the main question here is whether we should support space as
seperators for boolean arguments as well. I'm not really sure if it's
possible to dissambiguate e.g.
% notmuch show --decrypt false friends
It's not clear if false is a search term or an argument to decrypt.
Personally I can live with requiring = or : for cases where a boolean
option needs to be set.
The other issue is completion. I guess this probably breaks bash / zsh
completion (or at least using ' ' does); I have not tested.
^ permalink raw reply [flat|nested] 3+ messages in thread
* [rfc patch 1/2] cli: change api of parse_option
2017-03-28 12:00 RFC: add space as argument separator David Bremner
@ 2017-03-28 12:00 ` David Bremner
2017-03-28 12:00 ` [rfc patch 2/2] cli: add space seperator for keyword, string, and int arguments David Bremner
1 sibling, 0 replies; 3+ messages in thread
From: David Bremner @ 2017-03-28 12:00 UTC (permalink / raw)
To: notmuch
The idea is to allow it (in a future commit) advance to the next argv
element to get a value
---
command-line-arguments.c | 37 ++++++++++++++++++++-----------------
command-line-arguments.h | 4 ++--
test/T690-command-line-args.sh | 11 +++++++++++
3 files changed, 33 insertions(+), 19 deletions(-)
create mode 100755 test/T690-command-line-args.sh
diff --git a/command-line-arguments.c b/command-line-arguments.c
index de6b4536..72b950e9 100644
--- a/command-line-arguments.c
+++ b/command-line-arguments.c
@@ -121,18 +121,24 @@ parse_position_arg (const char *arg_str, int pos_arg_index,
* parse a possible value, and assign to *output_var
*/
-notmuch_bool_t
-parse_option (const char *_arg, const notmuch_opt_desc_t *options)
+int
+parse_option (int argc, char **argv, const notmuch_opt_desc_t *options, int opt_index)
{
+ assert(argv);
+
+ const char *_arg = argv[opt_index];
+
assert(_arg);
assert(options);
const char *arg = _arg + 2; /* _arg starts with -- */
const notmuch_opt_desc_t *try;
for (try = options; try->opt_type != NOTMUCH_OPT_END; try++) {
- if (try->opt_type == NOTMUCH_OPT_INHERIT &&
- parse_option (_arg, try->output_var))
- return TRUE;
+ if (try->opt_type == NOTMUCH_OPT_INHERIT) {
+ int new_index = parse_option (argc, argv, try->output_var, opt_index);
+ if (new_index >= 0)
+ return new_index;
+ }
if (! try->name)
continue;
@@ -158,13 +164,13 @@ parse_option (const char *_arg, const notmuch_opt_desc_t *options)
switch (try->opt_type) {
case NOTMUCH_OPT_KEYWORD:
case NOTMUCH_OPT_KEYWORD_FLAGS:
- return _process_keyword_arg (try, next, value);
+ return _process_keyword_arg (try, next, value) ? opt_index + 1 : (-1);
case NOTMUCH_OPT_BOOLEAN:
- return _process_boolean_arg (try, next, value);
+ return _process_boolean_arg (try, next, value) ? opt_index + 1 : (-1);
case NOTMUCH_OPT_INT:
- return _process_int_arg (try, next, value);
+ return _process_int_arg (try, next, value) ? opt_index + 1 : (-1);
case NOTMUCH_OPT_STRING:
- return _process_string_arg (try, next, value);
+ return _process_string_arg (try, next, value) ? opt_index + 1 : (-1);
case NOTMUCH_OPT_POSITION:
case NOTMUCH_OPT_END:
default:
@@ -172,7 +178,7 @@ parse_option (const char *_arg, const notmuch_opt_desc_t *options)
/*UNREACHED*/
}
}
- return FALSE;
+ return -1;
}
/* See command-line-arguments.h for description */
@@ -194,18 +200,15 @@ parse_arguments (int argc, char **argv,
}
} else {
-
if (strlen (argv[opt_index]) == 2)
return opt_index+1;
- more_args = parse_option (argv[opt_index], options);
- if (more_args) {
- opt_index++;
- } else {
+ opt_index = parse_option (argc, argv, options, opt_index);
+ /* this is currently broken as -1 is never returned */
+ if (opt_index < 0) {
fprintf (stderr, "Unrecognized option: %s\n", argv[opt_index]);
- opt_index = -1;
+ more_args = FALSE;
}
-
}
}
diff --git a/command-line-arguments.h b/command-line-arguments.h
index 309aaf2b..4c4d240e 100644
--- a/command-line-arguments.h
+++ b/command-line-arguments.h
@@ -70,8 +70,8 @@ parse_arguments (int argc, char **argv, const notmuch_opt_desc_t *options, int o
* functions.
*/
-notmuch_bool_t
-parse_option (const char *arg, const notmuch_opt_desc_t* options);
+int
+parse_option (int argc, char **argv, const notmuch_opt_desc_t* options, int opt_index);
notmuch_bool_t
parse_position_arg (const char *arg,
diff --git a/test/T690-command-line-args.sh b/test/T690-command-line-args.sh
new file mode 100755
index 00000000..01592749
--- /dev/null
+++ b/test/T690-command-line-args.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+test_description="command line arguments"
+. ./test-lib.sh || exit 1
+
+NOTMUCH_NEW > /dev/null
+
+test_begin_subtest 'bad option to show'
+test_expect_code 1 'notmuch show --this-is-not-an-option'
+
+test_done
--
2.11.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [rfc patch 2/2] cli: add space seperator for keyword, string, and int arguments
2017-03-28 12:00 RFC: add space as argument separator David Bremner
2017-03-28 12:00 ` [rfc patch 1/2] cli: change api of parse_option David Bremner
@ 2017-03-28 12:00 ` David Bremner
1 sibling, 0 replies; 3+ messages in thread
From: David Bremner @ 2017-03-28 12:00 UTC (permalink / raw)
To: notmuch
Defer the complication of optional boolean arguments for later (never?).
---
command-line-arguments.c | 11 +++++++++++
test/T690-command-line-args.sh | 40 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/command-line-arguments.c b/command-line-arguments.c
index 72b950e9..91e9e06f 100644
--- a/command-line-arguments.c
+++ b/command-line-arguments.c
@@ -133,6 +133,11 @@ parse_option (int argc, char **argv, const notmuch_opt_desc_t *options, int opt_
const char *arg = _arg + 2; /* _arg starts with -- */
const notmuch_opt_desc_t *try;
+
+ const char *next_arg = NULL;
+ if (opt_index < argc - 1 && strncmp (argv[opt_index + 1], "--", 2) != 0)
+ next_arg = argv[opt_index + 1];
+
for (try = options; try->opt_type != NOTMUCH_OPT_END; try++) {
if (try->opt_type == NOTMUCH_OPT_INHERIT) {
int new_index = parse_option (argc, argv, try->output_var, opt_index);
@@ -158,6 +163,12 @@ parse_option (int argc, char **argv, const notmuch_opt_desc_t *options, int opt_
if (next != '=' && next != ':' && next != '\0')
continue;
+ if (next == '\0' && next_arg != NULL && try->opt_type != NOTMUCH_OPT_BOOLEAN) {
+ next = ' ';
+ value = next_arg;
+ opt_index ++;
+ }
+
if (try->output_var == NULL)
INTERNAL_ERROR ("output pointer NULL for option %s", try->name);
diff --git a/test/T690-command-line-args.sh b/test/T690-command-line-args.sh
index 01592749..8d98abe0 100755
--- a/test/T690-command-line-args.sh
+++ b/test/T690-command-line-args.sh
@@ -3,9 +3,47 @@
test_description="command line arguments"
. ./test-lib.sh || exit 1
-NOTMUCH_NEW > /dev/null
+add_message
test_begin_subtest 'bad option to show'
test_expect_code 1 'notmuch show --this-is-not-an-option'
+test_begin_subtest 'string option with space'
+cp /dev/null EXPECTED
+notmuch dump --output foo.txt '*' >& OUTPUT
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest 'string option with ='
+cp /dev/null EXPECTED
+notmuch dump --output=foo.txt '*' >& OUTPUT
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest 'single keyword option with space'
+cat <<EOF > EXPECTED
+id:msg-001@notmuch-test-suite
+EOF
+notmuch search --output messages '*' >& OUTPUT
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest 'multiple keyword options with space'
+cat <<EOF > EXPECTED
+["msg-001@notmuch-test-suite"]
+EOF
+notmuch search --output messages --format json '*' >& OUTPUT
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest 'mixed space and = delimiters'
+cat <<EOF > EXPECTED
+["msg-001@notmuch-test-suite"]
+EOF
+notmuch search --output messages --format=json '*' >& OUTPUT
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest 'keyword option with ='
+cat <<EOF > EXPECTED
+["msg-001@notmuch-test-suite"]
+EOF
+notmuch search --output=messages --format=json '*' >& OUTPUT
+test_expect_equal_file EXPECTED OUTPUT
+
test_done
--
2.11.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-03-28 12:01 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-28 12:00 RFC: add space as argument separator David Bremner
2017-03-28 12:00 ` [rfc patch 1/2] cli: change api of parse_option David Bremner
2017-03-28 12:00 ` [rfc patch 2/2] cli: add space seperator for keyword, string, and int arguments David Bremner
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).