Merge branch 'sg/completion-clear-cached'
authorJunio C Hamano <gitster@pobox.com>
Tue, 8 May 2018 06:59:25 +0000 (15:59 +0900)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 May 2018 06:59:25 +0000 (15:59 +0900)
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

1  2 
contrib/completion/git-completion.bash
index 86a13fca28ef7e0db5c45a5a20f78133a1f339ca,4ef59a51be588c7f7e9de4d8231c2e8d9c8c9d8f..159e6407dfbc2e50fbd08cdb72a63ab3b33a1f40
@@@ -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
                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
  }