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