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