]> git.ipfire.org Git - thirdparty/git.git/commit - parse-options.h
parse-options: don't emit "ambiguous option" for aliases
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Mon, 29 Apr 2019 10:05:25 +0000 (17:05 +0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 7 May 2019 03:23:22 +0000 (12:23 +0900)
commit5c387428f10c27c24d3adb890cd466e2300518fa
treedfe83739e3ed8989f54a6dc58222a51959534c99
parent83232e38648b51abbcbdb56c94632b6906cc85a6
parse-options: don't emit "ambiguous option" for aliases

Change the option parsing machinery so that e.g. "clone --recurs ..."
doesn't error out because "clone" understands both "--recursive" and
"--recurse-submodules" to mean the same thing.

Initially "clone" just understood --recursive until the
--recurses-submodules alias was added in ccdd3da652 ("clone: Add the
--recurse-submodules option as alias for --recursive",
2010-11-04). Since bb62e0a99f ("clone: teach --recurse-submodules to
optionally take a pathspec", 2017-03-17) the longer form has been
promoted to the default.

But due to the way the options parsing machinery works this resulted
in the rather absurd situation of:

    $ git clone --recurs [...]
    error: ambiguous option: recurs (could be --recursive or --recurse-submodules)

Add OPT_ALIAS() to express this link between two or more options and use
it in git-clone. Multiple aliases of an option could be written as

    OPT_ALIAS(0, "alias1", "original-name"),
    OPT_ALIAS(0, "alias2", "original-name"),
    ...

The current implementation is not exactly optimal in this case. But we
can optimize it when it becomes a problem. So far we don't even have two
aliases of any option.

A big chunk of code is actually from Junio C Hamano.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/clone.c
parse-options.c
parse-options.h
t/helper/test-parse-options.c
t/t0040-parse-options.sh