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
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"
1581# Options that go well for log and gitk (not shortlog)
1582__git_log_gitk_options="
1583 --dense --sparse --full-history
1584 --simplify-merges --simplify-by-decoration
1585 --left-right
1586"
1587# Options that go well for log and shortlog (not gitk)
1588__git_log_shortlog_options="
1589 --author= --committer= --grep=
1590 --all-match
1591"
1592
1593__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1594__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1595
1596_git_log ()
1597{
1598 __git_has_doubledash && return
1599
1600 local g="$(git rev-parse --git-dir 2>/dev/null)"
1601 local merge=""
1602 if [ -f "$g/MERGE_HEAD" ]; then
1603 merge="--merge"
1604 fi
1605 local cur
1606 _get_comp_words_by_ref -n =: cur
1607 case "$cur" in
1608 --pretty=*)
1609 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1610 " "" "${cur##--pretty=}"
1611 return
1612 ;;
1613 --format=*)
1614 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1615 " "" "${cur##--format=}"
1616 return
1617 ;;
1618 --date=*)
1619 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1620 return
1621 ;;
1622 --decorate=*)
1623 __gitcomp "long short" "" "${cur##--decorate=}"
1624 return
1625 ;;
1626 --*)
1627 __gitcomp "
1628 $__git_log_common_options
1629 $__git_log_shortlog_options
1630 $__git_log_gitk_options
1631 --root --topo-order --date-order --reverse
1632 --follow --full-diff
1633 --abbrev-commit --abbrev=
1634 --relative-date --date=
1635 --pretty= --format= --oneline
1636 --cherry-pick
1637 --graph
1638 --decorate --decorate=
1639 --walk-reflogs
1640 --parents --children
1641 $merge
1642 $__git_diff_common_options
1643 --pickaxe-all --pickaxe-regex
1644 "
1645 return
1646 ;;
1647 esac
1648 __git_complete_revlist
1649}
1650
1651__git_merge_options="
1652 --no-commit --no-stat --log --no-log --squash --strategy
1653 --commit --stat --no-squash --ff --no-ff --ff-only
1654"
1655
1656_git_merge ()
1657{
1658 __git_complete_strategy && return
1659
1660 local cur
1661 _get_comp_words_by_ref -n =: cur
1662 case "$cur" in
1663 --*)
1664 __gitcomp "$__git_merge_options"
1665 return
1666 esac
1667 __gitcomp "$(__git_refs)"
1668}
1669
1670_git_mergetool ()
1671{
1672 local cur
1673 _get_comp_words_by_ref -n =: cur
1674 case "$cur" in
1675 --tool=*)
1676 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1677 return
1678 ;;
1679 --*)
1680 __gitcomp "--tool="
1681 return
1682 ;;
1683 esac
1684 COMPREPLY=()
1685}
1686
1687_git_merge_base ()
1688{
1689 __gitcomp "$(__git_refs)"
1690}
1691
1692_git_mv ()
1693{
1694 local cur
1695 _get_comp_words_by_ref -n =: cur
1696 case "$cur" in
1697 --*)
1698 __gitcomp "--dry-run"
1699 return
1700 ;;
1701 esac
1702 COMPREPLY=()
1703}
1704
1705_git_name_rev ()
1706{
1707 __gitcomp "--tags --all --stdin"
1708}
1709
1710_git_notes ()
1711{
1712 local subcommands='add append copy edit list prune remove show'
1713 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1714 local cur words cword
1715 _get_comp_words_by_ref -n =: cur words cword
1716
1717 case "$subcommand,$cur" in
1718 ,--*)
1719 __gitcomp '--ref'
1720 ;;
1721 ,*)
1722 case "${words[cword-1]}" in
1723 --ref)
1724 __gitcomp "$(__git_refs)"
1725 ;;
1726 *)
1727 __gitcomp "$subcommands --ref"
1728 ;;
1729 esac
1730 ;;
1731 add,--reuse-message=*|append,--reuse-message=*)
1732 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1733 ;;
1734 add,--reedit-message=*|append,--reedit-message=*)
1735 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1736 ;;
1737 add,--*|append,--*)
1738 __gitcomp '--file= --message= --reedit-message=
1739 --reuse-message='
1740 ;;
1741 copy,--*)
1742 __gitcomp '--stdin'
1743 ;;
1744 prune,--*)
1745 __gitcomp '--dry-run --verbose'
1746 ;;
1747 prune,*)
1748 ;;
1749 *)
1750 case "${words[cword-1]}" in
1751 -m|-F)
1752 ;;
1753 *)
1754 __gitcomp "$(__git_refs)"
1755 ;;
1756 esac
1757 ;;
1758 esac
1759}
1760
1761_git_pull ()
1762{
1763 __git_complete_strategy && return
1764
1765 local cur
1766 _get_comp_words_by_ref -n =: cur
1767 case "$cur" in
1768 --*)
1769 __gitcomp "
1770 --rebase --no-rebase
1771 $__git_merge_options
1772 $__git_fetch_options
1773 "
1774 return
1775 ;;
1776 esac
1777 __git_complete_remote_or_refspec
1778}
1779
1780_git_push ()
1781{
1782 local cur prev
1783 _get_comp_words_by_ref -n =: cur prev
1784 case "$prev" in
1785 --repo)
1786 __gitcomp "$(__git_remotes)"
1787 return
1788 esac
1789 case "$cur" in
1790 --repo=*)
1791 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1792 return
1793 ;;
1794 --*)
1795 __gitcomp "
1796 --all --mirror --tags --dry-run --force --verbose
1797 --receive-pack= --repo=
1798 "
1799 return
1800 ;;
1801 esac
1802 __git_complete_remote_or_refspec
1803}
1804
1805_git_rebase ()
1806{
1807 local dir="$(__gitdir)"
1808 local cur
1809 _get_comp_words_by_ref -n =: cur
1810 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1811 __gitcomp "--continue --skip --abort"
1812 return
1813 fi
1814 __git_complete_strategy && return
1815 case "$cur" in
1816 --whitespace=*)
1817 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1818 return
1819 ;;
1820 --*)
1821 __gitcomp "
1822 --onto --merge --strategy --interactive
1823 --preserve-merges --stat --no-stat
1824 --committer-date-is-author-date --ignore-date
1825 --ignore-whitespace --whitespace=
1826 --autosquash
1827 "
1828
1829 return
1830 esac
1831 __gitcomp "$(__git_refs)"
1832}
1833
1834_git_reflog ()
1835{
1836 local subcommands="show delete expire"
1837 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1838
1839 if [ -z "$subcommand" ]; then
1840 __gitcomp "$subcommands"
1841 else
1842 __gitcomp "$(__git_refs)"
1843 fi
1844}
1845
1846__git_send_email_confirm_options="always never auto cc compose"
1847__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1848
1849_git_send_email ()
1850{
1851 local cur
1852 _get_comp_words_by_ref -n =: cur
1853 case "$cur" in
1854 --confirm=*)
1855 __gitcomp "
1856 $__git_send_email_confirm_options
1857 " "" "${cur##--confirm=}"
1858 return
1859 ;;
1860 --suppress-cc=*)
1861 __gitcomp "
1862 $__git_send_email_suppresscc_options
1863 " "" "${cur##--suppress-cc=}"
1864
1865 return
1866 ;;
1867 --smtp-encryption=*)
1868 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1869 return
1870 ;;
1871 --*)
1872 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1873 --compose --confirm= --dry-run --envelope-sender
1874 --from --identity
1875 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1876 --no-suppress-from --no-thread --quiet
1877 --signed-off-by-cc --smtp-pass --smtp-server
1878 --smtp-server-port --smtp-encryption= --smtp-user
1879 --subject --suppress-cc= --suppress-from --thread --to
1880 --validate --no-validate"
1881 return
1882 ;;
1883 esac
1884 COMPREPLY=()
1885}
1886
1887_git_stage ()
1888{
1889 _git_add
1890}
1891
1892__git_config_get_set_variables ()
1893{
1894 local words cword
1895 _get_comp_words_by_ref -n =: words cword
1896 local prevword word config_file= c=$cword
1897 while [ $c -gt 1 ]; do
1898 word="${words[c]}"
1899 case "$word" in
1900 --global|--system|--file=*)
1901 config_file="$word"
1902 break
1903 ;;
1904 -f|--file)
1905 config_file="$word $prevword"
1906 break
1907 ;;
1908 esac
1909 prevword=$word
1910 c=$((--c))
1911 done
1912
1913 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1914 while read line
1915 do
1916 case "$line" in
1917 *.*=*)
1918 echo "${line/=*/}"
1919 ;;
1920 esac
1921 done
1922}
1923
1924_git_config ()
1925{
1926 local cur prev
1927 _get_comp_words_by_ref -n =: cur prev
1928 case "$prev" in
1929 branch.*.remote)
1930 __gitcomp "$(__git_remotes)"
1931 return
1932 ;;
1933 branch.*.merge)
1934 __gitcomp "$(__git_refs)"
1935 return
1936 ;;
1937 remote.*.fetch)
1938 local remote="${prev#remote.}"
1939 remote="${remote%.fetch}"
1940 __gitcomp "$(__git_refs_remotes "$remote")"
1941 return
1942 ;;
1943 remote.*.push)
1944 local remote="${prev#remote.}"
1945 remote="${remote%.push}"
1946 __gitcomp "$(git --git-dir="$(__gitdir)" \
1947 for-each-ref --format='%(refname):%(refname)' \
1948 refs/heads)"
1949 return
1950 ;;
1951 pull.twohead|pull.octopus)
1952 __git_compute_merge_strategies
1953 __gitcomp "$__git_merge_strategies"
1954 return
1955 ;;
1956 color.branch|color.diff|color.interactive|\
1957 color.showbranch|color.status|color.ui)
1958 __gitcomp "always never auto"
1959 return
1960 ;;
1961 color.pager)
1962 __gitcomp "false true"
1963 return
1964 ;;
1965 color.*.*)
1966 __gitcomp "
1967 normal black red green yellow blue magenta cyan white
1968 bold dim ul blink reverse
1969 "
1970 return
1971 ;;
1972 help.format)
1973 __gitcomp "man info web html"
1974 return
1975 ;;
1976 log.date)
1977 __gitcomp "$__git_log_date_formats"
1978 return
1979 ;;
1980 sendemail.aliasesfiletype)
1981 __gitcomp "mutt mailrc pine elm gnus"
1982 return
1983 ;;
1984 sendemail.confirm)
1985 __gitcomp "$__git_send_email_confirm_options"
1986 return
1987 ;;
1988 sendemail.suppresscc)
1989 __gitcomp "$__git_send_email_suppresscc_options"
1990 return
1991 ;;
1992 --get|--get-all|--unset|--unset-all)
1993 __gitcomp "$(__git_config_get_set_variables)"
1994 return
1995 ;;
1996 *.*)
1997 COMPREPLY=()
1998 return
1999 ;;
2000 esac
2001 case "$cur" in
2002 --*)
2003 __gitcomp "
2004 --global --system --file=
2005 --list --replace-all
2006 --get --get-all --get-regexp
2007 --add --unset --unset-all
2008 --remove-section --rename-section
2009 "
2010 return
2011 ;;
2012 branch.*.*)
2013 local pfx="${cur%.*}."
2014 cur="${cur##*.}"
2015 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
2016 return
2017 ;;
2018 branch.*)
2019 local pfx="${cur%.*}."
2020 cur="${cur#*.}"
2021 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
2022 return
2023 ;;
2024 guitool.*.*)
2025 local pfx="${cur%.*}."
2026 cur="${cur##*.}"
2027 __gitcomp "
2028 argprompt cmd confirm needsfile noconsole norescan
2029 prompt revprompt revunmerged title
2030 " "$pfx" "$cur"
2031 return
2032 ;;
2033 difftool.*.*)
2034 local pfx="${cur%.*}."
2035 cur="${cur##*.}"
2036 __gitcomp "cmd path" "$pfx" "$cur"
2037 return
2038 ;;
2039 man.*.*)
2040 local pfx="${cur%.*}."
2041 cur="${cur##*.}"
2042 __gitcomp "cmd path" "$pfx" "$cur"
2043 return
2044 ;;
2045 mergetool.*.*)
2046 local pfx="${cur%.*}."
2047 cur="${cur##*.}"
2048 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
2049 return
2050 ;;
2051 pager.*)
2052 local pfx="${cur%.*}."
2053 cur="${cur#*.}"
2054 __git_compute_all_commands
2055 __gitcomp "$__git_all_commands" "$pfx" "$cur"
2056 return
2057 ;;
2058 remote.*.*)
2059 local pfx="${cur%.*}."
2060 cur="${cur##*.}"
2061 __gitcomp "
2062 url proxy fetch push mirror skipDefaultUpdate
2063 receivepack uploadpack tagopt pushurl
2064 " "$pfx" "$cur"
2065 return
2066 ;;
2067 remote.*)
2068 local pfx="${cur%.*}."
2069 cur="${cur#*.}"
2070 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
2071 return
2072 ;;
2073 url.*.*)
2074 local pfx="${cur%.*}."
2075 cur="${cur##*.}"
2076 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
2077 return
2078 ;;
2079 esac
2080 __gitcomp "
2081 add.ignoreErrors
2082 advice.commitBeforeMerge
2083 advice.detachedHead
2084 advice.implicitIdentity
2085 advice.pushNonFastForward
2086 advice.resolveConflict
2087 advice.statusHints
2088 alias.
2089 am.keepcr
2090 apply.ignorewhitespace
2091 apply.whitespace
2092 branch.autosetupmerge
2093 branch.autosetuprebase
2094 browser.
2095 clean.requireForce
2096 color.branch
2097 color.branch.current
2098 color.branch.local
2099 color.branch.plain
2100 color.branch.remote
2101 color.decorate.HEAD
2102 color.decorate.branch
2103 color.decorate.remoteBranch
2104 color.decorate.stash
2105 color.decorate.tag
2106 color.diff
2107 color.diff.commit
2108 color.diff.frag
2109 color.diff.func
2110 color.diff.meta
2111 color.diff.new
2112 color.diff.old
2113 color.diff.plain
2114 color.diff.whitespace
2115 color.grep
2116 color.grep.context
2117 color.grep.filename
2118 color.grep.function
2119 color.grep.linenumber
2120 color.grep.match
2121 color.grep.selected
2122 color.grep.separator
2123 color.interactive
2124 color.interactive.error
2125 color.interactive.header
2126 color.interactive.help
2127 color.interactive.prompt
2128 color.pager
2129 color.showbranch
2130 color.status
2131 color.status.added
2132 color.status.changed
2133 color.status.header
2134 color.status.nobranch
2135 color.status.untracked
2136 color.status.updated
2137 color.ui
2138 commit.status
2139 commit.template
2140 core.abbrevguard
2141 core.askpass
2142 core.attributesfile
2143 core.autocrlf
2144 core.bare
2145 core.bigFileThreshold
2146 core.compression
2147 core.createObject
2148 core.deltaBaseCacheLimit
2149 core.editor
2150 core.eol
2151 core.excludesfile
2152 core.fileMode
2153 core.fsyncobjectfiles
2154 core.gitProxy
2155 core.ignoreCygwinFSTricks
2156 core.ignoreStat
2157 core.ignorecase
2158 core.logAllRefUpdates
2159 core.loosecompression
2160 core.notesRef
2161 core.packedGitLimit
2162 core.packedGitWindowSize
2163 core.pager
2164 core.preferSymlinkRefs
2165 core.preloadindex
2166 core.quotepath
2167 core.repositoryFormatVersion
2168 core.safecrlf
2169 core.sharedRepository
2170 core.sparseCheckout
2171 core.symlinks
2172 core.trustctime
2173 core.warnAmbiguousRefs
2174 core.whitespace
2175 core.worktree
2176 diff.autorefreshindex
2177 diff.external
2178 diff.ignoreSubmodules
2179 diff.mnemonicprefix
2180 diff.noprefix
2181 diff.renameLimit
2182 diff.renames
2183 diff.suppressBlankEmpty
2184 diff.tool
2185 diff.wordRegex
2186 difftool.
2187 difftool.prompt
2188 fetch.recurseSubmodules
2189 fetch.unpackLimit
2190 format.attach
2191 format.cc
2192 format.headers
2193 format.numbered
2194 format.pretty
2195 format.signature
2196 format.signoff
2197 format.subjectprefix
2198 format.suffix
2199 format.thread
2200 format.to
2201 gc.
2202 gc.aggressiveWindow
2203 gc.auto
2204 gc.autopacklimit
2205 gc.packrefs
2206 gc.pruneexpire
2207 gc.reflogexpire
2208 gc.reflogexpireunreachable
2209 gc.rerereresolved
2210 gc.rerereunresolved
2211 gitcvs.allbinary
2212 gitcvs.commitmsgannotation
2213 gitcvs.dbTableNamePrefix
2214 gitcvs.dbdriver
2215 gitcvs.dbname
2216 gitcvs.dbpass
2217 gitcvs.dbuser
2218 gitcvs.enabled
2219 gitcvs.logfile
2220 gitcvs.usecrlfattr
2221 guitool.
2222 gui.blamehistoryctx
2223 gui.commitmsgwidth
2224 gui.copyblamethreshold
2225 gui.diffcontext
2226 gui.encoding
2227 gui.fastcopyblame
2228 gui.matchtrackingbranch
2229 gui.newbranchtemplate
2230 gui.pruneduringfetch
2231 gui.spellingdictionary
2232 gui.trustmtime
2233 help.autocorrect
2234 help.browser
2235 help.format
2236 http.lowSpeedLimit
2237 http.lowSpeedTime
2238 http.maxRequests
2239 http.minSessions
2240 http.noEPSV
2241 http.postBuffer
2242 http.proxy
2243 http.sslCAInfo
2244 http.sslCAPath
2245 http.sslCert
2246 http.sslCertPasswordProtected
2247 http.sslKey
2248 http.sslVerify
2249 http.useragent
2250 i18n.commitEncoding
2251 i18n.logOutputEncoding
2252 imap.authMethod
2253 imap.folder
2254 imap.host
2255 imap.pass
2256 imap.port
2257 imap.preformattedHTML
2258 imap.sslverify
2259 imap.tunnel
2260 imap.user
2261 init.templatedir
2262 instaweb.browser
2263 instaweb.httpd
2264 instaweb.local
2265 instaweb.modulepath
2266 instaweb.port
2267 interactive.singlekey
2268 log.date
2269 log.decorate
2270 log.showroot
2271 mailmap.file
2272 man.
2273 man.viewer
2274 merge.
2275 merge.conflictstyle
2276 merge.log
2277 merge.renameLimit
2278 merge.renormalize
2279 merge.stat
2280 merge.tool
2281 merge.verbosity
2282 mergetool.
2283 mergetool.keepBackup
2284 mergetool.keepTemporaries
2285 mergetool.prompt
2286 notes.displayRef
2287 notes.rewrite.
2288 notes.rewrite.amend
2289 notes.rewrite.rebase
2290 notes.rewriteMode
2291 notes.rewriteRef
2292 pack.compression
2293 pack.deltaCacheLimit
2294 pack.deltaCacheSize
2295 pack.depth
2296 pack.indexVersion
2297 pack.packSizeLimit
2298 pack.threads
2299 pack.window
2300 pack.windowMemory
2301 pager.
2302 pretty.
2303 pull.octopus
2304 pull.twohead
2305 push.default
2306 rebase.autosquash
2307 rebase.stat
2308 receive.autogc
2309 receive.denyCurrentBranch
2310 receive.denyDeleteCurrent
2311 receive.denyDeletes
2312 receive.denyNonFastForwards
2313 receive.fsckObjects
2314 receive.unpackLimit
2315 receive.updateserverinfo
2316 remotes.
2317 repack.usedeltabaseoffset
2318 rerere.autoupdate
2319 rerere.enabled
2320 sendemail.
2321 sendemail.aliasesfile
2322 sendemail.aliasfiletype
2323 sendemail.bcc
2324 sendemail.cc
2325 sendemail.cccmd
2326 sendemail.chainreplyto
2327 sendemail.confirm
2328 sendemail.envelopesender
2329 sendemail.from
2330 sendemail.identity
2331 sendemail.multiedit
2332 sendemail.signedoffbycc
2333 sendemail.smtpdomain
2334 sendemail.smtpencryption
2335 sendemail.smtppass
2336 sendemail.smtpserver
2337 sendemail.smtpserveroption
2338 sendemail.smtpserverport
2339 sendemail.smtpuser
2340 sendemail.suppresscc
2341 sendemail.suppressfrom
2342 sendemail.thread
2343 sendemail.to
2344 sendemail.validate
2345 showbranch.default
2346 status.relativePaths
2347 status.showUntrackedFiles
2348 status.submodulesummary
2349 submodule.
2350 tar.umask
2351 transfer.unpackLimit
2352 url.
2353 user.email
2354 user.name
2355 user.signingkey
2356 web.browser
2357 branch. remote.
2358 "
2359}
2360
2361_git_remote ()
2362{
2363 local subcommands="add rename rm show prune update set-head"
2364 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2365 if [ -z "$subcommand" ]; then
2366 __gitcomp "$subcommands"
2367 return
2368 fi
2369
2370 case "$subcommand" in
2371 rename|rm|show|prune)
2372 __gitcomp "$(__git_remotes)"
2373 ;;
2374 update)
2375 local i c='' IFS=$'\n'
2376 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2377 i="${i#remotes.}"
2378 c="$c ${i/ */}"
2379 done
2380 __gitcomp "$c"
2381 ;;
2382 *)
2383 COMPREPLY=()
2384 ;;
2385 esac
2386}
2387
2388_git_replace ()
2389{
2390 __gitcomp "$(__git_refs)"
2391}
2392
2393_git_reset ()
2394{
2395 __git_has_doubledash && return
2396
2397 local cur
2398 _get_comp_words_by_ref -n =: cur
2399 case "$cur" in
2400 --*)
2401 __gitcomp "--merge --mixed --hard --soft --patch"
2402 return
2403 ;;
2404 esac
2405 __gitcomp "$(__git_refs)"
2406}
2407
2408_git_revert ()
2409{
2410 local cur
2411 _get_comp_words_by_ref -n =: cur
2412 case "$cur" in
2413 --*)
2414 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2415 return
2416 ;;
2417 esac
2418 __gitcomp "$(__git_refs)"
2419}
2420
2421_git_rm ()
2422{
2423 __git_has_doubledash && return
2424
2425 local cur
2426 _get_comp_words_by_ref -n =: cur
2427 case "$cur" in
2428 --*)
2429 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2430 return
2431 ;;
2432 esac
2433 COMPREPLY=()
2434}
2435
2436_git_shortlog ()
2437{
2438 __git_has_doubledash && return
2439
2440 local cur
2441 _get_comp_words_by_ref -n =: cur
2442 case "$cur" in
2443 --*)
2444 __gitcomp "
2445 $__git_log_common_options
2446 $__git_log_shortlog_options
2447 --numbered --summary
2448 "
2449 return
2450 ;;
2451 esac
2452 __git_complete_revlist
2453}
2454
2455_git_show ()
2456{
2457 __git_has_doubledash && return
2458
2459 local cur
2460 _get_comp_words_by_ref -n =: cur
2461 case "$cur" in
2462 --pretty=*)
2463 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2464 " "" "${cur##--pretty=}"
2465 return
2466 ;;
2467 --format=*)
2468 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2469 " "" "${cur##--format=}"
2470 return
2471 ;;
2472 --*)
2473 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2474 $__git_diff_common_options
2475 "
2476 return
2477 ;;
2478 esac
2479 __git_complete_file
2480}
2481
2482_git_show_branch ()
2483{
2484 local cur
2485 _get_comp_words_by_ref -n =: cur
2486 case "$cur" in
2487 --*)
2488 __gitcomp "
2489 --all --remotes --topo-order --current --more=
2490 --list --independent --merge-base --no-name
2491 --color --no-color
2492 --sha1-name --sparse --topics --reflog
2493 "
2494 return
2495 ;;
2496 esac
2497 __git_complete_revlist
2498}
2499
2500_git_stash ()
2501{
2502 local cur
2503 _get_comp_words_by_ref -n =: cur
2504 local save_opts='--keep-index --no-keep-index --quiet --patch'
2505 local subcommands='save list show apply clear drop pop create branch'
2506 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2507 if [ -z "$subcommand" ]; then
2508 case "$cur" in
2509 --*)
2510 __gitcomp "$save_opts"
2511 ;;
2512 *)
2513 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2514 __gitcomp "$subcommands"
2515 else
2516 COMPREPLY=()
2517 fi
2518 ;;
2519 esac
2520 else
2521 case "$subcommand,$cur" in
2522 save,--*)
2523 __gitcomp "$save_opts"
2524 ;;
2525 apply,--*|pop,--*)
2526 __gitcomp "--index --quiet"
2527 ;;
2528 show,--*|drop,--*|branch,--*)
2529 COMPREPLY=()
2530 ;;
2531 show,*|apply,*|drop,*|pop,*|branch,*)
2532 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2533 | sed -n -e 's/:.*//p')"
2534 ;;
2535 *)
2536 COMPREPLY=()
2537 ;;
2538 esac
2539 fi
2540}
2541
2542_git_submodule ()
2543{
2544 __git_has_doubledash && return
2545
2546 local subcommands="add status init update summary foreach sync"
2547 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2548 local cur
2549 _get_comp_words_by_ref -n =: cur
2550 case "$cur" in
2551 --*)
2552 __gitcomp "--quiet --cached"
2553 ;;
2554 *)
2555 __gitcomp "$subcommands"
2556 ;;
2557 esac
2558 return
2559 fi
2560}
2561
2562_git_svn ()
2563{
2564 local subcommands="
2565 init fetch clone rebase dcommit log find-rev
2566 set-tree commit-diff info create-ignore propget
2567 proplist show-ignore show-externals branch tag blame
2568 migrate mkdirs reset gc
2569 "
2570 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2571 if [ -z "$subcommand" ]; then
2572 __gitcomp "$subcommands"
2573 else
2574 local remote_opts="--username= --config-dir= --no-auth-cache"
2575 local fc_opts="
2576 --follow-parent --authors-file= --repack=
2577 --no-metadata --use-svm-props --use-svnsync-props
2578 --log-window-size= --no-checkout --quiet
2579 --repack-flags --use-log-author --localtime
2580 --ignore-paths= $remote_opts
2581 "
2582 local init_opts="
2583 --template= --shared= --trunk= --tags=
2584 --branches= --stdlayout --minimize-url
2585 --no-metadata --use-svm-props --use-svnsync-props
2586 --rewrite-root= --prefix= --use-log-author
2587 --add-author-from $remote_opts
2588 "
2589 local cmt_opts="
2590 --edit --rmdir --find-copies-harder --copy-similarity=
2591 "
2592
2593 local cur
2594 _get_comp_words_by_ref -n =: cur
2595 case "$subcommand,$cur" in
2596 fetch,--*)
2597 __gitcomp "--revision= --fetch-all $fc_opts"
2598 ;;
2599 clone,--*)
2600 __gitcomp "--revision= $fc_opts $init_opts"
2601 ;;
2602 init,--*)
2603 __gitcomp "$init_opts"
2604 ;;
2605 dcommit,--*)
2606 __gitcomp "
2607 --merge --strategy= --verbose --dry-run
2608 --fetch-all --no-rebase --commit-url
2609 --revision $cmt_opts $fc_opts
2610 "
2611 ;;
2612 set-tree,--*)
2613 __gitcomp "--stdin $cmt_opts $fc_opts"
2614 ;;
2615 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2616 show-externals,--*|mkdirs,--*)
2617 __gitcomp "--revision="
2618 ;;
2619 log,--*)
2620 __gitcomp "
2621 --limit= --revision= --verbose --incremental
2622 --oneline --show-commit --non-recursive
2623 --authors-file= --color
2624 "
2625 ;;
2626 rebase,--*)
2627 __gitcomp "
2628 --merge --verbose --strategy= --local
2629 --fetch-all --dry-run $fc_opts
2630 "
2631 ;;
2632 commit-diff,--*)
2633 __gitcomp "--message= --file= --revision= $cmt_opts"
2634 ;;
2635 info,--*)
2636 __gitcomp "--url"
2637 ;;
2638 branch,--*)
2639 __gitcomp "--dry-run --message --tag"
2640 ;;
2641 tag,--*)
2642 __gitcomp "--dry-run --message"
2643 ;;
2644 blame,--*)
2645 __gitcomp "--git-format"
2646 ;;
2647 migrate,--*)
2648 __gitcomp "
2649 --config-dir= --ignore-paths= --minimize
2650 --no-auth-cache --username=
2651 "
2652 ;;
2653 reset,--*)
2654 __gitcomp "--revision= --parent"
2655 ;;
2656 *)
2657 COMPREPLY=()
2658 ;;
2659 esac
2660 fi
2661}
2662
2663_git_tag ()
2664{
2665 local i c=1 f=0
2666 local words cword prev
2667 _get_comp_words_by_ref -n =: words cword prev
2668 while [ $c -lt $cword ]; do
2669 i="${words[c]}"
2670 case "$i" in
2671 -d|-v)
2672 __gitcomp "$(__git_tags)"
2673 return
2674 ;;
2675 -f)
2676 f=1
2677 ;;
2678 esac
2679 c=$((++c))
2680 done
2681
2682 case "$prev" in
2683 -m|-F)
2684 COMPREPLY=()
2685 ;;
2686 -*|tag)
2687 if [ $f = 1 ]; then
2688 __gitcomp "$(__git_tags)"
2689 else
2690 COMPREPLY=()
2691 fi
2692 ;;
2693 *)
2694 __gitcomp "$(__git_refs)"
2695 ;;
2696 esac
2697}
2698
2699_git_whatchanged ()
2700{
2701 _git_log
2702}
2703
2704_git ()
2705{
2706 local i c=1 command __git_dir
2707
2708 if [[ -n ${ZSH_VERSION-} ]]; then
2709 emulate -L bash
2710 setopt KSH_TYPESET
2711 fi
2712
2713 local cur words cword
2714 _get_comp_words_by_ref -n =: cur words cword
2715 while [ $c -lt $cword ]; do
2716 i="${words[c]}"
2717 case "$i" in
2718 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2719 --bare) __git_dir="." ;;
2720 --version|-p|--paginate) ;;
2721 --help) command="help"; break ;;
2722 *) command="$i"; break ;;
2723 esac
2724 c=$((++c))
2725 done
2726
2727 if [ -z "$command" ]; then
2728 case "$cur" in
2729 --*) __gitcomp "
2730 --paginate
2731 --no-pager
2732 --git-dir=
2733 --bare
2734 --version
2735 --exec-path
2736 --html-path
2737 --work-tree=
2738 --help
2739 "
2740 ;;
2741 *) __git_compute_porcelain_commands
2742 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2743 esac
2744 return
2745 fi
2746
2747 local completion_func="_git_${command//-/_}"
2748 declare -f $completion_func >/dev/null && $completion_func && return
2749
2750 local expansion=$(__git_aliased_command "$command")
2751 if [ -n "$expansion" ]; then
2752 completion_func="_git_${expansion//-/_}"
2753 declare -f $completion_func >/dev/null && $completion_func
2754 fi
2755}
2756
2757_gitk ()
2758{
2759 if [[ -n ${ZSH_VERSION-} ]]; then
2760 emulate -L bash
2761 setopt KSH_TYPESET
2762 fi
2763
2764 __git_has_doubledash && return
2765
2766 local cur
2767 local g="$(__gitdir)"
2768 local merge=""
2769 if [ -f "$g/MERGE_HEAD" ]; then
2770 merge="--merge"
2771 fi
2772 _get_comp_words_by_ref -n =: cur
2773 case "$cur" in
2774 --*)
2775 __gitcomp "
2776 $__git_log_common_options
2777 $__git_log_gitk_options
2778 $merge
2779 "
2780 return
2781 ;;
2782 esac
2783 __git_complete_revlist
2784}
2785
2786complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2787 || complete -o default -o nospace -F _git git
2788complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2789 || complete -o default -o nospace -F _gitk gitk
2790
2791# The following are necessary only for Cygwin, and only are needed
2792# when the user has tab-completed the executable name and consequently
2793# included the '.exe' suffix.
2794#
2795if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2796complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2797 || complete -o default -o nospace -F _git git.exe
2798fi
2799
2800if [[ -n ${ZSH_VERSION-} ]]; then
2801 shopt () {
2802 local option
2803 if [ $# -ne 2 ]; then
2804 echo "USAGE: $0 (-q|-s|-u) <option>" >&2
2805 return 1
2806 fi
2807 case "$2" in
2808 nullglob)
2809 option="$2"
2810 ;;
2811 *)
2812 echo "$0: invalid option: $2" >&2
2813 return 1
2814 esac
2815 case "$1" in
2816 -q) setopt | grep -q "$option" ;;
2817 -u) unsetopt "$option" ;;
2818 -s) setopt "$option" ;;
2819 *)
2820 echo "$0: invalid flag: $1" >&2
2821 return 1
2822 esac
2823 }
2824fi