By default, some option names (mostly --force, scripting related or for internal use) are not completable for various reasons. When GIT_COMPLETION_OPTIONS is set to all, all options (except hidden ones) are completable. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- contrib/completion/git-completion.bash | 6 +++++- parse-options.c | 11 +++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 0ddf40063b..0cfa489a8e 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -36,6 +36,10 @@ # # When set to "1", do not include "DWIM" suggestions in git-checkout # completion (e.g., completing "foo" when "origin/foo" exists). +# +# GIT_COMPLETION_OPTIONS +# +# When set to "all", complete all possible options case "$COMP_WORDBREAKS" in *:*) : great ;; @@ -303,7 +307,7 @@ __gitcomp_builtin () if [ -z "$options" ]; then # leading and trailing spaces are significant to make # option removal work correctly. - options=" $(__git ${cmd/_/ } --git-completion-helper) $incl " + options=" $(__git ${cmd/_/ } --git-completion-helper=$GIT_COMPLETION_OPTIONS) $incl " for i in $excl; do options="${options/ $i / }" done diff --git a/parse-options.c b/parse-options.c index 979577ba2c..5b8b2b376e 100644 --- a/parse-options.c +++ b/parse-options.c @@ -430,14 +430,17 @@ void parse_options_start(struct parse_opt_ctx_t *ctx, * many options that do not suppress it properly. */ static int show_gitcomp(struct parse_opt_ctx_t *ctx, - const struct option *opts) + const struct option *opts, + const char *arg) { for (; opts->type != OPTION_END; opts++) { const char *suffix = ""; if (!opts->long_name) continue; - if (opts->flags & (PARSE_OPT_HIDDEN | PARSE_OPT_NOCOMPLETE)) + if (opts->flags & PARSE_OPT_HIDDEN) + continue; + if ((opts->flags & PARSE_OPT_NOCOMPLETE) && strcmp(arg, "all")) continue; switch (opts->type) { @@ -498,8 +501,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, goto show_usage; /* lone --git-completion-helper is asked by git-completion.bash */ - if (ctx->total == 1 && !strcmp(arg + 1, "-git-completion-helper")) - return show_gitcomp(ctx, options); + if (ctx->total == 1 && skip_prefix(arg + 1, "-git-completion-helper=", &arg)) + return show_gitcomp(ctx, options, arg); if (arg[1] != '-') { ctx->opt = arg + 1; -- 2.16.1.207.gedba492059