Blame | Last modification | View Log | RSS feed
# bash completion support for core Git.## Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org># Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).# Distributed under the GNU General Public License, version 2.0.## The contained completion routines provide support for completing:## *) local and remote branch names# *) local and remote tag names# *) .git/remotes file names# *) git 'subcommands'# *) tree paths within 'ref:path/to/file' expressions# *) common --long-options## To use these routines:## 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).# 2) Added the following line to your .bashrc:# source ~/.git-completion.sh## 3) Consider changing your PS1 to also show the current branch:# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '## The argument to __git_ps1 will be displayed only if you# are currently in a git repository. The %s token will be# the name of the current branch.## In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty# value, unstaged (*) and staged (+) changes will be shown next# to the branch name. You can configure this per-repository# with the bash.showDirtyState variable, which defaults to true# once GIT_PS1_SHOWDIRTYSTATE is enabled.## You can also see if currently something is stashed, by setting# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,# then a '$' will be shown next to the branch name.## If you would like to see if there're untracked files, then you can# set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're# untracked files, then a '%' will be shown next to the branch name.## To submit patches:## *) Read Documentation/SubmittingPatches# *) Send all patches to the current maintainer:## "Shawn O. Pearce" <spearce@spearce.org>## *) Always CC the Git mailing list:## git@vger.kernel.org#case "$COMP_WORDBREAKS" in*:*) : great ;;*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"esac# __gitdir accepts 0 or 1 arguments (i.e., location)# returns location of .git repo__gitdir (){if [ -z "${1-}" ]; thenif [ -n "${__git_dir-}" ]; thenecho "$__git_dir"elif [ -d .git ]; thenecho .gitelsegit rev-parse --git-dir 2>/dev/nullfielif [ -d "$1/.git" ]; thenecho "$1/.git"elseecho "$1"fi}# __git_ps1 accepts 0 or 1 arguments (i.e., format string)# returns text to add to bash PS1 prompt (includes branch name)__git_ps1 (){local g="$(__gitdir)"if [ -n "$g" ]; thenlocal rlocal bif [ -f "$g/rebase-merge/interactive" ]; thenr="|REBASE-i"b="$(cat "$g/rebase-merge/head-name")"elif [ -d "$g/rebase-merge" ]; thenr="|REBASE-m"b="$(cat "$g/rebase-merge/head-name")"elseif [ -d "$g/rebase-apply" ]; thenif [ -f "$g/rebase-apply/rebasing" ]; thenr="|REBASE"elif [ -f "$g/rebase-apply/applying" ]; thenr="|AM"elser="|AM/REBASE"fielif [ -f "$g/MERGE_HEAD" ]; thenr="|MERGING"elif [ -f "$g/BISECT_LOG" ]; thenr="|BISECTING"fib="$(git symbolic-ref HEAD 2>/dev/null)" || {b="$(case "${GIT_PS1_DESCRIBE_STYLE-}" in(contains)git describe --contains HEAD ;;(branch)git describe --contains --all HEAD ;;(describe)git describe HEAD ;;(* | default)git describe --exact-match HEAD ;;esac 2>/dev/null)" ||b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||b="unknown"b="($b)"}filocal wlocal ilocal slocal ulocal cif [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; thenif [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; thenc="BARE:"elseb="GIT_DIR!"fielif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; thenif [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; thenif [ "$(git config --bool bash.showDirtyState)" != "false" ]; thengit diff --no-ext-diff --quiet --exit-code || w="*"if git rev-parse --quiet --verify HEAD >/dev/null; thengit diff-index --cached --quiet HEAD -- || i="+"elsei="#"fififiif [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; thengit rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"fiif [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; thenif [ -n "$(git ls-files --others --exclude-standard)" ]; thenu="%"fififilocal f="$w$i$s$u"printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r"fi}# __gitcomp_1 requires 2 arguments__gitcomp_1 (){local c IFS=' '$'\t'$'\n'for c in $1; docase "$c$2" in--*=*) printf %s$'\n' "$c$2" ;;*.) printf %s$'\n' "$c$2" ;;*) printf %s$'\n' "$c$2 " ;;esacdone}# __gitcomp accepts 1, 2, 3, or 4 arguments# generates completion reply with compgen__gitcomp (){local cur="${COMP_WORDS[COMP_CWORD]}"if [ $# -gt 2 ]; thencur="$3"ficase "$cur" in--*=)COMPREPLY=();;*)local IFS=$'\n'COMPREPLY=($(compgen -P "${2-}" \-W "$(__gitcomp_1 "${1-}" "${4-}")" \-- "$cur"));;esac}# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)__git_heads (){local cmd i is_hash=y dir="$(__gitdir "${1-}")"if [ -d "$dir" ]; thengit --git-dir="$dir" for-each-ref --format='%(refname:short)' \refs/headsreturnfifor i in $(git ls-remote "${1-}" 2>/dev/null); docase "$is_hash,$i" iny,*) is_hash=n ;;n,*^{}) is_hash=y ;;n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;n,*) is_hash=y; echo "$i" ;;esacdone}# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)__git_tags (){local cmd i is_hash=y dir="$(__gitdir "${1-}")"if [ -d "$dir" ]; thengit --git-dir="$dir" for-each-ref --format='%(refname:short)' \refs/tagsreturnfifor i in $(git ls-remote "${1-}" 2>/dev/null); docase "$is_hash,$i" iny,*) is_hash=n ;;n,*^{}) is_hash=y ;;n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;n,*) is_hash=y; echo "$i" ;;esacdone}# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)__git_refs (){local i is_hash=y dir="$(__gitdir "${1-}")"local cur="${COMP_WORDS[COMP_CWORD]}" format refsif [ -d "$dir" ]; thencase "$cur" inrefs|refs/*)format="refname"refs="${cur%/*}";;*)for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; doif [ -e "$dir/$i" ]; then echo $i; fidoneformat="refname:short"refs="refs/tags refs/heads refs/remotes";;esacgit --git-dir="$dir" for-each-ref --format="%($format)" \$refsreturnfifor i in $(git ls-remote "$dir" 2>/dev/null); docase "$is_hash,$i" iny,*) is_hash=n ;;n,*^{}) is_hash=y ;;n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;n,*) is_hash=y; echo "$i" ;;esacdone}# __git_refs2 requires 1 argument (to pass to __git_refs)__git_refs2 (){local ifor i in $(__git_refs "$1"); doecho "$i:$i"done}# __git_refs_remotes requires 1 argument (to pass to ls-remote)__git_refs_remotes (){local cmd i is_hash=yfor i in $(git ls-remote "$1" 2>/dev/null); docase "$is_hash,$i" inn,refs/heads/*)is_hash=yecho "$i:refs/remotes/$1/${i#refs/heads/}";;y,*) is_hash=n ;;n,*^{}) is_hash=y ;;n,refs/tags/*) is_hash=y;;n,*) is_hash=y; ;;esacdone}__git_remotes (){local i ngoff IFS=$'\n' d="$(__gitdir)"shopt -q nullglob || ngoff=1shopt -s nullglobfor i in "$d/remotes"/*; doecho ${i#$d/remotes/}done[ "$ngoff" ] && shopt -u nullglobfor i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); doi="${i#remote.}"echo "${i/.url*/}"done}__git_list_merge_strategies (){git merge -s help 2>&1 |sed -n -e '/[Aa]vailable strategies are: /,/^$/{s/\.$//s/.*://s/^[ ]*//s/[ ]*$//p}'}__git_merge_strategies=# 'git merge -s help' (and thus detection of the merge strategy# list) fails, unfortunately, if run outside of any git working# tree. __git_merge_strategies is set to the empty string in# that case, and the detection will be repeated the next time it# is needed.__git_compute_merge_strategies (){: ${__git_merge_strategies:=$(__git_list_merge_strategies)}}__git_complete_file (){local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in?*:*)ref="${cur%%:*}"cur="${cur#*:}"case "$cur" in?*/*)pfx="${cur%/*}"cur="${cur##*/}"ls="$ref:$pfx"pfx="$pfx/";;*)ls="$ref";;esaccase "$COMP_WORDBREAKS" in*:*) : great ;;*) pfx="$ref:$pfx" ;;esaclocal IFS=$'\n'COMPREPLY=($(compgen -P "$pfx" \-W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \| sed '/^100... blob /{s,^.* ,,s,$, ,}/^120000 blob /{s,^.* ,,s,$, ,}/^040000 tree /{s,^.* ,,s,$,/,}s/^.* //')" \-- "$cur"));;*)__gitcomp "$(__git_refs)";;esac}__git_complete_revlist (){local pfx cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in*...*)pfx="${cur%...*}..."cur="${cur#*...}"__gitcomp "$(__git_refs)" "$pfx" "$cur";;*..*)pfx="${cur%..*}.."cur="${cur#*..}"__gitcomp "$(__git_refs)" "$pfx" "$cur";;*)__gitcomp "$(__git_refs)";;esac}__git_complete_remote_or_refspec (){local cmd="${COMP_WORDS[1]}"local cur="${COMP_WORDS[COMP_CWORD]}"local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0while [ $c -lt $COMP_CWORD ]; doi="${COMP_WORDS[c]}"case "$i" in--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;--all)case "$cmd" inpush) no_complete_refspec=1 ;;fetch)COMPREPLY=()return;;*) ;;esac;;-*) ;;*) remote="$i"; break ;;esacc=$((++c))doneif [ -z "$remote" ]; then__gitcomp "$(__git_remotes)"returnfiif [ $no_complete_refspec = 1 ]; thenCOMPREPLY=()returnfi[ "$remote" = "." ] && remote=case "$cur" in*:*)case "$COMP_WORDBREAKS" in*:*) : great ;;*) pfx="${cur%%:*}:" ;;esaccur="${cur#*:}"lhs=0;;+*)pfx="+"cur="${cur#+}";;esaccase "$cmd" infetch)if [ $lhs = 1 ]; then__gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"else__gitcomp "$(__git_refs)" "$pfx" "$cur"fi;;pull)if [ $lhs = 1 ]; then__gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"else__gitcomp "$(__git_refs)" "$pfx" "$cur"fi;;push)if [ $lhs = 1 ]; then__gitcomp "$(__git_refs)" "$pfx" "$cur"else__gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"fi;;esac}__git_complete_strategy (){__git_compute_merge_strategiescase "${COMP_WORDS[COMP_CWORD-1]}" in-s|--strategy)__gitcomp "$__git_merge_strategies"return 0esaclocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--strategy=*)__gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"return 0;;esacreturn 1}__git_list_all_commands (){local i IFS=" "$'\n'for i in $(git help -a|egrep '^ [a-zA-Z0-9]')docase $i in*--*) : helper pattern;;*) echo $i;;esacdone}__git_all_commands=__git_compute_all_commands (){: ${__git_all_commands:=$(__git_list_all_commands)}}__git_list_porcelain_commands (){local i IFS=" "$'\n'__git_compute_all_commandsfor i in "help" $__git_all_commandsdocase $i in*--*) : helper pattern;;applymbox) : ask gittus;;applypatch) : ask gittus;;archimport) : import;;cat-file) : plumbing;;check-attr) : plumbing;;check-ref-format) : plumbing;;checkout-index) : plumbing;;commit-tree) : plumbing;;count-objects) : infrequent;;cvsexportcommit) : export;;cvsimport) : import;;cvsserver) : daemon;;daemon) : daemon;;diff-files) : plumbing;;diff-index) : plumbing;;diff-tree) : plumbing;;fast-import) : import;;fast-export) : export;;fsck-objects) : plumbing;;fetch-pack) : plumbing;;fmt-merge-msg) : plumbing;;for-each-ref) : plumbing;;hash-object) : plumbing;;http-*) : transport;;index-pack) : plumbing;;init-db) : deprecated;;local-fetch) : plumbing;;lost-found) : infrequent;;ls-files) : plumbing;;ls-remote) : plumbing;;ls-tree) : plumbing;;mailinfo) : plumbing;;mailsplit) : plumbing;;merge-*) : plumbing;;mktree) : plumbing;;mktag) : plumbing;;pack-objects) : plumbing;;pack-redundant) : plumbing;;pack-refs) : plumbing;;parse-remote) : plumbing;;patch-id) : plumbing;;peek-remote) : plumbing;;prune) : plumbing;;prune-packed) : plumbing;;quiltimport) : import;;read-tree) : plumbing;;receive-pack) : plumbing;;reflog) : plumbing;;remote-*) : transport;;repo-config) : deprecated;;rerere) : plumbing;;rev-list) : plumbing;;rev-parse) : plumbing;;runstatus) : plumbing;;sh-setup) : internal;;shell) : daemon;;show-ref) : plumbing;;send-pack) : plumbing;;show-index) : plumbing;;ssh-*) : transport;;stripspace) : plumbing;;symbolic-ref) : plumbing;;tar-tree) : deprecated;;unpack-file) : plumbing;;unpack-objects) : plumbing;;update-index) : plumbing;;update-ref) : plumbing;;update-server-info) : daemon;;upload-archive) : plumbing;;upload-pack) : plumbing;;write-tree) : plumbing;;var) : infrequent;;verify-pack) : infrequent;;verify-tag) : plumbing;;*) echo $i;;esacdone}__git_porcelain_commands=__git_compute_porcelain_commands (){__git_compute_all_commands: ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}}__git_aliases (){local i IFS=$'\n'for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); docase "$i" inalias.*)i="${i#alias.}"echo "${i/ */}";;esacdone}# __git_aliased_command requires 1 argument__git_aliased_command (){local word cmdline=$(git --git-dir="$(__gitdir)" \config --get "alias.$1")for word in $cmdline; docase "$word" in\!gitk|gitk)echo "gitk"return;;\!*) : shell command alias ;;-*) : option ;;*=*) : setting env ;;git) : git itself ;;*)echo "$word"returnesacdone}# __git_find_on_cmdline requires 1 argument__git_find_on_cmdline (){local word subcommand c=1while [ $c -lt $COMP_CWORD ]; doword="${COMP_WORDS[c]}"for subcommand in $1; doif [ "$subcommand" = "$word" ]; thenecho "$subcommand"returnfidonec=$((++c))done}__git_has_doubledash (){local c=1while [ $c -lt $COMP_CWORD ]; doif [ "--" = "${COMP_WORDS[c]}" ]; thenreturn 0fic=$((++c))donereturn 1}__git_whitespacelist="nowarn warn error error-all fix"_git_am (){local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"if [ -d "$dir"/rebase-apply ]; then__gitcomp "--skip --continue --resolved --abort"returnficase "$cur" in--whitespace=*)__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"return;;--*)__gitcomp "--3way --committer-date-is-author-date --ignore-date--ignore-whitespace --ignore-space-change--interactive --keep --no-utf8 --signoff --utf8--whitespace= --scissors"returnesacCOMPREPLY=()}_git_apply (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--whitespace=*)__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"return;;--*)__gitcomp "--stat --numstat --summary --check --index--cached --index-info --reverse --reject --unidiff-zero--apply --no-add --exclude=--ignore-whitespace --ignore-space-change--whitespace= --inaccurate-eof --verbose"returnesacCOMPREPLY=()}_git_add (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--interactive --refresh --patch --update --dry-run--ignore-errors --intent-to-add"returnesacCOMPREPLY=()}_git_archive (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--format=*)__gitcomp "$(git archive --list)" "" "${cur##--format=}"return;;--remote=*)__gitcomp "$(__git_remotes)" "" "${cur##--remote=}"return;;--*)__gitcomp "--format= --list --verbose--prefix= --remote= --exec="return;;esac__git_complete_file}_git_bisect (){__git_has_doubledash && returnlocal subcommands="start bad good skip reset visualize replay log run"local subcommand="$(__git_find_on_cmdline "$subcommands")"if [ -z "$subcommand" ]; then__gitcomp "$subcommands"returnficase "$subcommand" inbad|good|reset|skip)__gitcomp "$(__git_refs)";;*)COMPREPLY=();;esac}_git_branch (){local i c=1 only_local_ref="n" has_r="n"while [ $c -lt $COMP_CWORD ]; doi="${COMP_WORDS[c]}"case "$i" in-d|-m) only_local_ref="y" ;;-r) has_r="y" ;;esacc=$((++c))donecase "${COMP_WORDS[COMP_CWORD]}" in--*)__gitcomp "--color --no-color --verbose --abbrev= --no-abbrev--track --no-track --contains --merged --no-merged";;*)if [ $only_local_ref = "y" -a $has_r = "n" ]; then__gitcomp "$(__git_heads)"else__gitcomp "$(__git_refs)"fi;;esac}_git_bundle (){local cmd="${COMP_WORDS[2]}"case "$COMP_CWORD" in2)__gitcomp "create list-heads verify unbundle";;3)# looking for a file;;*)case "$cmd" increate)__git_complete_revlist;;esac;;esac}_git_checkout (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--conflict=*)__gitcomp "diff3 merge" "" "${cur##--conflict=}";;--*)__gitcomp "--quiet --ours --theirs --track --no-track --merge--conflict= --patch";;*)__gitcomp "$(__git_refs)";;esac}_git_cherry (){__gitcomp "$(__git_refs)"}_git_cherry_pick (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--edit --no-commit";;*)__gitcomp "$(__git_refs)";;esac}_git_clean (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--dry-run --quiet"return;;esacCOMPREPLY=()}_git_clone (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--local--no-hardlinks--shared--reference--quiet--no-checkout--bare--mirror--origin--upload-pack--template=--depth"return;;esacCOMPREPLY=()}_git_commit (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--cleanup=*)__gitcomp "default strip verbatim whitespace" "" "${cur##--cleanup=}"return;;--reuse-message=*)__gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"return;;--reedit-message=*)__gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"return;;--untracked-files=*)__gitcomp "all no normal" "" "${cur##--untracked-files=}"return;;--*)__gitcomp "--all --author= --signoff --verify --no-verify--edit --amend --include --only --interactive--dry-run --reuse-message= --reedit-message=--reset-author --file= --message= --template=--cleanup= --untracked-files --untracked-files=--verbose --quiet"returnesacCOMPREPLY=()}_git_describe (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--all --tags --contains --abbrev= --candidates=--exact-match --debug --long --match --always"returnesac__gitcomp "$(__git_refs)"}__git_diff_common_options="--stat --numstat --shortstat --summary--patch-with-stat --name-only --name-status --color--no-color --color-words --no-renames --check--full-index --binary --abbrev --diff-filter=--find-copies-harder--text --ignore-space-at-eol --ignore-space-change--ignore-all-space --exit-code --quiet --ext-diff--no-ext-diff--no-prefix --src-prefix= --dst-prefix=--inter-hunk-context=--patience--raw--dirstat --dirstat= --dirstat-by-file--dirstat-by-file= --cumulative"_git_diff (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex--base --ours --theirs$__git_diff_common_options"return;;esac__git_complete_file}__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendifftkdiff vimdiff gvimdiff xxdiff araxis p4merge"_git_difftool (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--tool=*)__gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"return;;--*)__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex--base --ours --theirs--no-renames --diff-filter= --find-copies-harder--relative --ignore-submodules--tool="return;;esac__git_complete_file}__git_fetch_options="--quiet --verbose --append --upload-pack --force --keep --depth=--tags --no-tags --all --prune --dry-run"_git_fetch (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "$__git_fetch_options"return;;esac__git_complete_remote_or_refspec}_git_format_patch (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--thread=*)__gitcomp "deep shallow" "" "${cur##--thread=}"return;;--*)__gitcomp "--stdout --attach --no-attach --thread --thread=--output-directory--numbered --start-number--numbered-files--keep-subject--signoff--in-reply-to= --cc=--full-index --binary--not --all--cover-letter--no-prefix --src-prefix= --dst-prefix=--inline --suffix= --ignore-if-in-upstream--subject-prefix="return;;esac__git_complete_revlist}_git_fsck (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--tags --root --unreachable --cache --no-reflogs --full--strict --verbose --lost-found"return;;esacCOMPREPLY=()}_git_gc (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--prune --aggressive"return;;esacCOMPREPLY=()}_git_gitk (){_gitk}_git_grep (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--cached--text --ignore-case --word-regexp --invert-match--full-name--extended-regexp --basic-regexp --fixed-strings--files-with-matches --name-only--files-without-match--max-depth--count--and --or --not --all-match"return;;esac__gitcomp "$(__git_refs)"}_git_help (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--all --info --man --web"return;;esac__git_compute_all_commands__gitcomp "$__git_all_commandsattributes cli core-tutorial cvs-migrationdiffcore gitk glossary hooks ignore modulesrepository-layout tutorial tutorial-2workflows"}_git_init (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--shared=*)__gitcomp "false true umask group all world everybody" "" "${cur##--shared=}"return;;--*)__gitcomp "--quiet --bare --template= --shared --shared="return;;esacCOMPREPLY=()}_git_ls_files (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--cached --deleted --modified --others --ignored--stage --directory --no-empty-directory --unmerged--killed --exclude= --exclude-from=--exclude-per-directory= --exclude-standard--error-unmatch --with-tree= --full-name--abbrev --ignored --exclude-per-directory"return;;esacCOMPREPLY=()}_git_ls_remote (){__gitcomp "$(__git_remotes)"}_git_ls_tree (){__git_complete_file}# Options that go well for log, shortlog and gitk__git_log_common_options="--not --all--branches --tags --remotes--first-parent --merges --no-merges--max-count=--max-age= --since= --after=--min-age= --until= --before="# Options that go well for log and gitk (not shortlog)__git_log_gitk_options="--dense --sparse --full-history--simplify-merges --simplify-by-decoration--left-right"# Options that go well for log and shortlog (not gitk)__git_log_shortlog_options="--author= --committer= --grep=--all-match"__git_log_pretty_formats="oneline short medium full fuller email raw format:"__git_log_date_formats="relative iso8601 rfc2822 short local default raw"_git_log (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"local g="$(git rev-parse --git-dir 2>/dev/null)"local merge=""if [ -f "$g/MERGE_HEAD" ]; thenmerge="--merge"ficase "$cur" in--pretty=*)__gitcomp "$__git_log_pretty_formats" "" "${cur##--pretty=}"return;;--format=*)__gitcomp "$__git_log_pretty_formats" "" "${cur##--format=}"return;;--date=*)__gitcomp "$__git_log_date_formats" "" "${cur##--date=}"return;;--decorate=*)__gitcomp "long short" "" "${cur##--decorate=}"return;;--*)__gitcomp "$__git_log_common_options$__git_log_shortlog_options$__git_log_gitk_options--root --topo-order --date-order --reverse--follow --full-diff--abbrev-commit --abbrev=--relative-date --date=--pretty= --format= --oneline--cherry-pick--graph--decorate --decorate=--walk-reflogs--parents --children$merge$__git_diff_common_options--pickaxe-all --pickaxe-regex"return;;esac__git_complete_revlist}__git_merge_options="--no-commit --no-stat --log --no-log --squash --strategy--commit --stat --no-squash --ff --no-ff --ff-only"_git_merge (){__git_complete_strategy && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "$__git_merge_options"returnesac__gitcomp "$(__git_refs)"}_git_mergetool (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--tool=*)__gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"return;;--*)__gitcomp "--tool="return;;esacCOMPREPLY=()}_git_merge_base (){__gitcomp "$(__git_refs)"}_git_mv (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--dry-run"return;;esacCOMPREPLY=()}_git_name_rev (){__gitcomp "--tags --all --stdin"}_git_notes (){local subcommands="edit show"if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then__gitcomp "$subcommands"returnficase "${COMP_WORDS[COMP_CWORD-1]}" in-m|-F)COMPREPLY=();;*)__gitcomp "$(__git_refs)";;esac}_git_pull (){__git_complete_strategy && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--rebase --no-rebase$__git_merge_options$__git_fetch_options"return;;esac__git_complete_remote_or_refspec}_git_push (){local cur="${COMP_WORDS[COMP_CWORD]}"case "${COMP_WORDS[COMP_CWORD-1]}" in--repo)__gitcomp "$(__git_remotes)"returnesaccase "$cur" in--repo=*)__gitcomp "$(__git_remotes)" "" "${cur##--repo=}"return;;--*)__gitcomp "--all --mirror --tags --dry-run --force --verbose--receive-pack= --repo="return;;esac__git_complete_remote_or_refspec}_git_rebase (){local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then__gitcomp "--continue --skip --abort"returnfi__git_complete_strategy && returncase "$cur" in--whitespace=*)__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"return;;--*)__gitcomp "--onto --merge --strategy --interactive--preserve-merges --stat --no-stat--committer-date-is-author-date --ignore-date--ignore-whitespace --whitespace=--autosquash"returnesac__gitcomp "$(__git_refs)"}__git_send_email_confirm_options="always never auto cc compose"__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"_git_send_email (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--confirm=*)__gitcomp "$__git_send_email_confirm_options" "" "${cur##--confirm=}"return;;--suppress-cc=*)__gitcomp "$__git_send_email_suppresscc_options" "" "${cur##--suppress-cc=}"return;;--smtp-encryption=*)__gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"return;;--*)__gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to--compose --confirm= --dry-run --envelope-sender--from --identity--in-reply-to --no-chain-reply-to --no-signed-off-by-cc--no-suppress-from --no-thread --quiet--signed-off-by-cc --smtp-pass --smtp-server--smtp-server-port --smtp-encryption= --smtp-user--subject --suppress-cc= --suppress-from --thread --to--validate --no-validate"return;;esacCOMPREPLY=()}_git_stage (){_git_add}__git_config_get_set_variables (){local prevword word config_file= c=$COMP_CWORDwhile [ $c -gt 1 ]; doword="${COMP_WORDS[c]}"case "$word" in--global|--system|--file=*)config_file="$word"break;;-f|--file)config_file="$word $prevword"break;;esacprevword=$wordc=$((--c))donegit --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |while read linedocase "$line" in*.*=*)echo "${line/=*/}";;esacdone}_git_config (){local cur="${COMP_WORDS[COMP_CWORD]}"local prv="${COMP_WORDS[COMP_CWORD-1]}"case "$prv" inbranch.*.remote)__gitcomp "$(__git_remotes)"return;;branch.*.merge)__gitcomp "$(__git_refs)"return;;remote.*.fetch)local remote="${prv#remote.}"remote="${remote%.fetch}"__gitcomp "$(__git_refs_remotes "$remote")"return;;remote.*.push)local remote="${prv#remote.}"remote="${remote%.push}"__gitcomp "$(git --git-dir="$(__gitdir)" \for-each-ref --format='%(refname):%(refname)' \refs/heads)"return;;pull.twohead|pull.octopus)__git_compute_merge_strategies__gitcomp "$__git_merge_strategies"return;;color.branch|color.diff|color.interactive|\color.showbranch|color.status|color.ui)__gitcomp "always never auto"return;;color.pager)__gitcomp "false true"return;;color.*.*)__gitcomp "normal black red green yellow blue magenta cyan whitebold dim ul blink reverse"return;;help.format)__gitcomp "man info web html"return;;log.date)__gitcomp "$__git_log_date_formats"return;;sendemail.aliasesfiletype)__gitcomp "mutt mailrc pine elm gnus"return;;sendemail.confirm)__gitcomp "$__git_send_email_confirm_options"return;;sendemail.suppresscc)__gitcomp "$__git_send_email_suppresscc_options"return;;--get|--get-all|--unset|--unset-all)__gitcomp "$(__git_config_get_set_variables)"return;;*.*)COMPREPLY=()return;;esaccase "$cur" in--*)__gitcomp "--global --system --file=--list --replace-all--get --get-all --get-regexp--add --unset --unset-all--remove-section --rename-section"return;;branch.*.*)local pfx="${cur%.*}."cur="${cur##*.}"__gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"return;;branch.*)local pfx="${cur%.*}."cur="${cur#*.}"__gitcomp "$(__git_heads)" "$pfx" "$cur" "."return;;guitool.*.*)local pfx="${cur%.*}."cur="${cur##*.}"__gitcomp "argprompt cmd confirm needsfile noconsole norescanprompt revprompt revunmerged title" "$pfx" "$cur"return;;difftool.*.*)local pfx="${cur%.*}."cur="${cur##*.}"__gitcomp "cmd path" "$pfx" "$cur"return;;man.*.*)local pfx="${cur%.*}."cur="${cur##*.}"__gitcomp "cmd path" "$pfx" "$cur"return;;mergetool.*.*)local pfx="${cur%.*}."cur="${cur##*.}"__gitcomp "cmd path trustExitCode" "$pfx" "$cur"return;;pager.*)local pfx="${cur%.*}."cur="${cur#*.}"__git_compute_all_commands__gitcomp "$__git_all_commands" "$pfx" "$cur"return;;remote.*.*)local pfx="${cur%.*}."cur="${cur##*.}"__gitcomp "url proxy fetch push mirror skipDefaultUpdatereceivepack uploadpack tagopt pushurl" "$pfx" "$cur"return;;remote.*)local pfx="${cur%.*}."cur="${cur#*.}"__gitcomp "$(__git_remotes)" "$pfx" "$cur" "."return;;url.*.*)local pfx="${cur%.*}."cur="${cur##*.}"__gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"return;;esac__gitcomp "add.ignore-errorsalias.apply.ignorewhitespaceapply.whitespacebranch.autosetupmergebranch.autosetuprebaseclean.requireForcecolor.branchcolor.branch.currentcolor.branch.localcolor.branch.plaincolor.branch.remotecolor.diffcolor.diff.commitcolor.diff.fragcolor.diff.metacolor.diff.newcolor.diff.oldcolor.diff.plaincolor.diff.whitespacecolor.grepcolor.grep.externalcolor.grep.matchcolor.interactivecolor.interactive.headercolor.interactive.helpcolor.interactive.promptcolor.pagercolor.showbranchcolor.statuscolor.status.addedcolor.status.changedcolor.status.headercolor.status.nobranchcolor.status.untrackedcolor.status.updatedcolor.uicommit.templatecore.autocrlfcore.barecore.compressioncore.createObjectcore.deltaBaseCacheLimitcore.editorcore.excludesfilecore.fileModecore.fsyncobjectfilescore.gitProxycore.ignoreCygwinFSTrickscore.ignoreStatcore.logAllRefUpdatescore.loosecompressioncore.packedGitLimitcore.packedGitWindowSizecore.pagercore.preferSymlinkRefscore.preloadindexcore.quotepathcore.repositoryFormatVersioncore.safecrlfcore.sharedRepositorycore.symlinkscore.trustctimecore.warnAmbiguousRefscore.whitespacecore.worktreediff.autorefreshindexdiff.externaldiff.mnemonicprefixdiff.renameLimitdiff.renameLimit.diff.renamesdiff.suppressBlankEmptydiff.tooldiff.wordRegexdifftool.difftool.promptfetch.unpackLimitformat.attachformat.ccformat.headersformat.numberedformat.prettyformat.signoffformat.subjectprefixformat.suffixformat.threadgc.aggressiveWindowgc.autogc.autopacklimitgc.packrefsgc.pruneexpiregc.reflogexpiregc.reflogexpireunreachablegc.rerereresolvedgc.rerereunresolvedgitcvs.allbinarygitcvs.commitmsgannotationgitcvs.dbTableNamePrefixgitcvs.dbdrivergitcvs.dbnamegitcvs.dbpassgitcvs.dbusergitcvs.enabledgitcvs.logfilegitcvs.usecrlfattrguitool.gui.blamehistoryctxgui.commitmsgwidthgui.copyblamethresholdgui.diffcontextgui.encodinggui.fastcopyblamegui.matchtrackingbranchgui.newbranchtemplategui.pruneduringfetchgui.spellingdictionarygui.trustmtimehelp.autocorrecthelp.browserhelp.formathttp.lowSpeedLimithttp.lowSpeedTimehttp.maxRequestshttp.noEPSVhttp.proxyhttp.sslCAInfohttp.sslCAPathhttp.sslCerthttp.sslKeyhttp.sslVerifyi18n.commitEncodingi18n.logOutputEncodingimap.folderimap.hostimap.passimap.portimap.preformattedHTMLimap.sslverifyimap.tunnelimap.userinstaweb.browserinstaweb.httpdinstaweb.localinstaweb.modulepathinstaweb.portinteractive.singlekeylog.datelog.showrootmailmap.fileman.man.viewermerge.conflictstylemerge.logmerge.renameLimitmerge.statmerge.toolmerge.verbositymergetool.mergetool.keepBackupmergetool.promptpack.compressionpack.deltaCacheLimitpack.deltaCacheSizepack.depthpack.indexVersionpack.packSizeLimitpack.threadspack.windowpack.windowMemorypager.pull.octopuspull.twoheadpush.defaultrebase.statreceive.denyCurrentBranchreceive.denyDeletesreceive.denyNonFastForwardsreceive.fsckObjectsreceive.unpackLimitrepack.usedeltabaseoffsetrerere.autoupdatererere.enabledsendemail.aliasesfilesendemail.aliasesfiletypesendemail.bccsendemail.ccsendemail.cccmdsendemail.chainreplytosendemail.confirmsendemail.envelopesendersendemail.multieditsendemail.signedoffbyccsendemail.smtpencryptionsendemail.smtppasssendemail.smtpserversendemail.smtpserverportsendemail.smtpusersendemail.suppressccsendemail.suppressfromsendemail.threadsendemail.tosendemail.validateshowbranch.defaultstatus.relativePathsstatus.showUntrackedFilestar.umasktransfer.unpackLimiturl.user.emailuser.nameuser.signingkeyweb.browserbranch. remote."}_git_remote (){local subcommands="add rename rm show prune update set-head"local subcommand="$(__git_find_on_cmdline "$subcommands")"if [ -z "$subcommand" ]; then__gitcomp "$subcommands"returnficase "$subcommand" inrename|rm|show|prune)__gitcomp "$(__git_remotes)";;update)local i c='' IFS=$'\n'for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); doi="${i#remotes.}"c="$c ${i/ */}"done__gitcomp "$c";;*)COMPREPLY=();;esac}_git_replace (){__gitcomp "$(__git_refs)"}_git_reset (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--merge --mixed --hard --soft --patch"return;;esac__gitcomp "$(__git_refs)"}_git_revert (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--edit --mainline --no-edit --no-commit --signoff"return;;esac__gitcomp "$(__git_refs)"}_git_rm (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--cached --dry-run --ignore-unmatch --quiet"return;;esacCOMPREPLY=()}_git_shortlog (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "$__git_log_common_options$__git_log_shortlog_options--numbered --summary"return;;esac__git_complete_revlist}_git_show (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--pretty=*)__gitcomp "$__git_log_pretty_formats" "" "${cur##--pretty=}"return;;--format=*)__gitcomp "$__git_log_pretty_formats" "" "${cur##--format=}"return;;--*)__gitcomp "--pretty= --format= --abbrev-commit --oneline$__git_diff_common_options"return;;esac__git_complete_file}_git_show_branch (){local cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--all --remotes --topo-order --current --more=--list --independent --merge-base --no-name--color --no-color--sha1-name --sparse --topics --reflog"return;;esac__git_complete_revlist}_git_stash (){local cur="${COMP_WORDS[COMP_CWORD]}"local save_opts='--keep-index --no-keep-index --quiet --patch'local subcommands='save list show apply clear drop pop create branch'local subcommand="$(__git_find_on_cmdline "$subcommands")"if [ -z "$subcommand" ]; thencase "$cur" in--*)__gitcomp "$save_opts";;*)if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then__gitcomp "$subcommands"elseCOMPREPLY=()fi;;esacelsecase "$subcommand,$cur" insave,--*)__gitcomp "$save_opts";;apply,--*|pop,--*)__gitcomp "--index --quiet";;show,--*|drop,--*|branch,--*)COMPREPLY=();;show,*|apply,*|drop,*|pop,*|branch,*)__gitcomp "$(git --git-dir="$(__gitdir)" stash list \| sed -n -e 's/:.*//p')";;*)COMPREPLY=();;esacfi}_git_submodule (){__git_has_doubledash && returnlocal subcommands="add status init update summary foreach sync"if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; thenlocal cur="${COMP_WORDS[COMP_CWORD]}"case "$cur" in--*)__gitcomp "--quiet --cached";;*)__gitcomp "$subcommands";;esacreturnfi}_git_svn (){local subcommands="init fetch clone rebase dcommit log find-revset-tree commit-diff info create-ignore propgetproplist show-ignore show-externals branch tag blamemigrate mkdirs reset gc"local subcommand="$(__git_find_on_cmdline "$subcommands")"if [ -z "$subcommand" ]; then__gitcomp "$subcommands"elselocal remote_opts="--username= --config-dir= --no-auth-cache"local fc_opts="--follow-parent --authors-file= --repack=--no-metadata --use-svm-props --use-svnsync-props--log-window-size= --no-checkout --quiet--repack-flags --use-log-author --localtime--ignore-paths= $remote_opts"local init_opts="--template= --shared= --trunk= --tags=--branches= --stdlayout --minimize-url--no-metadata --use-svm-props --use-svnsync-props--rewrite-root= --prefix= --use-log-author--add-author-from $remote_opts"local cmt_opts="--edit --rmdir --find-copies-harder --copy-similarity="local cur="${COMP_WORDS[COMP_CWORD]}"case "$subcommand,$cur" infetch,--*)__gitcomp "--revision= --fetch-all $fc_opts";;clone,--*)__gitcomp "--revision= $fc_opts $init_opts";;init,--*)__gitcomp "$init_opts";;dcommit,--*)__gitcomp "--merge --strategy= --verbose --dry-run--fetch-all --no-rebase --commit-url--revision $cmt_opts $fc_opts";;set-tree,--*)__gitcomp "--stdin $cmt_opts $fc_opts";;create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\show-externals,--*|mkdirs,--*)__gitcomp "--revision=";;log,--*)__gitcomp "--limit= --revision= --verbose --incremental--oneline --show-commit --non-recursive--authors-file= --color";;rebase,--*)__gitcomp "--merge --verbose --strategy= --local--fetch-all --dry-run $fc_opts";;commit-diff,--*)__gitcomp "--message= --file= --revision= $cmt_opts";;info,--*)__gitcomp "--url";;branch,--*)__gitcomp "--dry-run --message --tag";;tag,--*)__gitcomp "--dry-run --message";;blame,--*)__gitcomp "--git-format";;migrate,--*)__gitcomp "--config-dir= --ignore-paths= --minimize--no-auth-cache --username=";;reset,--*)__gitcomp "--revision= --parent";;*)COMPREPLY=();;esacfi}_git_tag (){local i c=1 f=0while [ $c -lt $COMP_CWORD ]; doi="${COMP_WORDS[c]}"case "$i" in-d|-v)__gitcomp "$(__git_tags)"return;;-f)f=1;;esacc=$((++c))donecase "${COMP_WORDS[COMP_CWORD-1]}" in-m|-F)COMPREPLY=();;-*|tag)if [ $f = 1 ]; then__gitcomp "$(__git_tags)"elseCOMPREPLY=()fi;;*)__gitcomp "$(__git_refs)";;esac}_git_whatchanged (){_git_log}_git (){local i c=1 command __git_dirwhile [ $c -lt $COMP_CWORD ]; doi="${COMP_WORDS[c]}"case "$i" in--git-dir=*) __git_dir="${i#--git-dir=}" ;;--bare) __git_dir="." ;;--version|-p|--paginate) ;;--help) command="help"; break ;;*) command="$i"; break ;;esacc=$((++c))doneif [ -z "$command" ]; thencase "${COMP_WORDS[COMP_CWORD]}" in--*) __gitcomp "--paginate--no-pager--git-dir=--bare--version--exec-path--html-path--work-tree=--help";;*) __git_compute_porcelain_commands__gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;esacreturnfilocal completion_func="_git_${command//-/_}"declare -F $completion_func >/dev/null && $completion_func && returnlocal expansion=$(__git_aliased_command "$command")if [ -n "$expansion" ]; thencompletion_func="_git_${expansion//-/_}"declare -F $completion_func >/dev/null && $completion_funcfi}_gitk (){__git_has_doubledash && returnlocal cur="${COMP_WORDS[COMP_CWORD]}"local g="$(__gitdir)"local merge=""if [ -f "$g/MERGE_HEAD" ]; thenmerge="--merge"ficase "$cur" in--*)__gitcomp "$__git_log_common_options$__git_log_gitk_options$merge"return;;esac__git_complete_revlist}complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \|| complete -o default -o nospace -F _git gitcomplete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \|| complete -o default -o nospace -F _gitk gitk# The following are necessary only for Cygwin, and only are needed# when the user has tab-completed the executable name and consequently# included the '.exe' suffix.#if [ Cygwin = "$(uname -o 2>/dev/null)" ]; thencomplete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \|| complete -o default -o nospace -F _git git.exefi