1#!bash 2# 3# bash completion support for core Git. 4# 5# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org> 6# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/). 7# Distributed under the GNU General Public License, version 2.0. 8# 9# The contained completion routines provide support for completing: 10# 11# *) local and remote branch names 12# *) local and remote tag names 13# *) .git/remotes file names 14# *) git 'subcommands' 15# *) tree paths within 'ref:path/to/file' expressions 16# *) common --long-options 17# 18# To use these routines: 19# 20# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh). 21# 2) Added the following line to your .bashrc: 22# source ~/.git-completion.sh 23# 24# Or, add the following lines to your .zshrc: 25# autoload bashcompinit 26# bashcompinit 27# source ~/.git-completion.sh 28# 29# 3) Consider changing your PS1 to also show the current branch: 30# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' 31# 32# The argument to __git_ps1 will be displayed only if you 33# are currently in a git repository. The %s token will be 34# the name of the current branch. 35# 36# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty 37# value, unstaged (*) and staged (+) changes will be shown next 38# to the branch name. You can configure this per-repository 39# with the bash.showDirtyState variable, which defaults to true 40# once GIT_PS1_SHOWDIRTYSTATE is enabled. 41# 42# You can also see if currently something is stashed, by setting 43# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed, 44# then a '$' will be shown next to the branch name. 45# 46# If you would like to see if there're untracked files, then you can 47# set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're 48# untracked files, then a '%' will be shown next to the branch name. 49# 50# If you would like to see the difference between HEAD and its 51# upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates 52# you are behind, ">" indicates you are ahead, and "<>" 53# indicates you have diverged. You can further control 54# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated 55# list of values: 56# verbose show number of commits ahead/behind (+/-) upstream 57# legacy don't use the '--count' option available in recent 58# versions of git-rev-list 59# git always compare HEAD to @{upstream} 60# svn always compare HEAD to your SVN upstream 61# By default, __git_ps1 will compare HEAD to your SVN upstream 62# if it can find one, or @{upstream} otherwise. Once you have 63# set GIT_PS1_SHOWUPSTREAM, you can override it on a 64# per-repository basis by setting the bash.showUpstream config 65# variable. 66# 67# 68# To submit patches: 69# 70# *) Read Documentation/SubmittingPatches 71# *) Send all patches to the current maintainer: 72# 73# "Shawn O. Pearce" <spearce@spearce.org> 74# 75# *) Always CC the Git mailing list: 76# 77# git@vger.kernel.org 78# 79 80case "$COMP_WORDBREAKS" in 81*:*) : great ;; 82*) COMP_WORDBREAKS="$COMP_WORDBREAKS:" 83esac 84 85# __gitdir accepts 0 or 1 arguments (i.e., location) 86# returns location of .git repo 87__gitdir () 88{ 89 if [ -z "${1-}" ]; then 90 if [ -n "${__git_dir-}" ]; then 91 echo "$__git_dir" 92 elif [ -d .git ]; then 93 echo .git 94 else 95 git rev-parse --git-dir 2>/dev/null 96 fi 97 elif [ -d "$1/.git" ]; then 98 echo "$1/.git" 99 else 100 echo "$1" 101 fi 102} 103 104# stores the divergence from upstream in $p 105# used by GIT_PS1_SHOWUPSTREAM 106__git_ps1_show_upstream () 107{ 108 local key value 109 local svn_remote=() svn_url_pattern count n 110 local upstream=git legacy="" verbose="" 111 112 # get some config options from git-config 113 while read key value; do 114 case "$key" in 115 bash.showupstream) 116 GIT_PS1_SHOWUPSTREAM="$value" 117 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then 118 p="" 119 return 120 fi 121 ;; 122 svn-remote.*.url) 123 svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value" 124 svn_url_pattern+="\\|$value" 125 upstream=svn+git # default upstream is SVN if available, else git 126 ;; 127 esac 128 done < <(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ') 129 130 # parse configuration values 131 for option in ${GIT_PS1_SHOWUPSTREAM}; do 132 case "$option" in 133 git|svn) upstream="$option" ;; 134 verbose) verbose=1 ;; 135 legacy) legacy=1 ;; 136 esac 137 done 138 139 # Find our upstream 140 case "$upstream" in 141 git) upstream="@{upstream}" ;; 142 svn*) 143 # get the upstream from the "git-svn-id: ..." in a commit message 144 # (git-svn uses essentially the same procedure internally) 145 local svn_upstream=($(git log --first-parent -1 \ 146 --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null)) 147 if [[ 0 -ne ${#svn_upstream[@]} ]]; then 148 svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]} 149 svn_upstream=${svn_upstream%@*} 150 local n_stop="${#svn_remote[@]}" 151 for ((n=1; n <= n_stop; ++n)); do 152 svn_upstream=${svn_upstream#${svn_remote[$n]}} 153 done 154 155 if [[ -z "$svn_upstream" ]]; then 156 # default branch name for checkouts with no layout: 157 upstream=${GIT_SVN_ID:-git-svn} 158 else 159 upstream=${svn_upstream#/} 160 fi 161 elif [[ "svn+git" = "$upstream" ]]; then 162 upstream="@{upstream}" 163 fi 164 ;; 165 esac 166 167 # Find how many commits we are ahead/behind our upstream 168 if [[ -z "$legacy" ]]; then 169 count="$(git rev-list --count --left-right \ 170 "$upstream"...HEAD 2>/dev/null)" 171 else 172 # produce equivalent output to --count for older versions of git 173 local commits 174 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)" 175 then 176 local commit behind=0 ahead=0 177 for commit in $commits 178 do 179 case "$commit" in 180 "<"*) let ++behind 181 ;; 182 *) let ++ahead 183 ;; 184 esac 185 done 186 count="$behind $ahead" 187 else 188 count="" 189 fi 190 fi 191 192 # calculate the result 193 if [[ -z "$verbose" ]]; then 194 case "$count" in 195 "") # no upstream 196 p="" ;; 197 "0 0") # equal to upstream 198 p="=" ;; 199 "0 "*) # ahead of upstream 200 p=">" ;; 201 *" 0") # behind upstream 202 p="<" ;; 203 *) # diverged from upstream 204 p="<>" ;; 205 esac 206 else 207 case "$count" in 208 "") # no upstream 209 p="" ;; 210 "0 0") # equal to upstream 211 p=" u=" ;; 212 "0 "*) # ahead of upstream 213 p=" u+${count#0 }" ;; 214 *" 0") # behind upstream 215 p=" u-${count% 0}" ;; 216 *) # diverged from upstream 217 p=" u+${count#* }-${count% *}" ;; 218 esac 219 fi 220 221} 222 223 224# __git_ps1 accepts 0 or 1 arguments (i.e., format string) 225# returns text to add to bash PS1 prompt (includes branch name) 226__git_ps1 () 227{ 228 local g="$(__gitdir)" 229 if [ -n "$g" ]; then 230 local r="" 231 local b="" 232 if [ -f "$g/rebase-merge/interactive" ]; then 233 r="|REBASE-i" 234 b="$(cat "$g/rebase-merge/head-name")" 235 elif [ -d "$g/rebase-merge" ]; then 236 r="|REBASE-m" 237 b="$(cat "$g/rebase-merge/head-name")" 238 else 239 if [ -d "$g/rebase-apply" ]; then 240 if [ -f "$g/rebase-apply/rebasing" ]; then 241 r="|REBASE" 242 elif [ -f "$g/rebase-apply/applying" ]; then 243 r="|AM" 244 else 245 r="|AM/REBASE" 246 fi 247 elif [ -f "$g/MERGE_HEAD" ]; then 248 r="|MERGING" 249 elif [ -f "$g/CHERRY_PICK_HEAD" ]; then 250 r="|CHERRY-PICKING" 251 elif [ -f "$g/BISECT_LOG" ]; then 252 r="|BISECTING" 253 fi 254 255 b="$(git symbolic-ref HEAD 2>/dev/null)" || { 256 257 b="$( 258 case "${GIT_PS1_DESCRIBE_STYLE-}" in 259 (contains) 260 git describe --contains HEAD ;; 261 (branch) 262 git describe --contains --all HEAD ;; 263 (describe) 264 git describe HEAD ;; 265 (* | default) 266 git describe --tags --exact-match HEAD ;; 267 esac 2>/dev/null)" || 268 269 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." || 270 b="unknown" 271 b="($b)" 272 } 273 fi 274 275 local w="" 276 local i="" 277 local s="" 278 local u="" 279 local c="" 280 local p="" 281 282 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then 283 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then 284 c="BARE:" 285 else 286 b="GIT_DIR!" 287 fi 288 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then 289 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then 290 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then 291 git diff --no-ext-diff --quiet --exit-code || w="*" 292 if git rev-parse --quiet --verify HEAD >/dev/null; then 293 git diff-index --cached --quiet HEAD -- || i="+" 294 else 295 i="#" 296 fi 297 fi 298 fi 299 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then 300 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$" 301 fi 302 303 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then 304 if [ -n "$(git ls-files --others --exclude-standard)" ]; then 305 u="%" 306 fi 307 fi 308 309 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then 310 __git_ps1_show_upstream 311 fi 312 fi 313 314 local f="$w$i$s$u" 315 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p" 316 fi 317} 318 319# __gitcomp_1 requires 2 arguments 320__gitcomp_1 () 321{ 322 local c IFS=' '$'\t'$'\n' 323 for c in $1; do 324 case "$c$2" in 325 --*=*) printf %s$'\n' "$c$2" ;; 326 *.) printf %s$'\n' "$c$2" ;; 327 *) printf %s$'\n' "$c$2 " ;; 328 esac 329 done 330} 331 332# The following function is based on code from: 333# 334# bash_completion - programmable completion functions for bash 3.2+ 335# 336# Copyright �� 2006-2008, Ian Macdonald <ian@caliban.org> 337# �� 2009-2010, Bash Completion Maintainers 338# <bash-completion-devel@lists.alioth.debian.org> 339# 340# This program is free software; you can redistribute it and/or modify 341# it under the terms of the GNU General Public License as published by 342# the Free Software Foundation; either version 2, or (at your option) 343# any later version. 344# 345# This program is distributed in the hope that it will be useful, 346# but WITHOUT ANY WARRANTY; without even the implied warranty of 347# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 348# GNU General Public License for more details. 349# 350# You should have received a copy of the GNU General Public License 351# along with this program; if not, write to the Free Software Foundation, 352# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 353# 354# The latest version of this software can be obtained here: 355# 356# http://bash-completion.alioth.debian.org/ 357# 358# RELEASE: 2.x 359 360# This function can be used to access a tokenized list of words 361# on the command line: 362# 363# __git_reassemble_comp_words_by_ref '=:' 364# if test "${words_[cword_-1]}" = -w 365# then 366# ... 367# fi 368# 369# The argument should be a collection of characters from the list of 370# word completion separators (COMP_WORDBREAKS) to treat as ordinary 371# characters. 372# 373# This is roughly equivalent to going back in time and setting 374# COMP_WORDBREAKS to exclude those characters. The intent is to 375# make option types like --date=<type> and <rev>:<path> easy to 376# recognize by treating each shell word as a single token. 377# 378# It is best not to set COMP_WORDBREAKS directly because the value is 379# shared with other completion scripts. By the time the completion 380# function gets called, COMP_WORDS has already been populated so local 381# changes to COMP_WORDBREAKS have no effect. 382# 383# Output: words_, cword_, cur_. 384 385__git_reassemble_comp_words_by_ref() 386{ 387 local exclude i j first 388 # Which word separators to exclude? 389 exclude="${1//[^$COMP_WORDBREAKS]}" 390 cword_=$COMP_CWORD 391 if [ -z "$exclude" ]; then 392 words_=("${COMP_WORDS[@]}") 393 return 394 fi 395 # List of word completion separators has shrunk; 396 # re-assemble words to complete. 397 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do 398 # Append each nonempty word consisting of just 399 # word separator characters to the current word. 400 first=t 401 while 402 [ $i -gt 0 ] && 403 [ -n "${COMP_WORDS[$i]}" ] && 404 # word consists of excluded word separators 405 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ] 406 do 407 # Attach to the previous token, 408 # unless the previous token is the command name. 409 if [ $j -ge 2 ] && [ -n "$first" ]; then 410 ((j--)) 411 fi 412 first= 413 words_[$j]=${words_[j]}${COMP_WORDS[i]} 414 if [ $i = $COMP_CWORD ]; then 415 cword_=$j 416 fi 417 if (($i < ${#COMP_WORDS[@]} - 1)); then 418 ((i++)) 419 else 420 # Done. 421 return 422 fi 423 done 424 words_[$j]=${words_[j]}${COMP_WORDS[i]} 425 if [ $i = $COMP_CWORD ]; then 426 cword_=$j 427 fi 428 done 429} 430 431if ! type _get_comp_words_by_ref >/dev/null 2>&1; then 432if [[ -z ${ZSH_VERSION:+set} ]]; then 433_get_comp_words_by_ref () 434{ 435 local exclude cur_ words_ cword_ 436 if [ "$1" = "-n" ]; then 437 exclude=$2 438 shift 2 439 fi 440 __git_reassemble_comp_words_by_ref "$exclude" 441 cur_=${words_[cword_]} 442 while [ $# -gt 0 ]; do 443 case "$1" in 444 cur) 445 cur=$cur_ 446 ;; 447 prev) 448 prev=${words_[$cword_-1]} 449 ;; 450 words) 451 words=("${words_[@]}") 452 ;; 453 cword) 454 cword=$cword_ 455 ;; 456 esac 457 shift 458 done 459} 460else 461_get_comp_words_by_ref () 462{ 463 while [ $# -gt 0 ]; do 464 case "$1" in 465 cur) 466 cur=${COMP_WORDS[COMP_CWORD]} 467 ;; 468 prev) 469 prev=${COMP_WORDS[COMP_CWORD-1]} 470 ;; 471 words) 472 words=("${COMP_WORDS[@]}") 473 ;; 474 cword) 475 cword=$COMP_CWORD 476 ;; 477 -n) 478 # assume COMP_WORDBREAKS is already set sanely 479 shift 480 ;; 481 esac 482 shift 483 done 484} 485fi 486fi 487 488# __gitcomp accepts 1, 2, 3, or 4 arguments 489# generates completion reply with compgen 490__gitcomp () 491{ 492 local cur 493 _get_comp_words_by_ref -n =: cur 494 if [ $# -gt 2 ]; then 495 cur="$3" 496 fi 497 case "$cur" in 498 --*=) 499 COMPREPLY=() 500 ;; 501 *) 502 local IFS=$'\n' 503 COMPREPLY=($(compgen -P "${2-}" \ 504 -W "$(__gitcomp_1 "${1-}" "${4-}")" \ 505 -- "$cur")) 506 ;; 507 esac 508} 509 510# __git_heads accepts 0 or 1 arguments (to pass to __gitdir) 511__git_heads () 512{ 513 local cmd i is_hash=y dir="$(__gitdir "${1-}")" 514 if [ -d "$dir" ]; then 515 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ 516 refs/heads 517 return 518 fi 519 for i in $(git ls-remote "${1-}" 2>/dev/null); do 520 case "$is_hash,$i" in 521 y,*) is_hash=n ;; 522 n,*^{}) is_hash=y ;; 523 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;; 524 n,*) is_hash=y; echo "$i" ;; 525 esac 526 done 527} 528 529# __git_tags accepts 0 or 1 arguments (to pass to __gitdir) 530__git_tags () 531{ 532 local cmd i is_hash=y dir="$(__gitdir "${1-}")" 533 if [ -d "$dir" ]; then 534 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ 535 refs/tags 536 return 537 fi 538 for i in $(git ls-remote "${1-}" 2>/dev/null); do 539 case "$is_hash,$i" in 540 y,*) is_hash=n ;; 541 n,*^{}) is_hash=y ;; 542 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;; 543 n,*) is_hash=y; echo "$i" ;; 544 esac 545 done 546} 547 548# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments 549# presence of 2nd argument means use the guess heuristic employed 550# by checkout for tracking branches 551__git_refs () 552{ 553 local i is_hash=y dir="$(__gitdir "${1-}")" track="${2-}" 554 local cur format refs 555 _get_comp_words_by_ref -n =: cur 556 if [ -d "$dir" ]; then 557 case "$cur" in 558 refs|refs/*) 559 format="refname" 560 refs="${cur%/*}" 561 track="" 562 ;; 563 *) 564 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do 565 if [ -e "$dir/$i" ]; then echo $i; fi 566 done 567 format="refname:short" 568 refs="refs/tags refs/heads refs/remotes" 569 ;; 570 esac 571 git --git-dir="$dir" for-each-ref --format="%($format)" \ 572 $refs 573 if [ -n "$track" ]; then 574 # employ the heuristic used by git checkout 575 # Try to find a remote branch that matches the completion word 576 # but only output if the branch name is unique 577 local ref entry 578 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \ 579 "refs/remotes/" | \ 580 while read entry; do 581 eval "$entry" 582 ref="${ref#*/}" 583 if [[ "$ref" == "$cur"* ]]; then 584 echo "$ref" 585 fi 586 done | uniq -u 587 fi 588 return 589 fi 590 for i in $(git ls-remote "$dir" 2>/dev/null); do 591 case "$is_hash,$i" in 592 y,*) is_hash=n ;; 593 n,*^{}) is_hash=y ;; 594 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;; 595 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;; 596 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;; 597 n,*) is_hash=y; echo "$i" ;; 598 esac 599 done 600} 601 602# __git_refs2 requires 1 argument (to pass to __git_refs) 603__git_refs2 () 604{ 605 local i 606 for i in $(__git_refs "$1"); do 607 echo "$i:$i" 608 done 609} 610 611# __git_refs_remotes requires 1 argument (to pass to ls-remote) 612__git_refs_remotes () 613{ 614 local cmd i is_hash=y 615 for i in $(git ls-remote "$1" 2>/dev/null); do 616 case "$is_hash,$i" in 617 n,refs/heads/*) 618 is_hash=y 619 echo "$i:refs/remotes/$1/${i#refs/heads/}" 620 ;; 621 y,*) is_hash=n ;; 622 n,*^{}) is_hash=y ;; 623 n,refs/tags/*) is_hash=y;; 624 n,*) is_hash=y; ;; 625 esac 626 done 627} 628 629__git_remotes () 630{ 631 local i ngoff IFS=$'\n' d="$(__gitdir)" 632 shopt -q nullglob || ngoff=1 633 shopt -s nullglob 634 for i in "$d/remotes"/*; do 635 echo ${i#$d/remotes/} 636 done 637 [ "$ngoff" ] && shopt -u nullglob 638 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do 639 i="${i#remote.}" 640 echo "${i/.url*/}" 641 done 642} 643 644__git_list_merge_strategies () 645{ 646 git merge -s help 2>&1 | 647 sed -n -e '/[Aa]vailable strategies are: /,/^$/{ 648 s/\.$// 649 s/.*:// 650 s/^[ ]*// 651 s/[ ]*$// 652 p 653 }' 654} 655 656__git_merge_strategies= 657# 'git merge -s help' (and thus detection of the merge strategy 658# list) fails, unfortunately, if run outside of any git working 659# tree. __git_merge_strategies is set to the empty string in 660# that case, and the detection will be repeated the next time it 661# is needed. 662__git_compute_merge_strategies () 663{ 664 : ${__git_merge_strategies:=$(__git_list_merge_strategies)} 665} 666 667__git_complete_revlist_file () 668{ 669 local pfx ls ref cur 670 _get_comp_words_by_ref -n =: cur 671 case "$cur" in 672 *..?*:*) 673 return 674 ;; 675 ?*:*) 676 ref="${cur%%:*}" 677 cur="${cur#*:}" 678 case "$cur" in 679 ?*/*) 680 pfx="${cur%/*}" 681 cur="${cur##*/}" 682 ls="$ref:$pfx" 683 pfx="$pfx/" 684 ;; 685 *) 686 ls="$ref" 687 ;; 688 esac 689 690 case "$COMP_WORDBREAKS" in 691 *:*) : great ;; 692 *) pfx="$ref:$pfx" ;; 693 esac 694 695 local IFS=$'\n' 696 COMPREPLY=($(compgen -P "$pfx" \ 697 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \ 698 | sed '/^100... blob /{ 699 s,^.* ,, 700 s,$, , 701 } 702 /^120000 blob /{ 703 s,^.* ,, 704 s,$, , 705 } 706 /^040000 tree /{ 707 s,^.* ,, 708 s,$,/, 709 } 710 s/^.* //')" \ 711 -- "$cur")) 712 ;; 713 *...*) 714 pfx="${cur%...*}..." 715 cur="${cur#*...}" 716 __gitcomp "$(__git_refs)" "$pfx" "$cur" 717 ;; 718 *..*) 719 pfx="${cur%..*}.." 720 cur="${cur#*..}" 721 __gitcomp "$(__git_refs)" "$pfx" "$cur" 722 ;; 723 *) 724 __gitcomp "$(__git_refs)" 725 ;; 726 esac 727} 728 729 730__git_complete_file () 731{ 732 __git_complete_revlist_file 733} 734 735__git_complete_revlist () 736{ 737 __git_complete_revlist_file 738} 739 740__git_complete_remote_or_refspec () 741{ 742 local cur words cword 743 _get_comp_words_by_ref -n =: cur words cword 744 local cmd="${words[1]}" 745 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0 746 while [ $c -lt $cword ]; do 747 i="${words[c]}" 748 case "$i" in 749 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;; 750 --all) 751 case "$cmd" in 752 push) no_complete_refspec=1 ;; 753 fetch) 754 COMPREPLY=() 755 return 756 ;; 757 *) ;; 758 esac 759 ;; 760 -*) ;; 761 *) remote="$i"; break ;; 762 esac 763 c=$((++c)) 764 done 765 if [ -z "$remote" ]; then 766 __gitcomp "$(__git_remotes)" 767 return 768 fi 769 if [ $no_complete_refspec = 1 ]; then 770 COMPREPLY=() 771 return 772 fi 773 [ "$remote" = "." ] && remote= 774 case "$cur" in 775 *:*) 776 case "$COMP_WORDBREAKS" in 777 *:*) : great ;; 778 *) pfx="${cur%%:*}:" ;; 779 esac 780 cur="${cur#*:}" 781 lhs=0 782 ;; 783 +*) 784 pfx="+" 785 cur="${cur#+}" 786 ;; 787 esac 788 case "$cmd" in 789 fetch) 790 if [ $lhs = 1 ]; then 791 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur" 792 else 793 __gitcomp "$(__git_refs)" "$pfx" "$cur" 794 fi 795 ;; 796 pull) 797 if [ $lhs = 1 ]; then 798 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur" 799 else 800 __gitcomp "$(__git_refs)" "$pfx" "$cur" 801 fi 802 ;; 803 push) 804 if [ $lhs = 1 ]; then 805 __gitcomp "$(__git_refs)" "$pfx" "$cur" 806 else 807 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur" 808 fi 809 ;; 810 esac 811} 812 813__git_complete_strategy () 814{ 815 local cur prev 816 _get_comp_words_by_ref -n =: cur prev 817 __git_compute_merge_strategies 818 case "$prev" in 819 -s|--strategy) 820 __gitcomp "$__git_merge_strategies" 821 return 0 822 esac 823 case "$cur" in 824 --strategy=*) 825 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}" 826 return 0 827 ;; 828 esac 829 return 1 830} 831 832__git_list_all_commands () 833{ 834 local i IFS=" "$'\n' 835 for i in $(git help -a|egrep '^ [a-zA-Z0-9]') 836 do 837 case $i in 838 *--*) : helper pattern;; 839 *) echo $i;; 840 esac 841 done 842} 843 844__git_all_commands= 845__git_compute_all_commands () 846{ 847 : ${__git_all_commands:=$(__git_list_all_commands)} 848} 849 850__git_list_porcelain_commands () 851{ 852 local i IFS=" "$'\n' 853 __git_compute_all_commands 854 for i in "help" $__git_all_commands 855 do 856 case $i in 857 *--*) : helper pattern;; 858 applymbox) : ask gittus;; 859 applypatch) : ask gittus;; 860 archimport) : import;; 861 cat-file) : plumbing;; 862 check-attr) : plumbing;; 863 check-ref-format) : plumbing;; 864 checkout-index) : plumbing;; 865 commit-tree) : plumbing;; 866 count-objects) : infrequent;; 867 cvsexportcommit) : export;; 868 cvsimport) : import;; 869 cvsserver) : daemon;; 870 daemon) : daemon;; 871 diff-files) : plumbing;; 872 diff-index) : plumbing;; 873 diff-tree) : plumbing;; 874 fast-import) : import;; 875 fast-export) : export;; 876 fsck-objects) : plumbing;; 877 fetch-pack) : plumbing;; 878 fmt-merge-msg) : plumbing;; 879 for-each-ref) : plumbing;; 880 hash-object) : plumbing;; 881 http-*) : transport;; 882 index-pack) : plumbing;; 883 init-db) : deprecated;; 884 local-fetch) : plumbing;; 885 lost-found) : infrequent;; 886 ls-files) : plumbing;; 887 ls-remote) : plumbing;; 888 ls-tree) : plumbing;; 889 mailinfo) : plumbing;; 890 mailsplit) : plumbing;; 891 merge-*) : plumbing;; 892 mktree) : plumbing;; 893 mktag) : plumbing;; 894 pack-objects) : plumbing;; 895 pack-redundant) : plumbing;; 896 pack-refs) : plumbing;; 897 parse-remote) : plumbing;; 898 patch-id) : plumbing;; 899 peek-remote) : plumbing;; 900 prune) : plumbing;; 901 prune-packed) : plumbing;; 902 quiltimport) : import;; 903 read-tree) : plumbing;; 904 receive-pack) : plumbing;; 905 remote-*) : transport;; 906 repo-config) : deprecated;; 907 rerere) : plumbing;; 908 rev-list) : plumbing;; 909 rev-parse) : plumbing;; 910 runstatus) : plumbing;; 911 sh-setup) : internal;; 912 shell) : daemon;; 913 show-ref) : plumbing;; 914 send-pack) : plumbing;; 915 show-index) : plumbing;; 916 ssh-*) : transport;; 917 stripspace) : plumbing;; 918 symbolic-ref) : plumbing;; 919 tar-tree) : deprecated;; 920 unpack-file) : plumbing;; 921 unpack-objects) : plumbing;; 922 update-index) : plumbing;; 923 update-ref) : plumbing;; 924 update-server-info) : daemon;; 925 upload-archive) : plumbing;; 926 upload-pack) : plumbing;; 927 write-tree) : plumbing;; 928 var) : infrequent;; 929 verify-pack) : infrequent;; 930 verify-tag) : plumbing;; 931 *) echo $i;; 932 esac 933 done 934} 935 936__git_porcelain_commands= 937__git_compute_porcelain_commands () 938{ 939 __git_compute_all_commands 940 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)} 941} 942 943__git_pretty_aliases () 944{ 945 local i IFS=$'\n' 946 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do 947 case "$i" in 948 pretty.*) 949 i="${i#pretty.}" 950 echo "${i/ */}" 951 ;; 952 esac 953 done 954} 955 956__git_aliases () 957{ 958 local i IFS=$'\n' 959 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do 960 case "$i" in 961 alias.*) 962 i="${i#alias.}" 963 echo "${i/ */}" 964 ;; 965 esac 966 done 967} 968 969# __git_aliased_command requires 1 argument 970__git_aliased_command () 971{ 972 local word cmdline=$(git --git-dir="$(__gitdir)" \ 973 config --get "alias.$1") 974 for word in $cmdline; do 975 case "$word" in 976 \!gitk|gitk) 977 echo "gitk" 978 return 979 ;; 980 \!*) : shell command alias ;; 981 -*) : option ;; 982 *=*) : setting env ;; 983 git) : git itself ;; 984 *) 985 echo "$word" 986 return 987 esac 988 done 989} 990 991# __git_find_on_cmdline requires 1 argument 992__git_find_on_cmdline () 993{ 994 local word subcommand c=1 words cword 995 _get_comp_words_by_ref -n =: words cword 996 while [ $c -lt $cword ]; do 997 word="${words[c]}" 998 for subcommand in $1; do 999 if [ "$subcommand" = "$word" ]; then 1000 echo "$subcommand" 1001 return 1002 fi 1003 done 1004 c=$((++c)) 1005 done 1006} 1007 1008__git_has_doubledash () 1009{ 1010 local c=1 words cword 1011 _get_comp_words_by_ref -n =: words cword 1012 while [ $c -lt $cword ]; do 1013 if [ "--" = "${words[c]}" ]; then 1014 return 0 1015 fi 1016 c=$((++c)) 1017 done 1018 return 1 1019} 1020 1021__git_whitespacelist="nowarn warn error error-all fix" 1022 1023_git_am () 1024{ 1025 local cur dir="$(__gitdir)" 1026 _get_comp_words_by_ref -n =: cur 1027 if [ -d "$dir"/rebase-apply ]; then 1028 __gitcomp "--skip --continue --resolved --abort" 1029 return 1030 fi 1031 case "$cur" in 1032 --whitespace=*) 1033 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" 1034 return 1035 ;; 1036 --*) 1037 __gitcomp " 1038 --3way --committer-date-is-author-date --ignore-date 1039 --ignore-whitespace --ignore-space-change 1040 --interactive --keep --no-utf8 --signoff --utf8 1041 --whitespace= --scissors 1042 " 1043 return 1044 esac 1045 COMPREPLY=() 1046} 1047 1048_git_apply () 1049{ 1050 local cur 1051 _get_comp_words_by_ref -n =: cur 1052 case "$cur" in 1053 --whitespace=*) 1054 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" 1055 return 1056 ;; 1057 --*) 1058 __gitcomp " 1059 --stat --numstat --summary --check --index 1060 --cached --index-info --reverse --reject --unidiff-zero 1061 --apply --no-add --exclude= 1062 --ignore-whitespace --ignore-space-change 1063 --whitespace= --inaccurate-eof --verbose 1064 " 1065 return 1066 esac 1067 COMPREPLY=() 1068} 1069 1070_git_add () 1071{ 1072 __git_has_doubledash && return 1073 1074 local cur 1075 _get_comp_words_by_ref -n =: cur 1076 case "$cur" in 1077 --*) 1078 __gitcomp " 1079 --interactive --refresh --patch --update --dry-run 1080 --ignore-errors --intent-to-add 1081 " 1082 return 1083 esac 1084 COMPREPLY=() 1085} 1086 1087_git_archive () 1088{ 1089 local cur 1090 _get_comp_words_by_ref -n =: cur 1091 case "$cur" in 1092 --format=*) 1093 __gitcomp "$(git archive --list)" "" "${cur##--format=}" 1094 return 1095 ;; 1096 --remote=*) 1097 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}" 1098 return 1099 ;; 1100 --*) 1101 __gitcomp " 1102 --format= --list --verbose 1103 --prefix= --remote= --exec= 1104 " 1105 return 1106 ;; 1107 esac 1108 __git_complete_file 1109} 1110 1111_git_bisect () 1112{ 1113 __git_has_doubledash && return 1114 1115 local subcommands="start bad good skip reset visualize replay log run" 1116 local subcommand="$(__git_find_on_cmdline "$subcommands")" 1117 if [ -z "$subcommand" ]; then 1118 if [ -f "$(__gitdir)"/BISECT_START ]; then 1119 __gitcomp "$subcommands" 1120 else 1121 __gitcomp "replay start" 1122 fi 1123 return 1124 fi 1125 1126 case "$subcommand" in 1127 bad|good|reset|skip|start) 1128 __gitcomp "$(__git_refs)" 1129 ;; 1130 *) 1131 COMPREPLY=() 1132 ;; 1133 esac 1134} 1135 1136_git_branch () 1137{ 1138 local i c=1 only_local_ref="n" has_r="n" cur words cword 1139 1140 _get_comp_words_by_ref -n =: cur words cword 1141 while [ $c -lt $cword ]; do 1142 i="${words[c]}" 1143 case "$i" in 1144 -d|-m) only_local_ref="y" ;; 1145 -r) has_r="y" ;; 1146 esac 1147 c=$((++c)) 1148 done 1149 1150 case "$cur" in 1151 --*) 1152 __gitcomp " 1153 --color --no-color --verbose --abbrev= --no-abbrev 1154 --track --no-track --contains --merged --no-merged 1155 --set-upstream 1156 " 1157 ;; 1158 *) 1159 if [ $only_local_ref = "y" -a $has_r = "n" ]; then 1160 __gitcomp "$(__git_heads)" 1161 else 1162 __gitcomp "$(__git_refs)" 1163 fi 1164 ;; 1165 esac 1166} 1167 1168_git_bundle () 1169{ 1170 local words cword 1171 _get_comp_words_by_ref -n =: words cword 1172 local cmd="${words[2]}" 1173 case "$cword" in 1174 2) 1175 __gitcomp "create list-heads verify unbundle" 1176 ;; 1177 3) 1178 # looking for a file 1179 ;; 1180 *) 1181 case "$cmd" in 1182 create) 1183 __git_complete_revlist 1184 ;; 1185 esac 1186 ;; 1187 esac 1188} 1189 1190_git_checkout () 1191{ 1192 __git_has_doubledash && return 1193 1194 local cur 1195 _get_comp_words_by_ref -n =: cur 1196 case "$cur" in 1197 --conflict=*) 1198 __gitcomp "diff3 merge" "" "${cur##--conflict=}" 1199 ;; 1200 --*) 1201 __gitcomp " 1202 --quiet --ours --theirs --track --no-track --merge 1203 --conflict= --orphan --patch 1204 " 1205 ;; 1206 *) 1207 # check if --track, --no-track, or --no-guess was specified 1208 # if so, disable DWIM mode 1209 local flags="--track --no-track --no-guess" track=1 1210 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then 1211 track='' 1212 fi 1213 __gitcomp "$(__git_refs '' $track)" 1214 ;; 1215 esac 1216} 1217 1218_git_cherry () 1219{ 1220 __gitcomp "$(__git_refs)" 1221} 1222 1223_git_cherry_pick () 1224{ 1225 local cur 1226 _get_comp_words_by_ref -n =: cur 1227 case "$cur" in 1228 --*) 1229 __gitcomp "--edit --no-commit" 1230 ;; 1231 *) 1232 __gitcomp "$(__git_refs)" 1233 ;; 1234 esac 1235} 1236 1237_git_clean () 1238{ 1239 __git_has_doubledash && return 1240 1241 local cur 1242 _get_comp_words_by_ref -n =: cur 1243 case "$cur" in 1244 --*) 1245 __gitcomp "--dry-run --quiet" 1246 return 1247 ;; 1248 esac 1249 COMPREPLY=() 1250} 1251 1252_git_clone () 1253{ 1254 local cur 1255 _get_comp_words_by_ref -n =: cur 1256 case "$cur" in 1257 --*) 1258 __gitcomp " 1259 --local 1260 --no-hardlinks 1261 --shared 1262 --reference 1263 --quiet 1264 --no-checkout 1265 --bare 1266 --mirror 1267 --origin 1268 --upload-pack 1269 --template= 1270 --depth 1271 " 1272 return 1273 ;; 1274 esac 1275 COMPREPLY=() 1276} 1277 1278_git_commit () 1279{ 1280 __git_has_doubledash && return 1281 1282 local cur 1283 _get_comp_words_by_ref -n =: cur 1284 case "$cur" in 1285 --cleanup=*) 1286 __gitcomp "default strip verbatim whitespace 1287 " "" "${cur##--cleanup=}" 1288 return 1289 ;; 1290 --reuse-message=*) 1291 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}" 1292 return 1293 ;; 1294 --reedit-message=*) 1295 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}" 1296 return 1297 ;; 1298 --untracked-files=*) 1299 __gitcomp "all no normal" "" "${cur##--untracked-files=}" 1300 return 1301 ;; 1302 --*) 1303 __gitcomp " 1304 --all --author= --signoff --verify --no-verify 1305 --edit --amend --include --only --interactive 1306 --dry-run --reuse-message= --reedit-message= 1307 --reset-author --file= --message= --template= 1308 --cleanup= --untracked-files --untracked-files= 1309 --verbose --quiet 1310 " 1311 return 1312 esac 1313 COMPREPLY=() 1314} 1315 1316_git_describe () 1317{ 1318 local cur 1319 _get_comp_words_by_ref -n =: cur 1320 case "$cur" in 1321 --*) 1322 __gitcomp " 1323 --all --tags --contains --abbrev= --candidates= 1324 --exact-match --debug --long --match --always 1325 " 1326 return 1327 esac 1328 __gitcomp "$(__git_refs)" 1329} 1330 1331__git_diff_common_options="--stat --numstat --shortstat --summary 1332 --patch-with-stat --name-only --name-status --color 1333 --no-color --color-words --no-renames --check 1334 --full-index --binary --abbrev --diff-filter= 1335 --find-copies-harder 1336 --text --ignore-space-at-eol --ignore-space-change 1337 --ignore-all-space --exit-code --quiet --ext-diff 1338 --no-ext-diff 1339 --no-prefix --src-prefix= --dst-prefix= 1340 --inter-hunk-context= 1341 --patience 1342 --raw 1343 --dirstat --dirstat= --dirstat-by-file 1344 --dirstat-by-file= --cumulative 1345" 1346 1347_git_diff () 1348{ 1349 __git_has_doubledash && return 1350 1351 local cur 1352 _get_comp_words_by_ref -n =: cur 1353 case "$cur" in 1354 --*) 1355 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex 1356 --base --ours --theirs --no-index 1357 $__git_diff_common_options 1358 " 1359 return 1360 ;; 1361 esac 1362 __git_complete_revlist_file 1363} 1364 1365__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff 1366 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 1367" 1368 1369_git_difftool () 1370{ 1371 __git_has_doubledash && return 1372 1373 local cur 1374 _get_comp_words_by_ref -n =: cur 1375 case "$cur" in 1376 --tool=*) 1377 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}" 1378 return 1379 ;; 1380 --*) 1381 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex 1382 --base --ours --theirs 1383 --no-renames --diff-filter= --find-copies-harder 1384 --relative --ignore-submodules 1385 --tool=" 1386 return 1387 ;; 1388 esac 1389 __git_complete_file 1390} 1391 1392__git_fetch_options=" 1393 --quiet --verbose --append --upload-pack --force --keep --depth= 1394 --tags --no-tags --all --prune --dry-run 1395" 1396 1397_git_fetch () 1398{ 1399 local cur 1400 _get_comp_words_by_ref -n =: cur 1401 case "$cur" in 1402 --*) 1403 __gitcomp "$__git_fetch_options" 1404 return 1405 ;; 1406 esac 1407 __git_complete_remote_or_refspec 1408} 1409 1410_git_format_patch () 1411{ 1412 local cur 1413 _get_comp_words_by_ref -n =: cur 1414 case "$cur" in 1415 --thread=*) 1416 __gitcomp " 1417 deep shallow 1418 " "" "${cur##--thread=}" 1419 return 1420 ;; 1421 --*) 1422 __gitcomp " 1423 --stdout --attach --no-attach --thread --thread= 1424 --output-directory 1425 --numbered --start-number 1426 --numbered-files 1427 --keep-subject 1428 --signoff --signature --no-signature 1429 --in-reply-to= --cc= 1430 --full-index --binary 1431 --not --all 1432 --cover-letter 1433 --no-prefix --src-prefix= --dst-prefix= 1434 --inline --suffix= --ignore-if-in-upstream 1435 --subject-prefix= 1436 " 1437 return 1438 ;; 1439 esac 1440 __git_complete_revlist 1441} 1442 1443_git_fsck () 1444{ 1445 local cur 1446 _get_comp_words_by_ref -n =: cur 1447 case "$cur" in 1448 --*) 1449 __gitcomp " 1450 --tags --root --unreachable --cache --no-reflogs --full 1451 --strict --verbose --lost-found 1452 " 1453 return 1454 ;; 1455 esac 1456 COMPREPLY=() 1457} 1458 1459_git_gc () 1460{ 1461 local cur 1462 _get_comp_words_by_ref -n =: cur 1463 case "$cur" in 1464 --*) 1465 __gitcomp "--prune --aggressive" 1466 return 1467 ;; 1468 esac 1469 COMPREPLY=() 1470} 1471 1472_git_gitk () 1473{ 1474 _gitk 1475} 1476 1477_git_grep () 1478{ 1479 __git_has_doubledash && return 1480 1481 local cur 1482 _get_comp_words_by_ref -n =: cur 1483 case "$cur" in 1484 --*) 1485 __gitcomp " 1486 --cached 1487 --text --ignore-case --word-regexp --invert-match 1488 --full-name 1489 --extended-regexp --basic-regexp --fixed-strings 1490 --files-with-matches --name-only 1491 --files-without-match 1492 --max-depth 1493 --count 1494 --and --or --not --all-match 1495 " 1496 return 1497 ;; 1498 esac 1499 1500 __gitcomp "$(__git_refs)" 1501} 1502 1503_git_help () 1504{ 1505 local cur 1506 _get_comp_words_by_ref -n =: cur 1507 case "$cur" in 1508 --*) 1509 __gitcomp "--all --info --man --web" 1510 return 1511 ;; 1512 esac 1513 __git_compute_all_commands 1514 __gitcomp "$__git_all_commands $(__git_aliases) 1515 attributes cli core-tutorial cvs-migration 1516 diffcore gitk glossary hooks ignore modules 1517 repository-layout tutorial tutorial-2 1518 workflows 1519 " 1520} 1521 1522_git_init () 1523{ 1524 local cur 1525 _get_comp_words_by_ref -n =: cur 1526 case "$cur" in 1527 --shared=*) 1528 __gitcomp " 1529 false true umask group all world everybody 1530 " "" "${cur##--shared=}" 1531 return 1532 ;; 1533 --*) 1534 __gitcomp "--quiet --bare --template= --shared --shared=" 1535 return 1536 ;; 1537 esac 1538 COMPREPLY=() 1539} 1540 1541_git_ls_files () 1542{ 1543 __git_has_doubledash && return 1544 1545 local cur 1546 _get_comp_words_by_ref -n =: cur 1547 case "$cur" in 1548 --*) 1549 __gitcomp "--cached --deleted --modified --others --ignored 1550 --stage --directory --no-empty-directory --unmerged 1551 --killed --exclude= --exclude-from= 1552 --exclude-per-directory= --exclude-standard 1553 --error-unmatch --with-tree= --full-name 1554 --abbrev --ignored --exclude-per-directory 1555 " 1556 return 1557 ;; 1558 esac 1559 COMPREPLY=() 1560} 1561 1562_git_ls_remote () 1563{ 1564 __gitcomp "$(__git_remotes)" 1565} 1566 1567_git_ls_tree () 1568{ 1569 __git_complete_file 1570} 1571 1572# Options that go well for log, shortlog and gitk 1573__git_log_common_options=" 1574 --not --all 1575 --branches --tags --remotes 1576 --first-parent --merges --no-merges 1577 --max-count= 1578 --max-age= --since= --after= 1579 --min-age= --until= --before= 1580 --min-parents= --max-parents= 1581 --no-min-parents --no-max-parents 1582" 1583# Options that go well for log and gitk (not shortlog) 1584__git_log_gitk_options=" 1585 --dense --sparse --full-history 1586 --simplify-merges --simplify-by-decoration 1587 --left-right 1588" 1589# Options that go well for log and shortlog (not gitk) 1590__git_log_shortlog_options=" 1591 --author= --committer= --grep= 1592 --all-match 1593" 1594 1595__git_log_pretty_formats="oneline short medium full fuller email raw format:" 1596__git_log_date_formats="relative iso8601 rfc2822 short local default raw" 1597 1598_git_log () 1599{ 1600 __git_has_doubledash && return 1601 1602 local g="$(git rev-parse --git-dir 2>/dev/null)" 1603 local merge="" 1604 if [ -f "$g/MERGE_HEAD" ]; then 1605 merge="--merge" 1606 fi 1607 local cur 1608 _get_comp_words_by_ref -n =: cur 1609 case "$cur" in 1610 --pretty=*) 1611 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) 1612 " "" "${cur##--pretty=}" 1613 return 1614 ;; 1615 --format=*) 1616 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) 1617 " "" "${cur##--format=}" 1618 return 1619 ;; 1620 --date=*) 1621 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}" 1622 return 1623 ;; 1624 --decorate=*) 1625 __gitcomp "long short" "" "${cur##--decorate=}" 1626 return 1627 ;; 1628 --*) 1629 __gitcomp " 1630 $__git_log_common_options 1631 $__git_log_shortlog_options 1632 $__git_log_gitk_options 1633 --root --topo-order --date-order --reverse 1634 --follow --full-diff 1635 --abbrev-commit --abbrev= 1636 --relative-date --date= 1637 --pretty= --format= --oneline 1638 --cherry-pick 1639 --graph 1640 --decorate --decorate= 1641 --walk-reflogs 1642 --parents --children 1643 $merge 1644 $__git_diff_common_options 1645 --pickaxe-all --pickaxe-regex 1646 " 1647 return 1648 ;; 1649 esac 1650 __git_complete_revlist 1651} 1652 1653__git_merge_options=" 1654 --no-commit --no-stat --log --no-log --squash --strategy 1655 --commit --stat --no-squash --ff --no-ff --ff-only 1656" 1657 1658_git_merge () 1659{ 1660 __git_complete_strategy && return 1661 1662 local cur 1663 _get_comp_words_by_ref -n =: cur 1664 case "$cur" in 1665 --*) 1666 __gitcomp "$__git_merge_options" 1667 return 1668 esac 1669 __gitcomp "$(__git_refs)" 1670} 1671 1672_git_mergetool () 1673{ 1674 local cur 1675 _get_comp_words_by_ref -n =: cur 1676 case "$cur" in 1677 --tool=*) 1678 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}" 1679 return 1680 ;; 1681 --*) 1682 __gitcomp "--tool=" 1683 return 1684 ;; 1685 esac 1686 COMPREPLY=() 1687} 1688 1689_git_merge_base () 1690{ 1691 __gitcomp "$(__git_refs)" 1692} 1693 1694_git_mv () 1695{ 1696 local cur 1697 _get_comp_words_by_ref -n =: cur 1698 case "$cur" in 1699 --*) 1700 __gitcomp "--dry-run" 1701 return 1702 ;; 1703 esac 1704 COMPREPLY=() 1705} 1706 1707_git_name_rev () 1708{ 1709 __gitcomp "--tags --all --stdin" 1710} 1711 1712_git_notes () 1713{ 1714 local subcommands='add append copy edit list prune remove show' 1715 local subcommand="$(__git_find_on_cmdline "$subcommands")" 1716 local cur words cword 1717 _get_comp_words_by_ref -n =: cur words cword 1718 1719 case "$subcommand,$cur" in 1720 ,--*) 1721 __gitcomp '--ref' 1722 ;; 1723 ,*) 1724 case "${words[cword-1]}" in 1725 --ref) 1726 __gitcomp "$(__git_refs)" 1727 ;; 1728 *) 1729 __gitcomp "$subcommands --ref" 1730 ;; 1731 esac 1732 ;; 1733 add,--reuse-message=*|append,--reuse-message=*) 1734 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}" 1735 ;; 1736 add,--reedit-message=*|append,--reedit-message=*) 1737 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}" 1738 ;; 1739 add,--*|append,--*) 1740 __gitcomp '--file= --message= --reedit-message= 1741 --reuse-message=' 1742 ;; 1743 copy,--*) 1744 __gitcomp '--stdin' 1745 ;; 1746 prune,--*) 1747 __gitcomp '--dry-run --verbose' 1748 ;; 1749 prune,*) 1750 ;; 1751 *) 1752 case "${words[cword-1]}" in 1753 -m|-F) 1754 ;; 1755 *) 1756 __gitcomp "$(__git_refs)" 1757 ;; 1758 esac 1759 ;; 1760 esac 1761} 1762 1763_git_pull () 1764{ 1765 __git_complete_strategy && return 1766 1767 local cur 1768 _get_comp_words_by_ref -n =: cur 1769 case "$cur" in 1770 --*) 1771 __gitcomp " 1772 --rebase --no-rebase 1773 $__git_merge_options 1774 $__git_fetch_options 1775 " 1776 return 1777 ;; 1778 esac 1779 __git_complete_remote_or_refspec 1780} 1781 1782_git_push () 1783{ 1784 local cur prev 1785 _get_comp_words_by_ref -n =: cur prev 1786 case "$prev" in 1787 --repo) 1788 __gitcomp "$(__git_remotes)" 1789 return 1790 esac 1791 case "$cur" in 1792 --repo=*) 1793 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}" 1794 return 1795 ;; 1796 --*) 1797 __gitcomp " 1798 --all --mirror --tags --dry-run --force --verbose 1799 --receive-pack= --repo= 1800 " 1801 return 1802 ;; 1803 esac 1804 __git_complete_remote_or_refspec 1805} 1806 1807_git_rebase () 1808{ 1809 local dir="$(__gitdir)" 1810 local cur 1811 _get_comp_words_by_ref -n =: cur 1812 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then 1813 __gitcomp "--continue --skip --abort" 1814 return 1815 fi 1816 __git_complete_strategy && return 1817 case "$cur" in 1818 --whitespace=*) 1819 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" 1820 return 1821 ;; 1822 --*) 1823 __gitcomp " 1824 --onto --merge --strategy --interactive 1825 --preserve-merges --stat --no-stat 1826 --committer-date-is-author-date --ignore-date 1827 --ignore-whitespace --whitespace= 1828 --autosquash 1829 " 1830 1831 return 1832 esac 1833 __gitcomp "$(__git_refs)" 1834} 1835 1836_git_reflog () 1837{ 1838 local subcommands="show delete expire" 1839 local subcommand="$(__git_find_on_cmdline "$subcommands")" 1840 1841 if [ -z "$subcommand" ]; then 1842 __gitcomp "$subcommands" 1843 else 1844 __gitcomp "$(__git_refs)" 1845 fi 1846} 1847 1848__git_send_email_confirm_options="always never auto cc compose" 1849__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all" 1850 1851_git_send_email () 1852{ 1853 local cur 1854 _get_comp_words_by_ref -n =: cur 1855 case "$cur" in 1856 --confirm=*) 1857 __gitcomp " 1858 $__git_send_email_confirm_options 1859 " "" "${cur##--confirm=}" 1860 return 1861 ;; 1862 --suppress-cc=*) 1863 __gitcomp " 1864 $__git_send_email_suppresscc_options 1865 " "" "${cur##--suppress-cc=}" 1866 1867 return 1868 ;; 1869 --smtp-encryption=*) 1870 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}" 1871 return 1872 ;; 1873 --*) 1874 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to 1875 --compose --confirm= --dry-run --envelope-sender 1876 --from --identity 1877 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc 1878 --no-suppress-from --no-thread --quiet 1879 --signed-off-by-cc --smtp-pass --smtp-server 1880 --smtp-server-port --smtp-encryption= --smtp-user 1881 --subject --suppress-cc= --suppress-from --thread --to 1882 --validate --no-validate" 1883 return 1884 ;; 1885 esac 1886 COMPREPLY=() 1887} 1888 1889_git_stage () 1890{ 1891 _git_add 1892} 1893 1894__git_config_get_set_variables () 1895{ 1896 local words cword 1897 _get_comp_words_by_ref -n =: words cword 1898 local prevword word config_file= c=$cword 1899 while [ $c -gt 1 ]; do 1900 word="${words[c]}" 1901 case "$word" in 1902 --global|--system|--file=*) 1903 config_file="$word" 1904 break 1905 ;; 1906 -f|--file) 1907 config_file="$word $prevword" 1908 break 1909 ;; 1910 esac 1911 prevword=$word 1912 c=$((--c)) 1913 done 1914 1915 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null | 1916 while read line 1917 do 1918 case "$line" in 1919 *.*=*) 1920 echo "${line/=*/}" 1921 ;; 1922 esac 1923 done 1924} 1925 1926_git_config () 1927{ 1928 local cur prev 1929 _get_comp_words_by_ref -n =: cur prev 1930 case "$prev" in 1931 branch.*.remote) 1932 __gitcomp "$(__git_remotes)" 1933 return 1934 ;; 1935 branch.*.merge) 1936 __gitcomp "$(__git_refs)" 1937 return 1938 ;; 1939 remote.*.fetch) 1940 local remote="${prev#remote.}" 1941 remote="${remote%.fetch}" 1942 __gitcomp "$(__git_refs_remotes "$remote")" 1943 return 1944 ;; 1945 remote.*.push) 1946 local remote="${prev#remote.}" 1947 remote="${remote%.push}" 1948 __gitcomp "$(git --git-dir="$(__gitdir)" \ 1949 for-each-ref --format='%(refname):%(refname)' \ 1950 refs/heads)" 1951 return 1952 ;; 1953 pull.twohead|pull.octopus) 1954 __git_compute_merge_strategies 1955 __gitcomp "$__git_merge_strategies" 1956 return 1957 ;; 1958 color.branch|color.diff|color.interactive|\ 1959 color.showbranch|color.status|color.ui) 1960 __gitcomp "always never auto" 1961 return 1962 ;; 1963 color.pager) 1964 __gitcomp "false true" 1965 return 1966 ;; 1967 color.*.*) 1968 __gitcomp " 1969 normal black red green yellow blue magenta cyan white 1970 bold dim ul blink reverse 1971 " 1972 return 1973 ;; 1974 help.format) 1975 __gitcomp "man info web html" 1976 return 1977 ;; 1978 log.date) 1979 __gitcomp "$__git_log_date_formats" 1980 return 1981 ;; 1982 sendemail.aliasesfiletype) 1983 __gitcomp "mutt mailrc pine elm gnus" 1984 return 1985 ;; 1986 sendemail.confirm) 1987 __gitcomp "$__git_send_email_confirm_options" 1988 return 1989 ;; 1990 sendemail.suppresscc) 1991 __gitcomp "$__git_send_email_suppresscc_options" 1992 return 1993 ;; 1994 --get|--get-all|--unset|--unset-all) 1995 __gitcomp "$(__git_config_get_set_variables)" 1996 return 1997 ;; 1998 *.*) 1999 COMPREPLY=() 2000 return 2001 ;; 2002 esac 2003 case "$cur" in 2004 --*) 2005 __gitcomp " 2006 --global --system --file= 2007 --list --replace-all 2008 --get --get-all --get-regexp 2009 --add --unset --unset-all 2010 --remove-section --rename-section 2011 " 2012 return 2013 ;; 2014 branch.*.*) 2015 local pfx="${cur%.*}." 2016 cur="${cur##*.}" 2017 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur" 2018 return 2019 ;; 2020 branch.*) 2021 local pfx="${cur%.*}." 2022 cur="${cur#*.}" 2023 __gitcomp "$(__git_heads)" "$pfx" "$cur" "." 2024 return 2025 ;; 2026 guitool.*.*) 2027 local pfx="${cur%.*}." 2028 cur="${cur##*.}" 2029 __gitcomp " 2030 argprompt cmd confirm needsfile noconsole norescan 2031 prompt revprompt revunmerged title 2032 " "$pfx" "$cur" 2033 return 2034 ;; 2035 difftool.*.*) 2036 local pfx="${cur%.*}." 2037 cur="${cur##*.}" 2038 __gitcomp "cmd path" "$pfx" "$cur" 2039 return 2040 ;; 2041 man.*.*) 2042 local pfx="${cur%.*}." 2043 cur="${cur##*.}" 2044 __gitcomp "cmd path" "$pfx" "$cur" 2045 return 2046 ;; 2047 mergetool.*.*) 2048 local pfx="${cur%.*}." 2049 cur="${cur##*.}" 2050 __gitcomp "cmd path trustExitCode" "$pfx" "$cur" 2051 return 2052 ;; 2053 pager.*) 2054 local pfx="${cur%.*}." 2055 cur="${cur#*.}" 2056 __git_compute_all_commands 2057 __gitcomp "$__git_all_commands" "$pfx" "$cur" 2058 return 2059 ;; 2060 remote.*.*) 2061 local pfx="${cur%.*}." 2062 cur="${cur##*.}" 2063 __gitcomp " 2064 url proxy fetch push mirror skipDefaultUpdate 2065 receivepack uploadpack tagopt pushurl 2066 " "$pfx" "$cur" 2067 return 2068 ;; 2069 remote.*) 2070 local pfx="${cur%.*}." 2071 cur="${cur#*.}" 2072 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "." 2073 return 2074 ;; 2075 url.*.*) 2076 local pfx="${cur%.*}." 2077 cur="${cur##*.}" 2078 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur" 2079 return 2080 ;; 2081 esac 2082 __gitcomp " 2083 add.ignoreErrors 2084 advice.commitBeforeMerge 2085 advice.detachedHead 2086 advice.implicitIdentity 2087 advice.pushNonFastForward 2088 advice.resolveConflict 2089 advice.statusHints 2090 alias. 2091 am.keepcr 2092 apply.ignorewhitespace 2093 apply.whitespace 2094 branch.autosetupmerge 2095 branch.autosetuprebase 2096 browser. 2097 clean.requireForce 2098 color.branch 2099 color.branch.current 2100 color.branch.local 2101 color.branch.plain 2102 color.branch.remote 2103 color.decorate.HEAD 2104 color.decorate.branch 2105 color.decorate.remoteBranch 2106 color.decorate.stash 2107 color.decorate.tag 2108 color.diff 2109 color.diff.commit 2110 color.diff.frag 2111 color.diff.func 2112 color.diff.meta 2113 color.diff.new 2114 color.diff.old 2115 color.diff.plain 2116 color.diff.whitespace 2117 color.grep 2118 color.grep.context 2119 color.grep.filename 2120 color.grep.function 2121 color.grep.linenumber 2122 color.grep.match 2123 color.grep.selected 2124 color.grep.separator 2125 color.interactive 2126 color.interactive.error 2127 color.interactive.header 2128 color.interactive.help 2129 color.interactive.prompt 2130 color.pager 2131 color.showbranch 2132 color.status 2133 color.status.added 2134 color.status.changed 2135 color.status.header 2136 color.status.nobranch 2137 color.status.untracked 2138 color.status.updated 2139 color.ui 2140 commit.status 2141 commit.template 2142 core.abbrevguard 2143 core.askpass 2144 core.attributesfile 2145 core.autocrlf 2146 core.bare 2147 core.bigFileThreshold 2148 core.compression 2149 core.createObject 2150 core.deltaBaseCacheLimit 2151 core.editor 2152 core.eol 2153 core.excludesfile 2154 core.fileMode 2155 core.fsyncobjectfiles 2156 core.gitProxy 2157 core.ignoreCygwinFSTricks 2158 core.ignoreStat 2159 core.ignorecase 2160 core.logAllRefUpdates 2161 core.loosecompression 2162 core.notesRef 2163 core.packedGitLimit 2164 core.packedGitWindowSize 2165 core.pager 2166 core.preferSymlinkRefs 2167 core.preloadindex 2168 core.quotepath 2169 core.repositoryFormatVersion 2170 core.safecrlf 2171 core.sharedRepository 2172 core.sparseCheckout 2173 core.symlinks 2174 core.trustctime 2175 core.warnAmbiguousRefs 2176 core.whitespace 2177 core.worktree 2178 diff.autorefreshindex 2179 diff.external 2180 diff.ignoreSubmodules 2181 diff.mnemonicprefix 2182 diff.noprefix 2183 diff.renameLimit 2184 diff.renames 2185 diff.suppressBlankEmpty 2186 diff.tool 2187 diff.wordRegex 2188 difftool. 2189 difftool.prompt 2190 fetch.recurseSubmodules 2191 fetch.unpackLimit 2192 format.attach 2193 format.cc 2194 format.headers 2195 format.numbered 2196 format.pretty 2197 format.signature 2198 format.signoff 2199 format.subjectprefix 2200 format.suffix 2201 format.thread 2202 format.to 2203 gc. 2204 gc.aggressiveWindow 2205 gc.auto 2206 gc.autopacklimit 2207 gc.packrefs 2208 gc.pruneexpire 2209 gc.reflogexpire 2210 gc.reflogexpireunreachable 2211 gc.rerereresolved 2212 gc.rerereunresolved 2213 gitcvs.allbinary 2214 gitcvs.commitmsgannotation 2215 gitcvs.dbTableNamePrefix 2216 gitcvs.dbdriver 2217 gitcvs.dbname 2218 gitcvs.dbpass 2219 gitcvs.dbuser 2220 gitcvs.enabled 2221 gitcvs.logfile 2222 gitcvs.usecrlfattr 2223 guitool. 2224 gui.blamehistoryctx 2225 gui.commitmsgwidth 2226 gui.copyblamethreshold 2227 gui.diffcontext 2228 gui.encoding 2229 gui.fastcopyblame 2230 gui.matchtrackingbranch 2231 gui.newbranchtemplate 2232 gui.pruneduringfetch 2233 gui.spellingdictionary 2234 gui.trustmtime 2235 help.autocorrect 2236 help.browser 2237 help.format 2238 http.lowSpeedLimit 2239 http.lowSpeedTime 2240 http.maxRequests 2241 http.minSessions 2242 http.noEPSV 2243 http.postBuffer 2244 http.proxy 2245 http.sslCAInfo 2246 http.sslCAPath 2247 http.sslCert 2248 http.sslCertPasswordProtected 2249 http.sslKey 2250 http.sslVerify 2251 http.useragent 2252 i18n.commitEncoding 2253 i18n.logOutputEncoding 2254 imap.authMethod 2255 imap.folder 2256 imap.host 2257 imap.pass 2258 imap.port 2259 imap.preformattedHTML 2260 imap.sslverify 2261 imap.tunnel 2262 imap.user 2263 init.templatedir 2264 instaweb.browser 2265 instaweb.httpd 2266 instaweb.local 2267 instaweb.modulepath 2268 instaweb.port 2269 interactive.singlekey 2270 log.date 2271 log.decorate 2272 log.showroot 2273 mailmap.file 2274 man. 2275 man.viewer 2276 merge. 2277 merge.conflictstyle 2278 merge.log 2279 merge.renameLimit 2280 merge.renormalize 2281 merge.stat 2282 merge.tool 2283 merge.verbosity 2284 mergetool. 2285 mergetool.keepBackup 2286 mergetool.keepTemporaries 2287 mergetool.prompt 2288 notes.displayRef 2289 notes.rewrite. 2290 notes.rewrite.amend 2291 notes.rewrite.rebase 2292 notes.rewriteMode 2293 notes.rewriteRef 2294 pack.compression 2295 pack.deltaCacheLimit 2296 pack.deltaCacheSize 2297 pack.depth 2298 pack.indexVersion 2299 pack.packSizeLimit 2300 pack.threads 2301 pack.window 2302 pack.windowMemory 2303 pager. 2304 pretty. 2305 pull.octopus 2306 pull.twohead 2307 push.default 2308 rebase.autosquash 2309 rebase.stat 2310 receive.autogc 2311 receive.denyCurrentBranch 2312 receive.denyDeleteCurrent 2313 receive.denyDeletes 2314 receive.denyNonFastForwards 2315 receive.fsckObjects 2316 receive.unpackLimit 2317 receive.updateserverinfo 2318 remotes. 2319 repack.usedeltabaseoffset 2320 rerere.autoupdate 2321 rerere.enabled 2322 sendemail. 2323 sendemail.aliasesfile 2324 sendemail.aliasfiletype 2325 sendemail.bcc 2326 sendemail.cc 2327 sendemail.cccmd 2328 sendemail.chainreplyto 2329 sendemail.confirm 2330 sendemail.envelopesender 2331 sendemail.from 2332 sendemail.identity 2333 sendemail.multiedit 2334 sendemail.signedoffbycc 2335 sendemail.smtpdomain 2336 sendemail.smtpencryption 2337 sendemail.smtppass 2338 sendemail.smtpserver 2339 sendemail.smtpserveroption 2340 sendemail.smtpserverport 2341 sendemail.smtpuser 2342 sendemail.suppresscc 2343 sendemail.suppressfrom 2344 sendemail.thread 2345 sendemail.to 2346 sendemail.validate 2347 showbranch.default 2348 status.relativePaths 2349 status.showUntrackedFiles 2350 status.submodulesummary 2351 submodule. 2352 tar.umask 2353 transfer.unpackLimit 2354 url. 2355 user.email 2356 user.name 2357 user.signingkey 2358 web.browser 2359 branch. remote. 2360 " 2361} 2362 2363_git_remote () 2364{ 2365 local subcommands="add rename rm show prune update set-head" 2366 local subcommand="$(__git_find_on_cmdline "$subcommands")" 2367 if [ -z "$subcommand" ]; then 2368 __gitcomp "$subcommands" 2369 return 2370 fi 2371 2372 case "$subcommand" in 2373 rename|rm|show|prune) 2374 __gitcomp "$(__git_remotes)" 2375 ;; 2376 update) 2377 local i c='' IFS=$'\n' 2378 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do 2379 i="${i#remotes.}" 2380 c="$c ${i/ */}" 2381 done 2382 __gitcomp "$c" 2383 ;; 2384 *) 2385 COMPREPLY=() 2386 ;; 2387 esac 2388} 2389 2390_git_replace () 2391{ 2392 __gitcomp "$(__git_refs)" 2393} 2394 2395_git_reset () 2396{ 2397 __git_has_doubledash && return 2398 2399 local cur 2400 _get_comp_words_by_ref -n =: cur 2401 case "$cur" in 2402 --*) 2403 __gitcomp "--merge --mixed --hard --soft --patch" 2404 return 2405 ;; 2406 esac 2407 __gitcomp "$(__git_refs)" 2408} 2409 2410_git_revert () 2411{ 2412 local cur 2413 _get_comp_words_by_ref -n =: cur 2414 case "$cur" in 2415 --*) 2416 __gitcomp "--edit --mainline --no-edit --no-commit --signoff" 2417 return 2418 ;; 2419 esac 2420 __gitcomp "$(__git_refs)" 2421} 2422 2423_git_rm () 2424{ 2425 __git_has_doubledash && return 2426 2427 local cur 2428 _get_comp_words_by_ref -n =: cur 2429 case "$cur" in 2430 --*) 2431 __gitcomp "--cached --dry-run --ignore-unmatch --quiet" 2432 return 2433 ;; 2434 esac 2435 COMPREPLY=() 2436} 2437 2438_git_shortlog () 2439{ 2440 __git_has_doubledash && return 2441 2442 local cur 2443 _get_comp_words_by_ref -n =: cur 2444 case "$cur" in 2445 --*) 2446 __gitcomp " 2447 $__git_log_common_options 2448 $__git_log_shortlog_options 2449 --numbered --summary 2450 " 2451 return 2452 ;; 2453 esac 2454 __git_complete_revlist 2455} 2456 2457_git_show () 2458{ 2459 __git_has_doubledash && return 2460 2461 local cur 2462 _get_comp_words_by_ref -n =: cur 2463 case "$cur" in 2464 --pretty=*) 2465 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) 2466 " "" "${cur##--pretty=}" 2467 return 2468 ;; 2469 --format=*) 2470 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) 2471 " "" "${cur##--format=}" 2472 return 2473 ;; 2474 --*) 2475 __gitcomp "--pretty= --format= --abbrev-commit --oneline 2476 $__git_diff_common_options 2477 " 2478 return 2479 ;; 2480 esac 2481 __git_complete_file 2482} 2483 2484_git_show_branch () 2485{ 2486 local cur 2487 _get_comp_words_by_ref -n =: cur 2488 case "$cur" in 2489 --*) 2490 __gitcomp " 2491 --all --remotes --topo-order --current --more= 2492 --list --independent --merge-base --no-name 2493 --color --no-color 2494 --sha1-name --sparse --topics --reflog 2495 " 2496 return 2497 ;; 2498 esac 2499 __git_complete_revlist 2500} 2501 2502_git_stash () 2503{ 2504 local cur 2505 _get_comp_words_by_ref -n =: cur 2506 local save_opts='--keep-index --no-keep-index --quiet --patch' 2507 local subcommands='save list show apply clear drop pop create branch' 2508 local subcommand="$(__git_find_on_cmdline "$subcommands")" 2509 if [ -z "$subcommand" ]; then 2510 case "$cur" in 2511 --*) 2512 __gitcomp "$save_opts" 2513 ;; 2514 *) 2515 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then 2516 __gitcomp "$subcommands" 2517 else 2518 COMPREPLY=() 2519 fi 2520 ;; 2521 esac 2522 else 2523 case "$subcommand,$cur" in 2524 save,--*) 2525 __gitcomp "$save_opts" 2526 ;; 2527 apply,--*|pop,--*) 2528 __gitcomp "--index --quiet" 2529 ;; 2530 show,--*|drop,--*|branch,--*) 2531 COMPREPLY=() 2532 ;; 2533 show,*|apply,*|drop,*|pop,*|branch,*) 2534 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \ 2535 | sed -n -e 's/:.*//p')" 2536 ;; 2537 *) 2538 COMPREPLY=() 2539 ;; 2540 esac 2541 fi 2542} 2543 2544_git_submodule () 2545{ 2546 __git_has_doubledash && return 2547 2548 local subcommands="add status init update summary foreach sync" 2549 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then 2550 local cur 2551 _get_comp_words_by_ref -n =: cur 2552 case "$cur" in 2553 --*) 2554 __gitcomp "--quiet --cached" 2555 ;; 2556 *) 2557 __gitcomp "$subcommands" 2558 ;; 2559 esac 2560 return 2561 fi 2562} 2563 2564_git_svn () 2565{ 2566 local subcommands=" 2567 init fetch clone rebase dcommit log find-rev 2568 set-tree commit-diff info create-ignore propget 2569 proplist show-ignore show-externals branch tag blame 2570 migrate mkdirs reset gc 2571 " 2572 local subcommand="$(__git_find_on_cmdline "$subcommands")" 2573 if [ -z "$subcommand" ]; then 2574 __gitcomp "$subcommands" 2575 else 2576 local remote_opts="--username= --config-dir= --no-auth-cache" 2577 local fc_opts=" 2578 --follow-parent --authors-file= --repack= 2579 --no-metadata --use-svm-props --use-svnsync-props 2580 --log-window-size= --no-checkout --quiet 2581 --repack-flags --use-log-author --localtime 2582 --ignore-paths= $remote_opts 2583 " 2584 local init_opts=" 2585 --template= --shared= --trunk= --tags= 2586 --branches= --stdlayout --minimize-url 2587 --no-metadata --use-svm-props --use-svnsync-props 2588 --rewrite-root= --prefix= --use-log-author 2589 --add-author-from $remote_opts 2590 " 2591 local cmt_opts=" 2592 --edit --rmdir --find-copies-harder --copy-similarity= 2593 " 2594 2595 local cur 2596 _get_comp_words_by_ref -n =: cur 2597 case "$subcommand,$cur" in 2598 fetch,--*) 2599 __gitcomp "--revision= --fetch-all $fc_opts" 2600 ;; 2601 clone,--*) 2602 __gitcomp "--revision= $fc_opts $init_opts" 2603 ;; 2604 init,--*) 2605 __gitcomp "$init_opts" 2606 ;; 2607 dcommit,--*) 2608 __gitcomp " 2609 --merge --strategy= --verbose --dry-run 2610 --fetch-all --no-rebase --commit-url 2611 --revision $cmt_opts $fc_opts 2612 " 2613 ;; 2614 set-tree,--*) 2615 __gitcomp "--stdin $cmt_opts $fc_opts" 2616 ;; 2617 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\ 2618 show-externals,--*|mkdirs,--*) 2619 __gitcomp "--revision=" 2620 ;; 2621 log,--*) 2622 __gitcomp " 2623 --limit= --revision= --verbose --incremental 2624 --oneline --show-commit --non-recursive 2625 --authors-file= --color 2626 " 2627 ;; 2628 rebase,--*) 2629 __gitcomp " 2630 --merge --verbose --strategy= --local 2631 --fetch-all --dry-run $fc_opts 2632 " 2633 ;; 2634 commit-diff,--*) 2635 __gitcomp "--message= --file= --revision= $cmt_opts" 2636 ;; 2637 info,--*) 2638 __gitcomp "--url" 2639 ;; 2640 branch,--*) 2641 __gitcomp "--dry-run --message --tag" 2642 ;; 2643 tag,--*) 2644 __gitcomp "--dry-run --message" 2645 ;; 2646 blame,--*) 2647 __gitcomp "--git-format" 2648 ;; 2649 migrate,--*) 2650 __gitcomp " 2651 --config-dir= --ignore-paths= --minimize 2652 --no-auth-cache --username= 2653 " 2654 ;; 2655 reset,--*) 2656 __gitcomp "--revision= --parent" 2657 ;; 2658 *) 2659 COMPREPLY=() 2660 ;; 2661 esac 2662 fi 2663} 2664 2665_git_tag () 2666{ 2667 local i c=1 f=0 2668 local words cword prev 2669 _get_comp_words_by_ref -n =: words cword prev 2670 while [ $c -lt $cword ]; do 2671 i="${words[c]}" 2672 case "$i" in 2673 -d|-v) 2674 __gitcomp "$(__git_tags)" 2675 return 2676 ;; 2677 -f) 2678 f=1 2679 ;; 2680 esac 2681 c=$((++c)) 2682 done 2683 2684 case "$prev" in 2685 -m|-F) 2686 COMPREPLY=() 2687 ;; 2688 -*|tag) 2689 if [ $f = 1 ]; then 2690 __gitcomp "$(__git_tags)" 2691 else 2692 COMPREPLY=() 2693 fi 2694 ;; 2695 *) 2696 __gitcomp "$(__git_refs)" 2697 ;; 2698 esac 2699} 2700 2701_git_whatchanged () 2702{ 2703 _git_log 2704} 2705 2706_git () 2707{ 2708 local i c=1 command __git_dir 2709 2710 if [[ -n ${ZSH_VERSION-} ]]; then 2711 emulate -L bash 2712 setopt KSH_TYPESET 2713 2714 # workaround zsh's bug that leaves 'words' as a special 2715 # variable in versions < 4.3.12 2716 typeset -h words 2717 fi 2718 2719 local cur words cword 2720 _get_comp_words_by_ref -n =: cur words cword 2721 while [ $c -lt $cword ]; do 2722 i="${words[c]}" 2723 case "$i" in 2724 --git-dir=*) __git_dir="${i#--git-dir=}" ;; 2725 --bare) __git_dir="." ;; 2726 --version|-p|--paginate) ;; 2727 --help) command="help"; break ;; 2728 *) command="$i"; break ;; 2729 esac 2730 c=$((++c)) 2731 done 2732 2733 if [ -z "$command" ]; then 2734 case "$cur" in 2735 --*) __gitcomp " 2736 --paginate 2737 --no-pager 2738 --git-dir= 2739 --bare 2740 --version 2741 --exec-path 2742 --html-path 2743 --work-tree= 2744 --help 2745 " 2746 ;; 2747 *) __git_compute_porcelain_commands 2748 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;; 2749 esac 2750 return 2751 fi 2752 2753 local completion_func="_git_${command//-/_}" 2754 declare -f $completion_func >/dev/null && $completion_func && return 2755 2756 local expansion=$(__git_aliased_command "$command") 2757 if [ -n "$expansion" ]; then 2758 completion_func="_git_${expansion//-/_}" 2759 declare -f $completion_func >/dev/null && $completion_func 2760 fi 2761} 2762 2763_gitk () 2764{ 2765 if [[ -n ${ZSH_VERSION-} ]]; then 2766 emulate -L bash 2767 setopt KSH_TYPESET 2768 2769 # workaround zsh's bug that leaves 'words' as a special 2770 # variable in versions < 4.3.12 2771 typeset -h words 2772 fi 2773 2774 __git_has_doubledash && return 2775 2776 local cur 2777 local g="$(__gitdir)" 2778 local merge="" 2779 if [ -f "$g/MERGE_HEAD" ]; then 2780 merge="--merge" 2781 fi 2782 _get_comp_words_by_ref -n =: cur 2783 case "$cur" in 2784 --*) 2785 __gitcomp " 2786 $__git_log_common_options 2787 $__git_log_gitk_options 2788 $merge 2789 " 2790 return 2791 ;; 2792 esac 2793 __git_complete_revlist 2794} 2795 2796complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \ 2797 || complete -o default -o nospace -F _git git 2798complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \ 2799 || complete -o default -o nospace -F _gitk gitk 2800 2801# The following are necessary only for Cygwin, and only are needed 2802# when the user has tab-completed the executable name and consequently 2803# included the '.exe' suffix. 2804# 2805if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then 2806complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \ 2807 || complete -o default -o nospace -F _git git.exe 2808fi 2809 2810if [[ -n ${ZSH_VERSION-} ]]; then 2811 shopt () { 2812 local option 2813 if [ $# -ne 2 ]; then 2814 echo "USAGE: $0 (-q|-s|-u) <option>" >&2 2815 return 1 2816 fi 2817 case "$2" in 2818 nullglob) 2819 option="$2" 2820 ;; 2821 *) 2822 echo "$0: invalid option: $2" >&2 2823 return 1 2824 esac 2825 case "$1" in 2826 -q) setopt | grep -q "$option" ;; 2827 -u) unsetopt "$option" ;; 2828 -s) setopt "$option" ;; 2829 *) 2830 echo "$0: invalid flag: $1" >&2 2831 return 1 2832 esac 2833 } 2834fi 2835