cli: add space separator for keyword, string, and int arguments

Defer the complication of optional boolean arguments for later (never?).
This commit is contained in:
David Bremner 2017-07-01 12:18:45 -03:00
parent de9baa29dc
commit a32dd81a55
4 changed files with 104 additions and 1 deletions

View file

@ -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 char *arg = _arg + 2; /* _arg starts with -- */
const notmuch_opt_desc_t *try; 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++) { for (try = options; try->opt_type != NOTMUCH_OPT_END; try++) {
if (try->opt_type == NOTMUCH_OPT_INHERIT) { if (try->opt_type == NOTMUCH_OPT_INHERIT) {
int new_index = parse_option (argc, argv, try->output_var, opt_index); 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') if (next != '=' && next != ':' && next != '\0')
continue; continue;
if (next == '\0' && next_arg != NULL && try->opt_type != NOTMUCH_OPT_BOOLEAN) {
next = ' ';
value = next_arg;
opt_index ++;
}
if (try->output_var == NULL) if (try->output_var == NULL)
INTERNAL_ERROR ("output pointer NULL for option %s", try->name); INTERNAL_ERROR ("output pointer NULL for option %s", try->name);

View file

@ -125,6 +125,20 @@ users to have their own notmuch related tools to be run via the
notmuch command. By design, this does not allow notmuch's own commands notmuch command. By design, this does not allow notmuch's own commands
to be overriden using external commands. to be overriden using external commands.
OPTION SYNTAX
-------------
All options accepting an argument can be used with '=' or ':' as a
separator. For the cases where it's not ambiguous (in particular
excluding boolean options), a space can also be used. The following
are all equivalent:
::
notmuch --config=alt-config config get user.name
notmuch --config:alt-config config get user.name
notmuch --config alt-config config get user.name
ENVIRONMENT ENVIRONMENT
=========== ===========

View file

@ -69,6 +69,14 @@ notmuch --config=alt-config config set user.name "Another Name"
test_expect_equal "$(notmuch --config=alt-config config get user.name)" \ test_expect_equal "$(notmuch --config=alt-config config get user.name)" \
"Another Name" "Another Name"
test_begin_subtest "Top level --config:FILE option"
test_expect_equal "$(notmuch --config:alt-config config get user.name)" \
"Another Name"
test_begin_subtest "Top level --config<space>FILE option"
test_expect_equal "$(notmuch --config alt-config config get user.name)" \
"Another Name"
test_begin_subtest "Top level --config=FILE option changed the right file" test_begin_subtest "Top level --config=FILE option changed the right file"
test_expect_equal "$(notmuch config get user.name)" \ test_expect_equal "$(notmuch config get user.name)" \
"Notmuch Test Suite" "Notmuch Test Suite"

View file

@ -3,7 +3,7 @@
test_description="command line arguments" test_description="command line arguments"
. ./test-lib.sh || exit 1 . ./test-lib.sh || exit 1
NOTMUCH_NEW > /dev/null add_message
test_begin_subtest 'bad option to show' test_begin_subtest 'bad option to show'
notmuch show --frobnicate >& OUTPUT notmuch show --frobnicate >& OUTPUT
@ -12,4 +12,74 @@ Unrecognized option: --frobnicate
EOF EOF
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT
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 '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 'single keyword option with ='
cat <<EOF > EXPECTED
id:msg-001@notmuch-test-suite
EOF
notmuch search --output=messages '*' >& OUTPUT
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest 'single keyword option with :'
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 'multiple keyword options with ='
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 '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 'show --entire-thread'
test_expect_success 'notmuch show --entire-thread tag:test > /dev/null'
test_begin_subtest 'show --exclude'
test_expect_success 'notmuch show --exclude tag:test > /dev/null'
test_done test_done