I posted a proof of concept a while back [1]. This is the full version. This series lets "git" binary help git-completion.bash to complete --<stuff> so that when a new option is added, we don't have to update git-completion.bash manually too (people often forget it). As a side effect, about 180 more options are now completable. parse-options is updated to allow developers to flag certain options not to be completable if they want finer control over it. But by default, new non-hidden options are completable. Negative forms must be handled manually. That's for the next step. The number of patches is high, but changes after the first four patches and 33/41 are quite simple. I still need some eyeballs though to make sure I have not accidentally allowed completion of dangerous options. Details are broken down per command in each commit message. If people want to play with this, I have a script [2] that shows all completable options for most commands (I ignore some that are shell-based because I don't touch them in this series). You can then do a "diff" to see new/old options. There's a small conflict with 'pu' because --prune-tags is added in git-completion.bash. The solution is simple and beautiful: ignore those changes, --prune-tags will be completable anyway :) [1] https://public-inbox.org/git/%3C20180116103700.4505-1-pclouds@xxxxxxxxx%3E/ [2] https://gist.github.com/pclouds/f337d4393b5cfab813909b8eea2eaa40 Nguyễn Thái Ngọc Duy (41): parse-options: support --git-completion-helper parse-options: add OPT_xxx_F() variants parse-options: let OPT__FORCE take optional flags argument git-completion.bash: introduce __gitcomp_builtin completion: use __gitcomp_builtin in _git_add completion: use __gitcomp_builtin in _git_am completion: use __gitcomp_builtin in _git_apply completion: use __gitcomp_builtin in _git_branch completion: use __gitcomp_builtin in _git_checkout completion: use __gitcomp_builtin in _git_cherry_pick completion: use __gitcomp_builtin in _git_clean completion: use __gitcomp_builtin in _git_clone completion: use __gitcomp_builtin in _git_commit completion: use __gitcomp_builtin in _git_config completion: use __gitcomp_builtin in _git_describe completion: use __gitcomp_builtin in _git_difftool completion: use __gitcomp_builtin in _git_fetch completion: use __gitcomp_builtin in _git_fsck completion: use __gitcomp_builtin in _git_gc completion: use __gitcomp_builtin in _git_grep completion: use __gitcomp_builtin in _git_help completion: use __gitcomp_builtin in _git_init completion: use __gitcomp_builtin in _git_ls_files completion: use __gitcomp_builtin in _git_ls_remote completion: use __gitcomp_builtin in _git_merge completion: use __gitcomp_builtin in _git_merge_base completion: use __gitcomp_builtin in _git_mv completion: use __gitcomp_builtin in _git_name_rev completion: use __gitcomp_builtin in _git_notes completion: use __gitcomp_builtin in _git_pull completion: use __gitcomp_builtin in _git_push completion: use __gitcomp_builtin in _git_remote remote: force completing --mirror= instead of --mirror completion: use __gitcomp_builtin in _git_replace completion: use __gitcomp_builtin in _git_reset completion: use __gitcomp_builtin in _git_revert completion: use __gitcomp_builtin in _git_rm completion: use __gitcomp_builtin in _git_show_branch completion: use __gitcomp_builtin in _git_status completion: use __gitcomp_builtin in _git_tag completion: use __gitcomp_builtin in _git_worktree apply.c | 5 +- builtin/add.c | 2 +- builtin/am.c | 16 +- builtin/branch.c | 2 +- builtin/checkout-index.c | 2 +- builtin/checkout.c | 7 +- builtin/clean.c | 2 +- builtin/fetch.c | 2 +- builtin/gc.c | 7 +- builtin/grep.c | 13 +- builtin/ls-remote.c | 5 +- builtin/mv.c | 3 +- builtin/notes.c | 4 +- builtin/pull.c | 2 +- builtin/push.c | 2 +- builtin/remote.c | 2 +- builtin/replace.c | 3 +- builtin/revert.c | 12 +- builtin/rm.c | 2 +- builtin/tag.c | 2 +- builtin/update-server-info.c | 2 +- builtin/worktree.c | 4 +- contrib/completion/git-completion.bash | 276 +++++++++---------------- parse-options.c | 46 +++++ parse-options.h | 40 ++-- rerere.h | 3 +- t/t9902-completion.sh | 12 +- 27 files changed, 236 insertions(+), 242 deletions(-) -- 2.16.1.205.g271f633410