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