From 0c48769de3965b9d62688f671e95267b3f40c998 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Tue, 13 Aug 2019 15:05:09 -0400 Subject: [PATCH] bin: Better handle -- We would stop passing through `--` and args after it to the underlying command in `ostree_run`. This made it impossible to use `--` to tell the parser that following args starting with `-` really are positional. AFAICT, that logic for `--` here came from a time when we parse options manually in a big loop, in which case breaking out made sense (see 97558276e4f855442337be01abc8f90cf0dd1810). There's an extra step here, which is that glib by default leaves the `--` in the list of args, so we need to take care to remove it from the list after parsing. Closes: #1898 Closes: #1899 Approved by: rfairley --- src/ostree/ot-main.c | 21 ++++++++++++++++----- tests/test-config.sh | 4 +++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/ostree/ot-main.c b/src/ostree/ot-main.c index c9c4f299..4b72f399 100644 --- a/src/ostree/ot-main.c +++ b/src/ostree/ot-main.c @@ -152,11 +152,6 @@ ostree_run (int argc, } } - else if (g_str_equal (argv[in], "--")) - { - break; - } - argv[out] = argv[in]; } @@ -348,6 +343,22 @@ ostree_option_context_parse (GOptionContext *context, if (!g_option_context_parse (context, argc, argv, error)) return FALSE; + /* Filter out the first -- we see; g_option_context_parse() leaves it in */ + int in, out; + gboolean removed_double_dashes = FALSE; + for (in = 1, out = 1; in < *argc; in++, out++) + { + if (g_str_equal ((*argv)[in], "--") && !removed_double_dashes) + { + removed_double_dashes = TRUE; + out--; + continue; + } + + (*argv)[out] = (*argv)[in]; + } + *argc = out; + if (opt_version) { /* This should now be YAML, like `docker version`, so it's both nice to read diff --git a/tests/test-config.sh b/tests/test-config.sh index 7e913d32..2f44c30b 100755 --- a/tests/test-config.sh +++ b/tests/test-config.sh @@ -66,9 +66,11 @@ fi assert_file_has_content err.txt "error: Too many arguments given" echo "ok config set" -# Check that "ostree config unset" works +# Check that using `--` works and that "ostree config unset" works ${CMD_PREFIX} ostree config --repo=repo set core.lock-timeout-secs 60 assert_file_has_content repo/config "lock-timeout-secs=60" +${CMD_PREFIX} ostree config --repo=repo -- set core.lock-timeout-secs -1 +assert_file_has_content repo/config "lock-timeout-secs=-1" ${CMD_PREFIX} ostree config --repo=repo unset core.lock-timeout-secs assert_not_file_has_content repo/config "lock-timeout-secs="