From: Junio C Hamano Date: Tue, 8 May 2018 06:59:25 +0000 (+0900) Subject: Merge branch 'sg/completion-clear-cached' X-Git-Tag: v2.18.0-rc0~90 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/1dfb929a37bcb1456832753ec073a3fb5a27ffd0?hp=-c Merge branch 'sg/completion-clear-cached' The completion script (in contrib/) learned to clear cached list of command line options upon dot-sourcing it again in a more efficient way. * sg/completion-clear-cached: completion: reduce overhead of clearing cached --options --- 1dfb929a37bcb1456832753ec073a3fb5a27ffd0 diff --combined contrib/completion/git-completion.bash index 86a13fca28,4ef59a51be..159e6407df --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@@ -29,8 -29,6 +29,8 @@@ # tell the completion to use commit completion. This also works with aliases # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '". # +# Compatible with bash 3.2.57. +# # You can set the following environment variables to influence the behavior of # the completion routines: # @@@ -284,7 -282,11 +284,11 @@@ __gitcomp ( # Clear the variables caching builtins' options when (re-)sourcing # the completion script. - unset $(set |sed -ne 's/^\(__gitcomp_builtin_[a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/p') 2>/dev/null + if [[ -n ${ZSH_VERSION-} ]]; then + unset $(set |sed -ne 's/^\(__gitcomp_builtin_[a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/p') 2>/dev/null + else + unset $(compgen -v __gitcomp_builtin_) + fi # This function is equivalent to # @@@ -390,7 -392,12 +394,7 @@@ __git_index_files ( local root="${2-.}" file __git_ls_files_helper "$root" "$1" | - while read -r file; do - case "$file" in - ?*/*) echo "${file%%/*}" ;; - *) echo "$file" ;; - esac - done | sort | uniq + cut -f1 -d/ | sort | uniq } # Lists branches from the local repository. @@@ -875,7 -882,6 +879,7 @@@ __git_list_porcelain_commands ( check-ref-format) : plumbing;; checkout-index) : plumbing;; column) : internal helper;; + commit-graph) : plumbing;; commit-tree) : plumbing;; count-objects) : infrequent;; credential) : credentials;; @@@ -1282,12 -1288,6 +1286,12 @@@ _git_checkout ( _git_cherry () { + case "$cur" in + --*) + __gitcomp_builtin cherry + return + esac + __git_complete_refs } @@@ -1507,6 -1507,16 +1511,6 @@@ _git_fsck ( esac } -_git_gc () -{ - case "$cur" in - --*) - __gitcomp_builtin gc - return - ;; - esac -} - _git_gitk () { _gitk @@@ -1631,13 -1641,6 +1635,13 @@@ _git_ls_remote ( _git_ls_tree () { + case "$cur" in + --*) + __gitcomp_builtin ls-tree + return + ;; + esac + __git_complete_file } @@@ -1813,6 -1816,11 +1817,6 @@@ _git_mv ( fi } -_git_name_rev () -{ - __gitcomp_builtin name-rev -} - _git_notes () { local subcommands='add append copy edit get-ref list merge prune remove show' @@@ -2346,7 -2354,6 +2350,7 @@@ _git_config ( core.bigFileThreshold core.checkStat core.commentChar + core.commitGraph core.compression core.createObject core.deltaBaseCacheLimit @@@ -3033,45 -3040,6 +3037,45 @@@ _git_worktree ( fi } +__git_complete_common () { + local command="$1" + + case "$cur" in + --*) + __gitcomp_builtin "$command" + ;; + esac +} + +__git_cmds_with_parseopt_helper= +__git_support_parseopt_helper () { + test -n "$__git_cmds_with_parseopt_helper" || + __git_cmds_with_parseopt_helper="$(__git --list-parseopt-builtins)" + + case " $__git_cmds_with_parseopt_helper " in + *" $1 "*) + return 0 + ;; + *) + return 1 + ;; + esac +} + +__git_complete_command () { + local command="$1" + local completion_func="_git_${command//-/_}" + if declare -f $completion_func >/dev/null 2>/dev/null; then + $completion_func + return 0 + elif __git_support_parseopt_helper "$command"; then + __git_complete_common "$command" + return 0 + else + return 1 + fi +} + __git_main () { local i c=1 command __git_dir __git_repo_path @@@ -3131,12 -3099,14 +3135,12 @@@ return fi - local completion_func="_git_${command//-/_}" - declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return + __git_complete_command "$command" && return local expansion=$(__git_aliased_command "$command") if [ -n "$expansion" ]; then words[1]=$expansion - completion_func="_git_${expansion//-/_}" - declare -f $completion_func >/dev/null 2>/dev/null && $completion_func + __git_complete_command "$expansion" fi }