git rev-parse --parseopt does not allow us to see the difference between an option with an optional argument starting with a dash, and an option with an unset optional argument followed by an other option. If I use this script : $ cat /tmp/opt.sh #!/bin/sh OPTIONS_SPEC="\ git [options] -- q,quiet be quiet S,gpg-sign? GPG-sign commit" echo "$OPTIONS_SPEC" | git rev-parse --parseopt $parseopt_extra -- "$@" Then the following two commands give us the same result : $ /tmp/opt.sh -S -q set -- -S -q -- $ /tmp/opt.sh -S-q set -- -S '-q' -- We cannot know if '-q' is an argument to '-S' or a new option. With this patch, rev-parse --parseopt will always give an argument to optional options, as an empty string if the argument is unset. The same two commands now give us : $ /tmp/opt.sh -S -q set -- -S '' -q -- $ /tmp/opt.sh -S-q set -- -S '-q' -- We can now see if '-q' is an argument to '-S' or an other option. Also adding two tests in t1502. There does not seem to be any shell script git command included in git sources tree that is currently using optional arguments and could be affected by this change. Signed-off-by: Nicolas Vigier <boklm@xxxxxxxxxxxxxxxx> --- builtin/rev-parse.c | 3 +++ t/t1502-rev-parse-parseopt.sh | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index de894c7..25e8c74 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -327,6 +327,9 @@ static int parseopt_dump(const struct option *o, const char *arg, int unset) if (arg) { strbuf_addch(parsed, ' '); sq_quote_buf(parsed, arg); + } else if (o->flags & PARSE_OPT_OPTARG) { + const char empty_arg[] = " ''"; + strbuf_add(parsed, empty_arg, strlen(empty_arg)); } return 0; } diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index 13c88c9..abe7c2f 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -99,4 +99,22 @@ test_expect_success 'test --parseopt --keep-dashdash --stop-at-non-option withou test_cmp expect output ' +cat > expect <<EOF +set -- -C '' --foo -- +EOF + +test_expect_success 'test --parseopt -C --foo' ' + git rev-parse --parseopt -- -C --foo <optionspec >output && + test_cmp expect output +' + +cat > expect <<EOF +set -- -C '--foo' -- +EOF + +test_expect_success 'test --parseopt -C--foo' ' + git rev-parse --parseopt -- -C--foo <optionspec >output && + test_cmp expect output +' + test_done -- 1.8.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html