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