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