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