]> git.ipfire.org Git - thirdparty/git.git/blob - contrib/completion/git-completion.bash
Merge branch 'mg/tracked-local-branches'
[thirdparty/git.git] / contrib / completion / git-completion.bash
1 #!bash
2 #
3 # bash completion support for core Git.
4 #
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
8 #
9 # The contained completion routines provide support for completing:
10 #
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) common --long-options
17 #
18 # To use these routines:
19 #
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Added the following line to your .bashrc:
22 # source ~/.git-completion.sh
23 #
24 # 3) You may want to make sure the git executable is available
25 # in your PATH before this script is sourced, as some caching
26 # is performed while the script loads. If git isn't found
27 # at source time then all lookups will be done on demand,
28 # which may be slightly slower.
29 #
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32 #
33 # The argument to __git_ps1 will be displayed only if you
34 # are currently in a git repository. The %s token will be
35 # the name of the current branch.
36 #
37 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38 # value, unstaged (*) and staged (+) changes will be shown next
39 # to the branch name. You can configure this per-repository
40 # with the bash.showDirtyState variable, which defaults to true
41 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
42 #
43 # To submit patches:
44 #
45 # *) Read Documentation/SubmittingPatches
46 # *) Send all patches to the current maintainer:
47 #
48 # "Shawn O. Pearce" <spearce@spearce.org>
49 #
50 # *) Always CC the Git mailing list:
51 #
52 # git@vger.kernel.org
53 #
54
55 case "$COMP_WORDBREAKS" in
56 *:*) : great ;;
57 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
58 esac
59
60 # __gitdir accepts 0 or 1 arguments (i.e., location)
61 # returns location of .git repo
62 __gitdir ()
63 {
64 if [ -z "${1-}" ]; then
65 if [ -n "${__git_dir-}" ]; then
66 echo "$__git_dir"
67 elif [ -d .git ]; then
68 echo .git
69 else
70 git rev-parse --git-dir 2>/dev/null
71 fi
72 elif [ -d "$1/.git" ]; then
73 echo "$1/.git"
74 else
75 echo "$1"
76 fi
77 }
78
79 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80 # returns text to add to bash PS1 prompt (includes branch name)
81 __git_ps1 ()
82 {
83 local g="$(__gitdir)"
84 if [ -n "$g" ]; then
85 local r
86 local b
87 if [ -d "$g/rebase-apply" ]; then
88 if [ -f "$g/rebase-apply/rebasing" ]; then
89 r="|REBASE"
90 elif [ -f "$g/rebase-apply/applying" ]; then
91 r="|AM"
92 else
93 r="|AM/REBASE"
94 fi
95 b="$(git symbolic-ref HEAD 2>/dev/null)"
96 elif [ -f "$g/rebase-merge/interactive" ]; then
97 r="|REBASE-i"
98 b="$(cat "$g/rebase-merge/head-name")"
99 elif [ -d "$g/rebase-merge" ]; then
100 r="|REBASE-m"
101 b="$(cat "$g/rebase-merge/head-name")"
102 elif [ -f "$g/MERGE_HEAD" ]; then
103 r="|MERGING"
104 b="$(git symbolic-ref HEAD 2>/dev/null)"
105 else
106 if [ -f "$g/BISECT_LOG" ]; then
107 r="|BISECTING"
108 fi
109 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"; then
110 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"; then
111 if [ -r "$g/HEAD" ]; then
112 b="$(cut -c1-7 "$g/HEAD")..."
113 fi
114 fi
115 fi
116 fi
117
118 local w
119 local i
120 local c
121
122 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
123 if [ "true" = "$(git config --bool core.bare 2>/dev/null)" ]; then
124 c="BARE:"
125 else
126 b="GIT_DIR!"
127 fi
128 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
129 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
130 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
131 git diff --no-ext-diff --ignore-submodules \
132 --quiet --exit-code || w="*"
133 if git rev-parse --quiet --verify HEAD >/dev/null; then
134 git diff-index --cached --quiet \
135 --ignore-submodules HEAD -- || i="+"
136 else
137 i="#"
138 fi
139 fi
140 fi
141 fi
142
143 if [ -n "$b" ]; then
144 if [ -n "${1-}" ]; then
145 printf "$1" "$c${b##refs/heads/}$w$i$r"
146 else
147 printf " (%s)" "$c${b##refs/heads/}$w$i$r"
148 fi
149 fi
150 fi
151 }
152
153 # __gitcomp_1 requires 2 arguments
154 __gitcomp_1 ()
155 {
156 local c IFS=' '$'\t'$'\n'
157 for c in $1; do
158 case "$c$2" in
159 --*=*) printf %s$'\n' "$c$2" ;;
160 *.) printf %s$'\n' "$c$2" ;;
161 *) printf %s$'\n' "$c$2 " ;;
162 esac
163 done
164 }
165
166 # __gitcomp accepts 1, 2, 3, or 4 arguments
167 # generates completion reply with compgen
168 __gitcomp ()
169 {
170 local cur="${COMP_WORDS[COMP_CWORD]}"
171 if [ $# -gt 2 ]; then
172 cur="$3"
173 fi
174 case "$cur" in
175 --*=)
176 COMPREPLY=()
177 ;;
178 *)
179 local IFS=$'\n'
180 COMPREPLY=($(compgen -P "${2-}" \
181 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
182 -- "$cur"))
183 ;;
184 esac
185 }
186
187 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
188 __git_heads ()
189 {
190 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
191 if [ -d "$dir" ]; then
192 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
193 refs/heads
194 return
195 fi
196 for i in $(git ls-remote "${1-}" 2>/dev/null); do
197 case "$is_hash,$i" in
198 y,*) is_hash=n ;;
199 n,*^{}) is_hash=y ;;
200 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
201 n,*) is_hash=y; echo "$i" ;;
202 esac
203 done
204 }
205
206 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
207 __git_tags ()
208 {
209 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
210 if [ -d "$dir" ]; then
211 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
212 refs/tags
213 return
214 fi
215 for i in $(git ls-remote "${1-}" 2>/dev/null); do
216 case "$is_hash,$i" in
217 y,*) is_hash=n ;;
218 n,*^{}) is_hash=y ;;
219 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
220 n,*) is_hash=y; echo "$i" ;;
221 esac
222 done
223 }
224
225 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
226 __git_refs ()
227 {
228 local i is_hash=y dir="$(__gitdir "${1-}")"
229 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
230 if [ -d "$dir" ]; then
231 case "$cur" in
232 refs|refs/*)
233 format="refname"
234 refs="${cur%/*}"
235 ;;
236 *)
237 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
238 format="refname:short"
239 refs="refs/tags refs/heads refs/remotes"
240 ;;
241 esac
242 git --git-dir="$dir" for-each-ref --format="%($format)" \
243 $refs
244 return
245 fi
246 for i in $(git ls-remote "$dir" 2>/dev/null); do
247 case "$is_hash,$i" in
248 y,*) is_hash=n ;;
249 n,*^{}) is_hash=y ;;
250 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
251 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
252 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
253 n,*) is_hash=y; echo "$i" ;;
254 esac
255 done
256 }
257
258 # __git_refs2 requires 1 argument (to pass to __git_refs)
259 __git_refs2 ()
260 {
261 local i
262 for i in $(__git_refs "$1"); do
263 echo "$i:$i"
264 done
265 }
266
267 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
268 __git_refs_remotes ()
269 {
270 local cmd i is_hash=y
271 for i in $(git ls-remote "$1" 2>/dev/null); do
272 case "$is_hash,$i" in
273 n,refs/heads/*)
274 is_hash=y
275 echo "$i:refs/remotes/$1/${i#refs/heads/}"
276 ;;
277 y,*) is_hash=n ;;
278 n,*^{}) is_hash=y ;;
279 n,refs/tags/*) is_hash=y;;
280 n,*) is_hash=y; ;;
281 esac
282 done
283 }
284
285 __git_remotes ()
286 {
287 local i ngoff IFS=$'\n' d="$(__gitdir)"
288 shopt -q nullglob || ngoff=1
289 shopt -s nullglob
290 for i in "$d/remotes"/*; do
291 echo ${i#$d/remotes/}
292 done
293 [ "$ngoff" ] && shopt -u nullglob
294 for i in $(git --git-dir="$d" config --list); do
295 case "$i" in
296 remote.*.url=*)
297 i="${i#remote.}"
298 echo "${i/.url=*/}"
299 ;;
300 esac
301 done
302 }
303
304 __git_merge_strategies ()
305 {
306 if [ -n "${__git_merge_strategylist-}" ]; then
307 echo "$__git_merge_strategylist"
308 return
309 fi
310 git merge -s help 2>&1 |
311 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
312 s/\.$//
313 s/.*://
314 s/^[ ]*//
315 s/[ ]*$//
316 p
317 }'
318 }
319 __git_merge_strategylist=
320 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
321
322 __git_complete_file ()
323 {
324 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
325 case "$cur" in
326 ?*:*)
327 ref="${cur%%:*}"
328 cur="${cur#*:}"
329 case "$cur" in
330 ?*/*)
331 pfx="${cur%/*}"
332 cur="${cur##*/}"
333 ls="$ref:$pfx"
334 pfx="$pfx/"
335 ;;
336 *)
337 ls="$ref"
338 ;;
339 esac
340
341 case "$COMP_WORDBREAKS" in
342 *:*) : great ;;
343 *) pfx="$ref:$pfx" ;;
344 esac
345
346 local IFS=$'\n'
347 COMPREPLY=($(compgen -P "$pfx" \
348 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
349 | sed '/^100... blob /{
350 s,^.* ,,
351 s,$, ,
352 }
353 /^120000 blob /{
354 s,^.* ,,
355 s,$, ,
356 }
357 /^040000 tree /{
358 s,^.* ,,
359 s,$,/,
360 }
361 s/^.* //')" \
362 -- "$cur"))
363 ;;
364 *)
365 __gitcomp "$(__git_refs)"
366 ;;
367 esac
368 }
369
370 __git_complete_revlist ()
371 {
372 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
373 case "$cur" in
374 *...*)
375 pfx="${cur%...*}..."
376 cur="${cur#*...}"
377 __gitcomp "$(__git_refs)" "$pfx" "$cur"
378 ;;
379 *..*)
380 pfx="${cur%..*}.."
381 cur="${cur#*..}"
382 __gitcomp "$(__git_refs)" "$pfx" "$cur"
383 ;;
384 *)
385 __gitcomp "$(__git_refs)"
386 ;;
387 esac
388 }
389
390 __git_complete_remote_or_refspec ()
391 {
392 local cmd="${COMP_WORDS[1]}"
393 local cur="${COMP_WORDS[COMP_CWORD]}"
394 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
395 while [ $c -lt $COMP_CWORD ]; do
396 i="${COMP_WORDS[c]}"
397 case "$i" in
398 --all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
399 -*) ;;
400 *) remote="$i"; break ;;
401 esac
402 c=$((++c))
403 done
404 if [ -z "$remote" ]; then
405 __gitcomp "$(__git_remotes)"
406 return
407 fi
408 if [ $no_complete_refspec = 1 ]; then
409 COMPREPLY=()
410 return
411 fi
412 [ "$remote" = "." ] && remote=
413 case "$cur" in
414 *:*)
415 case "$COMP_WORDBREAKS" in
416 *:*) : great ;;
417 *) pfx="${cur%%:*}:" ;;
418 esac
419 cur="${cur#*:}"
420 lhs=0
421 ;;
422 +*)
423 pfx="+"
424 cur="${cur#+}"
425 ;;
426 esac
427 case "$cmd" in
428 fetch)
429 if [ $lhs = 1 ]; then
430 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
431 else
432 __gitcomp "$(__git_refs)" "$pfx" "$cur"
433 fi
434 ;;
435 pull)
436 if [ $lhs = 1 ]; then
437 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
438 else
439 __gitcomp "$(__git_refs)" "$pfx" "$cur"
440 fi
441 ;;
442 push)
443 if [ $lhs = 1 ]; then
444 __gitcomp "$(__git_refs)" "$pfx" "$cur"
445 else
446 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
447 fi
448 ;;
449 esac
450 }
451
452 __git_complete_strategy ()
453 {
454 case "${COMP_WORDS[COMP_CWORD-1]}" in
455 -s|--strategy)
456 __gitcomp "$(__git_merge_strategies)"
457 return 0
458 esac
459 local cur="${COMP_WORDS[COMP_CWORD]}"
460 case "$cur" in
461 --strategy=*)
462 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
463 return 0
464 ;;
465 esac
466 return 1
467 }
468
469 __git_all_commands ()
470 {
471 if [ -n "${__git_all_commandlist-}" ]; then
472 echo "$__git_all_commandlist"
473 return
474 fi
475 local i IFS=" "$'\n'
476 for i in $(git help -a|egrep '^ ')
477 do
478 case $i in
479 *--*) : helper pattern;;
480 *) echo $i;;
481 esac
482 done
483 }
484 __git_all_commandlist=
485 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
486
487 __git_porcelain_commands ()
488 {
489 if [ -n "${__git_porcelain_commandlist-}" ]; then
490 echo "$__git_porcelain_commandlist"
491 return
492 fi
493 local i IFS=" "$'\n'
494 for i in "help" $(__git_all_commands)
495 do
496 case $i in
497 *--*) : helper pattern;;
498 applymbox) : ask gittus;;
499 applypatch) : ask gittus;;
500 archimport) : import;;
501 cat-file) : plumbing;;
502 check-attr) : plumbing;;
503 check-ref-format) : plumbing;;
504 checkout-index) : plumbing;;
505 commit-tree) : plumbing;;
506 count-objects) : infrequent;;
507 cvsexportcommit) : export;;
508 cvsimport) : import;;
509 cvsserver) : daemon;;
510 daemon) : daemon;;
511 diff-files) : plumbing;;
512 diff-index) : plumbing;;
513 diff-tree) : plumbing;;
514 fast-import) : import;;
515 fast-export) : export;;
516 fsck-objects) : plumbing;;
517 fetch-pack) : plumbing;;
518 fmt-merge-msg) : plumbing;;
519 for-each-ref) : plumbing;;
520 hash-object) : plumbing;;
521 http-*) : transport;;
522 index-pack) : plumbing;;
523 init-db) : deprecated;;
524 local-fetch) : plumbing;;
525 lost-found) : infrequent;;
526 ls-files) : plumbing;;
527 ls-remote) : plumbing;;
528 ls-tree) : plumbing;;
529 mailinfo) : plumbing;;
530 mailsplit) : plumbing;;
531 merge-*) : plumbing;;
532 mktree) : plumbing;;
533 mktag) : plumbing;;
534 pack-objects) : plumbing;;
535 pack-redundant) : plumbing;;
536 pack-refs) : plumbing;;
537 parse-remote) : plumbing;;
538 patch-id) : plumbing;;
539 peek-remote) : plumbing;;
540 prune) : plumbing;;
541 prune-packed) : plumbing;;
542 quiltimport) : import;;
543 read-tree) : plumbing;;
544 receive-pack) : plumbing;;
545 reflog) : plumbing;;
546 repo-config) : deprecated;;
547 rerere) : plumbing;;
548 rev-list) : plumbing;;
549 rev-parse) : plumbing;;
550 runstatus) : plumbing;;
551 sh-setup) : internal;;
552 shell) : daemon;;
553 show-ref) : plumbing;;
554 send-pack) : plumbing;;
555 show-index) : plumbing;;
556 ssh-*) : transport;;
557 stripspace) : plumbing;;
558 symbolic-ref) : plumbing;;
559 tar-tree) : deprecated;;
560 unpack-file) : plumbing;;
561 unpack-objects) : plumbing;;
562 update-index) : plumbing;;
563 update-ref) : plumbing;;
564 update-server-info) : daemon;;
565 upload-archive) : plumbing;;
566 upload-pack) : plumbing;;
567 write-tree) : plumbing;;
568 var) : infrequent;;
569 verify-pack) : infrequent;;
570 verify-tag) : plumbing;;
571 *) echo $i;;
572 esac
573 done
574 }
575 __git_porcelain_commandlist=
576 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
577
578 __git_aliases ()
579 {
580 local i IFS=$'\n'
581 for i in $(git --git-dir="$(__gitdir)" config --list); do
582 case "$i" in
583 alias.*)
584 i="${i#alias.}"
585 echo "${i/=*/}"
586 ;;
587 esac
588 done
589 }
590
591 # __git_aliased_command requires 1 argument
592 __git_aliased_command ()
593 {
594 local word cmdline=$(git --git-dir="$(__gitdir)" \
595 config --get "alias.$1")
596 for word in $cmdline; do
597 if [ "${word##-*}" ]; then
598 echo $word
599 return
600 fi
601 done
602 }
603
604 # __git_find_subcommand requires 1 argument
605 __git_find_subcommand ()
606 {
607 local word subcommand c=1
608
609 while [ $c -lt $COMP_CWORD ]; do
610 word="${COMP_WORDS[c]}"
611 for subcommand in $1; do
612 if [ "$subcommand" = "$word" ]; then
613 echo "$subcommand"
614 return
615 fi
616 done
617 c=$((++c))
618 done
619 }
620
621 __git_has_doubledash ()
622 {
623 local c=1
624 while [ $c -lt $COMP_CWORD ]; do
625 if [ "--" = "${COMP_WORDS[c]}" ]; then
626 return 0
627 fi
628 c=$((++c))
629 done
630 return 1
631 }
632
633 __git_whitespacelist="nowarn warn error error-all fix"
634
635 _git_am ()
636 {
637 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
638 if [ -d "$dir"/rebase-apply ]; then
639 __gitcomp "--skip --resolved --abort"
640 return
641 fi
642 case "$cur" in
643 --whitespace=*)
644 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
645 return
646 ;;
647 --*)
648 __gitcomp "
649 --3way --committer-date-is-author-date --ignore-date
650 --interactive --keep --no-utf8 --signoff --utf8
651 --whitespace=
652 "
653 return
654 esac
655 COMPREPLY=()
656 }
657
658 _git_apply ()
659 {
660 local cur="${COMP_WORDS[COMP_CWORD]}"
661 case "$cur" in
662 --whitespace=*)
663 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
664 return
665 ;;
666 --*)
667 __gitcomp "
668 --stat --numstat --summary --check --index
669 --cached --index-info --reverse --reject --unidiff-zero
670 --apply --no-add --exclude=
671 --whitespace= --inaccurate-eof --verbose
672 "
673 return
674 esac
675 COMPREPLY=()
676 }
677
678 _git_add ()
679 {
680 __git_has_doubledash && return
681
682 local cur="${COMP_WORDS[COMP_CWORD]}"
683 case "$cur" in
684 --*)
685 __gitcomp "
686 --interactive --refresh --patch --update --dry-run
687 --ignore-errors --intent-to-add
688 "
689 return
690 esac
691 COMPREPLY=()
692 }
693
694 _git_archive ()
695 {
696 local cur="${COMP_WORDS[COMP_CWORD]}"
697 case "$cur" in
698 --format=*)
699 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
700 return
701 ;;
702 --remote=*)
703 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
704 return
705 ;;
706 --*)
707 __gitcomp "
708 --format= --list --verbose
709 --prefix= --remote= --exec=
710 "
711 return
712 ;;
713 esac
714 __git_complete_file
715 }
716
717 _git_bisect ()
718 {
719 __git_has_doubledash && return
720
721 local subcommands="start bad good skip reset visualize replay log run"
722 local subcommand="$(__git_find_subcommand "$subcommands")"
723 if [ -z "$subcommand" ]; then
724 __gitcomp "$subcommands"
725 return
726 fi
727
728 case "$subcommand" in
729 bad|good|reset|skip)
730 __gitcomp "$(__git_refs)"
731 ;;
732 *)
733 COMPREPLY=()
734 ;;
735 esac
736 }
737
738 _git_branch ()
739 {
740 local i c=1 only_local_ref="n" has_r="n"
741
742 while [ $c -lt $COMP_CWORD ]; do
743 i="${COMP_WORDS[c]}"
744 case "$i" in
745 -d|-m) only_local_ref="y" ;;
746 -r) has_r="y" ;;
747 esac
748 c=$((++c))
749 done
750
751 case "${COMP_WORDS[COMP_CWORD]}" in
752 --*)
753 __gitcomp "
754 --color --no-color --verbose --abbrev= --no-abbrev
755 --track --no-track --contains --merged --no-merged
756 "
757 ;;
758 *)
759 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
760 __gitcomp "$(__git_heads)"
761 else
762 __gitcomp "$(__git_refs)"
763 fi
764 ;;
765 esac
766 }
767
768 _git_bundle ()
769 {
770 local cmd="${COMP_WORDS[2]}"
771 case "$COMP_CWORD" in
772 2)
773 __gitcomp "create list-heads verify unbundle"
774 ;;
775 3)
776 # looking for a file
777 ;;
778 *)
779 case "$cmd" in
780 create)
781 __git_complete_revlist
782 ;;
783 esac
784 ;;
785 esac
786 }
787
788 _git_checkout ()
789 {
790 __git_has_doubledash && return
791
792 __gitcomp "$(__git_refs)"
793 }
794
795 _git_cherry ()
796 {
797 __gitcomp "$(__git_refs)"
798 }
799
800 _git_cherry_pick ()
801 {
802 local cur="${COMP_WORDS[COMP_CWORD]}"
803 case "$cur" in
804 --*)
805 __gitcomp "--edit --no-commit"
806 ;;
807 *)
808 __gitcomp "$(__git_refs)"
809 ;;
810 esac
811 }
812
813 _git_clean ()
814 {
815 __git_has_doubledash && return
816
817 local cur="${COMP_WORDS[COMP_CWORD]}"
818 case "$cur" in
819 --*)
820 __gitcomp "--dry-run --quiet"
821 return
822 ;;
823 esac
824 COMPREPLY=()
825 }
826
827 _git_clone ()
828 {
829 local cur="${COMP_WORDS[COMP_CWORD]}"
830 case "$cur" in
831 --*)
832 __gitcomp "
833 --local
834 --no-hardlinks
835 --shared
836 --reference
837 --quiet
838 --no-checkout
839 --bare
840 --mirror
841 --origin
842 --upload-pack
843 --template=
844 --depth
845 "
846 return
847 ;;
848 esac
849 COMPREPLY=()
850 }
851
852 _git_commit ()
853 {
854 __git_has_doubledash && return
855
856 local cur="${COMP_WORDS[COMP_CWORD]}"
857 case "$cur" in
858 --*)
859 __gitcomp "
860 --all --author= --signoff --verify --no-verify
861 --edit --amend --include --only --interactive
862 "
863 return
864 esac
865 COMPREPLY=()
866 }
867
868 _git_describe ()
869 {
870 local cur="${COMP_WORDS[COMP_CWORD]}"
871 case "$cur" in
872 --*)
873 __gitcomp "
874 --all --tags --contains --abbrev= --candidates=
875 --exact-match --debug --long --match --always
876 "
877 return
878 esac
879 __gitcomp "$(__git_refs)"
880 }
881
882 __git_diff_common_options="--stat --numstat --shortstat --summary
883 --patch-with-stat --name-only --name-status --color
884 --no-color --color-words --no-renames --check
885 --full-index --binary --abbrev --diff-filter=
886 --find-copies-harder
887 --text --ignore-space-at-eol --ignore-space-change
888 --ignore-all-space --exit-code --quiet --ext-diff
889 --no-ext-diff
890 --no-prefix --src-prefix= --dst-prefix=
891 --inter-hunk-context=
892 --patience
893 --raw
894 "
895
896 _git_diff ()
897 {
898 __git_has_doubledash && return
899
900 local cur="${COMP_WORDS[COMP_CWORD]}"
901 case "$cur" in
902 --*)
903 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
904 --base --ours --theirs
905 $__git_diff_common_options
906 "
907 return
908 ;;
909 esac
910 __git_complete_file
911 }
912
913 __git_fetch_options="
914 --quiet --verbose --append --upload-pack --force --keep --depth=
915 --tags --no-tags
916 "
917
918 _git_fetch ()
919 {
920 local cur="${COMP_WORDS[COMP_CWORD]}"
921 case "$cur" in
922 --*)
923 __gitcomp "$__git_fetch_options"
924 return
925 ;;
926 esac
927 __git_complete_remote_or_refspec
928 }
929
930 _git_format_patch ()
931 {
932 local cur="${COMP_WORDS[COMP_CWORD]}"
933 case "$cur" in
934 --thread=*)
935 __gitcomp "
936 deep shallow
937 " "" "${cur##--thread=}"
938 return
939 ;;
940 --*)
941 __gitcomp "
942 --stdout --attach --no-attach --thread --thread=
943 --output-directory
944 --numbered --start-number
945 --numbered-files
946 --keep-subject
947 --signoff
948 --in-reply-to= --cc=
949 --full-index --binary
950 --not --all
951 --cover-letter
952 --no-prefix --src-prefix= --dst-prefix=
953 --inline --suffix= --ignore-if-in-upstream
954 --subject-prefix=
955 "
956 return
957 ;;
958 esac
959 __git_complete_revlist
960 }
961
962 _git_fsck ()
963 {
964 local cur="${COMP_WORDS[COMP_CWORD]}"
965 case "$cur" in
966 --*)
967 __gitcomp "
968 --tags --root --unreachable --cache --no-reflogs --full
969 --strict --verbose --lost-found
970 "
971 return
972 ;;
973 esac
974 COMPREPLY=()
975 }
976
977 _git_gc ()
978 {
979 local cur="${COMP_WORDS[COMP_CWORD]}"
980 case "$cur" in
981 --*)
982 __gitcomp "--prune --aggressive"
983 return
984 ;;
985 esac
986 COMPREPLY=()
987 }
988
989 _git_grep ()
990 {
991 __git_has_doubledash && return
992
993 local cur="${COMP_WORDS[COMP_CWORD]}"
994 case "$cur" in
995 --*)
996 __gitcomp "
997 --cached
998 --text --ignore-case --word-regexp --invert-match
999 --full-name
1000 --extended-regexp --basic-regexp --fixed-strings
1001 --files-with-matches --name-only
1002 --files-without-match
1003 --count
1004 --and --or --not --all-match
1005 "
1006 return
1007 ;;
1008 esac
1009 COMPREPLY=()
1010 }
1011
1012 _git_help ()
1013 {
1014 local cur="${COMP_WORDS[COMP_CWORD]}"
1015 case "$cur" in
1016 --*)
1017 __gitcomp "--all --info --man --web"
1018 return
1019 ;;
1020 esac
1021 __gitcomp "$(__git_all_commands)
1022 attributes cli core-tutorial cvs-migration
1023 diffcore gitk glossary hooks ignore modules
1024 repository-layout tutorial tutorial-2
1025 workflows
1026 "
1027 }
1028
1029 _git_init ()
1030 {
1031 local cur="${COMP_WORDS[COMP_CWORD]}"
1032 case "$cur" in
1033 --shared=*)
1034 __gitcomp "
1035 false true umask group all world everybody
1036 " "" "${cur##--shared=}"
1037 return
1038 ;;
1039 --*)
1040 __gitcomp "--quiet --bare --template= --shared --shared="
1041 return
1042 ;;
1043 esac
1044 COMPREPLY=()
1045 }
1046
1047 _git_ls_files ()
1048 {
1049 __git_has_doubledash && return
1050
1051 local cur="${COMP_WORDS[COMP_CWORD]}"
1052 case "$cur" in
1053 --*)
1054 __gitcomp "--cached --deleted --modified --others --ignored
1055 --stage --directory --no-empty-directory --unmerged
1056 --killed --exclude= --exclude-from=
1057 --exclude-per-directory= --exclude-standard
1058 --error-unmatch --with-tree= --full-name
1059 --abbrev --ignored --exclude-per-directory
1060 "
1061 return
1062 ;;
1063 esac
1064 COMPREPLY=()
1065 }
1066
1067 _git_ls_remote ()
1068 {
1069 __gitcomp "$(__git_remotes)"
1070 }
1071
1072 _git_ls_tree ()
1073 {
1074 __git_complete_file
1075 }
1076
1077 # Options that go well for log, shortlog and gitk
1078 __git_log_common_options="
1079 --not --all
1080 --branches --tags --remotes
1081 --first-parent --no-merges
1082 --max-count=
1083 --max-age= --since= --after=
1084 --min-age= --until= --before=
1085 "
1086 # Options that go well for log and gitk (not shortlog)
1087 __git_log_gitk_options="
1088 --dense --sparse --full-history
1089 --simplify-merges --simplify-by-decoration
1090 --left-right
1091 "
1092 # Options that go well for log and shortlog (not gitk)
1093 __git_log_shortlog_options="
1094 --author= --committer= --grep=
1095 --all-match
1096 "
1097
1098 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1099
1100 _git_log ()
1101 {
1102 __git_has_doubledash && return
1103
1104 local cur="${COMP_WORDS[COMP_CWORD]}"
1105 local g="$(git rev-parse --git-dir 2>/dev/null)"
1106 local merge=""
1107 if [ -f "$g/MERGE_HEAD" ]; then
1108 merge="--merge"
1109 fi
1110 case "$cur" in
1111 --pretty=*)
1112 __gitcomp "$__git_log_pretty_formats
1113 " "" "${cur##--pretty=}"
1114 return
1115 ;;
1116 --format=*)
1117 __gitcomp "$__git_log_pretty_formats
1118 " "" "${cur##--format=}"
1119 return
1120 ;;
1121 --date=*)
1122 __gitcomp "
1123 relative iso8601 rfc2822 short local default
1124 " "" "${cur##--date=}"
1125 return
1126 ;;
1127 --*)
1128 __gitcomp "
1129 $__git_log_common_options
1130 $__git_log_shortlog_options
1131 $__git_log_gitk_options
1132 --root --topo-order --date-order --reverse
1133 --follow
1134 --abbrev-commit --abbrev=
1135 --relative-date --date=
1136 --pretty= --format= --oneline
1137 --cherry-pick
1138 --graph
1139 --decorate
1140 --walk-reflogs
1141 --parents --children
1142 $merge
1143 $__git_diff_common_options
1144 --pickaxe-all --pickaxe-regex
1145 "
1146 return
1147 ;;
1148 esac
1149 __git_complete_revlist
1150 }
1151
1152 __git_merge_options="
1153 --no-commit --no-stat --log --no-log --squash --strategy
1154 --commit --stat --no-squash --ff --no-ff
1155 "
1156
1157 _git_merge ()
1158 {
1159 __git_complete_strategy && return
1160
1161 local cur="${COMP_WORDS[COMP_CWORD]}"
1162 case "$cur" in
1163 --*)
1164 __gitcomp "$__git_merge_options"
1165 return
1166 esac
1167 __gitcomp "$(__git_refs)"
1168 }
1169
1170 _git_mergetool ()
1171 {
1172 local cur="${COMP_WORDS[COMP_CWORD]}"
1173 case "$cur" in
1174 --tool=*)
1175 __gitcomp "
1176 kdiff3 tkdiff meld xxdiff emerge
1177 vimdiff gvimdiff ecmerge opendiff
1178 " "" "${cur##--tool=}"
1179 return
1180 ;;
1181 --*)
1182 __gitcomp "--tool="
1183 return
1184 ;;
1185 esac
1186 COMPREPLY=()
1187 }
1188
1189 _git_merge_base ()
1190 {
1191 __gitcomp "$(__git_refs)"
1192 }
1193
1194 _git_mv ()
1195 {
1196 local cur="${COMP_WORDS[COMP_CWORD]}"
1197 case "$cur" in
1198 --*)
1199 __gitcomp "--dry-run"
1200 return
1201 ;;
1202 esac
1203 COMPREPLY=()
1204 }
1205
1206 _git_name_rev ()
1207 {
1208 __gitcomp "--tags --all --stdin"
1209 }
1210
1211 _git_pull ()
1212 {
1213 __git_complete_strategy && return
1214
1215 local cur="${COMP_WORDS[COMP_CWORD]}"
1216 case "$cur" in
1217 --*)
1218 __gitcomp "
1219 --rebase --no-rebase
1220 $__git_merge_options
1221 $__git_fetch_options
1222 "
1223 return
1224 ;;
1225 esac
1226 __git_complete_remote_or_refspec
1227 }
1228
1229 _git_push ()
1230 {
1231 local cur="${COMP_WORDS[COMP_CWORD]}"
1232 case "${COMP_WORDS[COMP_CWORD-1]}" in
1233 --repo)
1234 __gitcomp "$(__git_remotes)"
1235 return
1236 esac
1237 case "$cur" in
1238 --repo=*)
1239 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1240 return
1241 ;;
1242 --*)
1243 __gitcomp "
1244 --all --mirror --tags --dry-run --force --verbose
1245 --receive-pack= --repo=
1246 "
1247 return
1248 ;;
1249 esac
1250 __git_complete_remote_or_refspec
1251 }
1252
1253 _git_rebase ()
1254 {
1255 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1256 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1257 __gitcomp "--continue --skip --abort"
1258 return
1259 fi
1260 __git_complete_strategy && return
1261 case "$cur" in
1262 --*)
1263 __gitcomp "--onto --merge --strategy --interactive"
1264 return
1265 esac
1266 __gitcomp "$(__git_refs)"
1267 }
1268
1269 _git_send_email ()
1270 {
1271 local cur="${COMP_WORDS[COMP_CWORD]}"
1272 case "$cur" in
1273 --*)
1274 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1275 --compose --dry-run --envelope-sender --from --identity
1276 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1277 --no-suppress-from --no-thread --quiet
1278 --signed-off-by-cc --smtp-pass --smtp-server
1279 --smtp-server-port --smtp-ssl --smtp-user --subject
1280 --suppress-cc --suppress-from --thread --to
1281 --validate --no-validate"
1282 return
1283 ;;
1284 esac
1285 COMPREPLY=()
1286 }
1287
1288 _git_config ()
1289 {
1290 local cur="${COMP_WORDS[COMP_CWORD]}"
1291 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1292 case "$prv" in
1293 branch.*.remote)
1294 __gitcomp "$(__git_remotes)"
1295 return
1296 ;;
1297 branch.*.merge)
1298 __gitcomp "$(__git_refs)"
1299 return
1300 ;;
1301 remote.*.fetch)
1302 local remote="${prv#remote.}"
1303 remote="${remote%.fetch}"
1304 __gitcomp "$(__git_refs_remotes "$remote")"
1305 return
1306 ;;
1307 remote.*.push)
1308 local remote="${prv#remote.}"
1309 remote="${remote%.push}"
1310 __gitcomp "$(git --git-dir="$(__gitdir)" \
1311 for-each-ref --format='%(refname):%(refname)' \
1312 refs/heads)"
1313 return
1314 ;;
1315 pull.twohead|pull.octopus)
1316 __gitcomp "$(__git_merge_strategies)"
1317 return
1318 ;;
1319 color.branch|color.diff|color.interactive|color.status|color.ui)
1320 __gitcomp "always never auto"
1321 return
1322 ;;
1323 color.pager)
1324 __gitcomp "false true"
1325 return
1326 ;;
1327 color.*.*)
1328 __gitcomp "
1329 normal black red green yellow blue magenta cyan white
1330 bold dim ul blink reverse
1331 "
1332 return
1333 ;;
1334 *.*)
1335 COMPREPLY=()
1336 return
1337 ;;
1338 esac
1339 case "$cur" in
1340 --*)
1341 __gitcomp "
1342 --global --system --file=
1343 --list --replace-all
1344 --get --get-all --get-regexp
1345 --add --unset --unset-all
1346 --remove-section --rename-section
1347 "
1348 return
1349 ;;
1350 branch.*.*)
1351 local pfx="${cur%.*}."
1352 cur="${cur##*.}"
1353 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1354 return
1355 ;;
1356 branch.*)
1357 local pfx="${cur%.*}."
1358 cur="${cur#*.}"
1359 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1360 return
1361 ;;
1362 remote.*.*)
1363 local pfx="${cur%.*}."
1364 cur="${cur##*.}"
1365 __gitcomp "
1366 url proxy fetch push mirror skipDefaultUpdate
1367 receivepack uploadpack tagopt
1368 " "$pfx" "$cur"
1369 return
1370 ;;
1371 remote.*)
1372 local pfx="${cur%.*}."
1373 cur="${cur#*.}"
1374 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1375 return
1376 ;;
1377 esac
1378 __gitcomp "
1379 apply.whitespace
1380 branch.autosetupmerge
1381 branch.autosetuprebase
1382 clean.requireForce
1383 color.branch
1384 color.branch.current
1385 color.branch.local
1386 color.branch.plain
1387 color.branch.remote
1388 color.diff
1389 color.diff.commit
1390 color.diff.frag
1391 color.diff.meta
1392 color.diff.new
1393 color.diff.old
1394 color.diff.plain
1395 color.diff.whitespace
1396 color.interactive
1397 color.interactive.header
1398 color.interactive.help
1399 color.interactive.prompt
1400 color.pager
1401 color.status
1402 color.status.added
1403 color.status.changed
1404 color.status.header
1405 color.status.nobranch
1406 color.status.untracked
1407 color.status.updated
1408 color.ui
1409 commit.template
1410 core.autocrlf
1411 core.bare
1412 core.compression
1413 core.deltaBaseCacheLimit
1414 core.editor
1415 core.excludesfile
1416 core.fileMode
1417 core.fsyncobjectfiles
1418 core.gitProxy
1419 core.ignoreCygwinFSTricks
1420 core.ignoreStat
1421 core.logAllRefUpdates
1422 core.loosecompression
1423 core.packedGitLimit
1424 core.packedGitWindowSize
1425 core.pager
1426 core.preferSymlinkRefs
1427 core.preloadindex
1428 core.quotepath
1429 core.repositoryFormatVersion
1430 core.safecrlf
1431 core.sharedRepository
1432 core.symlinks
1433 core.trustctime
1434 core.warnAmbiguousRefs
1435 core.whitespace
1436 core.worktree
1437 diff.autorefreshindex
1438 diff.external
1439 diff.mnemonicprefix
1440 diff.renameLimit
1441 diff.renameLimit.
1442 diff.renames
1443 fetch.unpackLimit
1444 format.headers
1445 format.numbered
1446 format.pretty
1447 format.suffix
1448 gc.aggressiveWindow
1449 gc.auto
1450 gc.autopacklimit
1451 gc.packrefs
1452 gc.pruneexpire
1453 gc.reflogexpire
1454 gc.reflogexpireunreachable
1455 gc.rerereresolved
1456 gc.rerereunresolved
1457 gitcvs.allbinary
1458 gitcvs.dbTableNamePrefix
1459 gitcvs.dbdriver
1460 gitcvs.dbname
1461 gitcvs.dbpass
1462 gitcvs.dbuser
1463 gitcvs.enabled
1464 gitcvs.logfile
1465 gitcvs.usecrlfattr
1466 gui.blamehistoryctx
1467 gui.commitmsgwidth
1468 gui.copyblamethreshold
1469 gui.diffcontext
1470 gui.encoding
1471 gui.fastcopyblame
1472 gui.matchtrackingbranch
1473 gui.newbranchtemplate
1474 gui.pruneduringfetch
1475 gui.spellingdictionary
1476 gui.trustmtime
1477 help.autocorrect
1478 help.browser
1479 help.format
1480 http.lowSpeedLimit
1481 http.lowSpeedTime
1482 http.maxRequests
1483 http.noEPSV
1484 http.proxy
1485 http.sslCAInfo
1486 http.sslCAPath
1487 http.sslCert
1488 http.sslKey
1489 http.sslVerify
1490 i18n.commitEncoding
1491 i18n.logOutputEncoding
1492 instaweb.browser
1493 instaweb.httpd
1494 instaweb.local
1495 instaweb.modulepath
1496 instaweb.port
1497 log.date
1498 log.showroot
1499 man.viewer
1500 merge.conflictstyle
1501 merge.log
1502 merge.renameLimit
1503 merge.stat
1504 merge.tool
1505 merge.verbosity
1506 mergetool.keepBackup
1507 pack.compression
1508 pack.deltaCacheLimit
1509 pack.deltaCacheSize
1510 pack.depth
1511 pack.indexVersion
1512 pack.packSizeLimit
1513 pack.threads
1514 pack.window
1515 pack.windowMemory
1516 pull.octopus
1517 pull.twohead
1518 receive.denyCurrentBranch
1519 receive.denyDeletes
1520 receive.denyNonFastForwards
1521 receive.fsckObjects
1522 receive.unpackLimit
1523 repack.usedeltabaseoffset
1524 rerere.autoupdate
1525 rerere.enabled
1526 showbranch.default
1527 status.relativePaths
1528 status.showUntrackedFiles
1529 tar.umask
1530 transfer.unpackLimit
1531 user.email
1532 user.name
1533 user.signingkey
1534 web.browser
1535 branch. remote.
1536 "
1537 }
1538
1539 _git_remote ()
1540 {
1541 local subcommands="add rename rm show prune update set-head"
1542 local subcommand="$(__git_find_subcommand "$subcommands")"
1543 if [ -z "$subcommand" ]; then
1544 __gitcomp "$subcommands"
1545 return
1546 fi
1547
1548 case "$subcommand" in
1549 rename|rm|show|prune)
1550 __gitcomp "$(__git_remotes)"
1551 ;;
1552 update)
1553 local i c='' IFS=$'\n'
1554 for i in $(git --git-dir="$(__gitdir)" config --list); do
1555 case "$i" in
1556 remotes.*)
1557 i="${i#remotes.}"
1558 c="$c ${i/=*/}"
1559 ;;
1560 esac
1561 done
1562 __gitcomp "$c"
1563 ;;
1564 *)
1565 COMPREPLY=()
1566 ;;
1567 esac
1568 }
1569
1570 _git_reset ()
1571 {
1572 __git_has_doubledash && return
1573
1574 local cur="${COMP_WORDS[COMP_CWORD]}"
1575 case "$cur" in
1576 --*)
1577 __gitcomp "--merge --mixed --hard --soft"
1578 return
1579 ;;
1580 esac
1581 __gitcomp "$(__git_refs)"
1582 }
1583
1584 _git_revert ()
1585 {
1586 local cur="${COMP_WORDS[COMP_CWORD]}"
1587 case "$cur" in
1588 --*)
1589 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1590 return
1591 ;;
1592 esac
1593 __gitcomp "$(__git_refs)"
1594 }
1595
1596 _git_rm ()
1597 {
1598 __git_has_doubledash && return
1599
1600 local cur="${COMP_WORDS[COMP_CWORD]}"
1601 case "$cur" in
1602 --*)
1603 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1604 return
1605 ;;
1606 esac
1607 COMPREPLY=()
1608 }
1609
1610 _git_shortlog ()
1611 {
1612 __git_has_doubledash && return
1613
1614 local cur="${COMP_WORDS[COMP_CWORD]}"
1615 case "$cur" in
1616 --*)
1617 __gitcomp "
1618 $__git_log_common_options
1619 $__git_log_shortlog_options
1620 --numbered --summary
1621 "
1622 return
1623 ;;
1624 esac
1625 __git_complete_revlist
1626 }
1627
1628 _git_show ()
1629 {
1630 __git_has_doubledash && return
1631
1632 local cur="${COMP_WORDS[COMP_CWORD]}"
1633 case "$cur" in
1634 --pretty=*)
1635 __gitcomp "$__git_log_pretty_formats
1636 " "" "${cur##--pretty=}"
1637 return
1638 ;;
1639 --format=*)
1640 __gitcomp "$__git_log_pretty_formats
1641 " "" "${cur##--format=}"
1642 return
1643 ;;
1644 --*)
1645 __gitcomp "--pretty= --format=
1646 $__git_diff_common_options
1647 "
1648 return
1649 ;;
1650 esac
1651 __git_complete_file
1652 }
1653
1654 _git_show_branch ()
1655 {
1656 local cur="${COMP_WORDS[COMP_CWORD]}"
1657 case "$cur" in
1658 --*)
1659 __gitcomp "
1660 --all --remotes --topo-order --current --more=
1661 --list --independent --merge-base --no-name
1662 --sha1-name --topics --reflog
1663 "
1664 return
1665 ;;
1666 esac
1667 __git_complete_revlist
1668 }
1669
1670 _git_stash ()
1671 {
1672 local subcommands='save list show apply clear drop pop create branch'
1673 local subcommand="$(__git_find_subcommand "$subcommands")"
1674 if [ -z "$subcommand" ]; then
1675 __gitcomp "$subcommands"
1676 else
1677 local cur="${COMP_WORDS[COMP_CWORD]}"
1678 case "$subcommand,$cur" in
1679 save,--*)
1680 __gitcomp "--keep-index"
1681 ;;
1682 apply,--*)
1683 __gitcomp "--index"
1684 ;;
1685 show,--*|drop,--*|pop,--*|branch,--*)
1686 COMPREPLY=()
1687 ;;
1688 show,*|apply,*|drop,*|pop,*|branch,*)
1689 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1690 | sed -n -e 's/:.*//p')"
1691 ;;
1692 *)
1693 COMPREPLY=()
1694 ;;
1695 esac
1696 fi
1697 }
1698
1699 _git_submodule ()
1700 {
1701 __git_has_doubledash && return
1702
1703 local subcommands="add status init update summary foreach sync"
1704 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1705 local cur="${COMP_WORDS[COMP_CWORD]}"
1706 case "$cur" in
1707 --*)
1708 __gitcomp "--quiet --cached"
1709 ;;
1710 *)
1711 __gitcomp "$subcommands"
1712 ;;
1713 esac
1714 return
1715 fi
1716 }
1717
1718 _git_svn ()
1719 {
1720 local subcommands="
1721 init fetch clone rebase dcommit log find-rev
1722 set-tree commit-diff info create-ignore propget
1723 proplist show-ignore show-externals branch tag blame
1724 migrate
1725 "
1726 local subcommand="$(__git_find_subcommand "$subcommands")"
1727 if [ -z "$subcommand" ]; then
1728 __gitcomp "$subcommands"
1729 else
1730 local remote_opts="--username= --config-dir= --no-auth-cache"
1731 local fc_opts="
1732 --follow-parent --authors-file= --repack=
1733 --no-metadata --use-svm-props --use-svnsync-props
1734 --log-window-size= --no-checkout --quiet
1735 --repack-flags --use-log-author --localtime
1736 --ignore-paths= $remote_opts
1737 "
1738 local init_opts="
1739 --template= --shared= --trunk= --tags=
1740 --branches= --stdlayout --minimize-url
1741 --no-metadata --use-svm-props --use-svnsync-props
1742 --rewrite-root= --prefix= --use-log-author
1743 --add-author-from $remote_opts
1744 "
1745 local cmt_opts="
1746 --edit --rmdir --find-copies-harder --copy-similarity=
1747 "
1748
1749 local cur="${COMP_WORDS[COMP_CWORD]}"
1750 case "$subcommand,$cur" in
1751 fetch,--*)
1752 __gitcomp "--revision= --fetch-all $fc_opts"
1753 ;;
1754 clone,--*)
1755 __gitcomp "--revision= $fc_opts $init_opts"
1756 ;;
1757 init,--*)
1758 __gitcomp "$init_opts"
1759 ;;
1760 dcommit,--*)
1761 __gitcomp "
1762 --merge --strategy= --verbose --dry-run
1763 --fetch-all --no-rebase --commit-url
1764 --revision $cmt_opts $fc_opts
1765 "
1766 ;;
1767 set-tree,--*)
1768 __gitcomp "--stdin $cmt_opts $fc_opts"
1769 ;;
1770 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1771 show-externals,--*)
1772 __gitcomp "--revision="
1773 ;;
1774 log,--*)
1775 __gitcomp "
1776 --limit= --revision= --verbose --incremental
1777 --oneline --show-commit --non-recursive
1778 --authors-file= --color
1779 "
1780 ;;
1781 rebase,--*)
1782 __gitcomp "
1783 --merge --verbose --strategy= --local
1784 --fetch-all --dry-run $fc_opts
1785 "
1786 ;;
1787 commit-diff,--*)
1788 __gitcomp "--message= --file= --revision= $cmt_opts"
1789 ;;
1790 info,--*)
1791 __gitcomp "--url"
1792 ;;
1793 branch,--*)
1794 __gitcomp "--dry-run --message --tag"
1795 ;;
1796 tag,--*)
1797 __gitcomp "--dry-run --message"
1798 ;;
1799 blame,--*)
1800 __gitcomp "--git-format"
1801 ;;
1802 migrate,--*)
1803 __gitcomp "
1804 --config-dir= --ignore-paths= --minimize
1805 --no-auth-cache --username=
1806 "
1807 ;;
1808 *)
1809 COMPREPLY=()
1810 ;;
1811 esac
1812 fi
1813 }
1814
1815 _git_tag ()
1816 {
1817 local i c=1 f=0
1818 while [ $c -lt $COMP_CWORD ]; do
1819 i="${COMP_WORDS[c]}"
1820 case "$i" in
1821 -d|-v)
1822 __gitcomp "$(__git_tags)"
1823 return
1824 ;;
1825 -f)
1826 f=1
1827 ;;
1828 esac
1829 c=$((++c))
1830 done
1831
1832 case "${COMP_WORDS[COMP_CWORD-1]}" in
1833 -m|-F)
1834 COMPREPLY=()
1835 ;;
1836 -*|tag)
1837 if [ $f = 1 ]; then
1838 __gitcomp "$(__git_tags)"
1839 else
1840 COMPREPLY=()
1841 fi
1842 ;;
1843 *)
1844 __gitcomp "$(__git_refs)"
1845 ;;
1846 esac
1847 }
1848
1849 _git ()
1850 {
1851 local i c=1 command __git_dir
1852
1853 while [ $c -lt $COMP_CWORD ]; do
1854 i="${COMP_WORDS[c]}"
1855 case "$i" in
1856 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1857 --bare) __git_dir="." ;;
1858 --version|-p|--paginate) ;;
1859 --help) command="help"; break ;;
1860 *) command="$i"; break ;;
1861 esac
1862 c=$((++c))
1863 done
1864
1865 if [ -z "$command" ]; then
1866 case "${COMP_WORDS[COMP_CWORD]}" in
1867 --*) __gitcomp "
1868 --paginate
1869 --no-pager
1870 --git-dir=
1871 --bare
1872 --version
1873 --exec-path
1874 --work-tree=
1875 --help
1876 "
1877 ;;
1878 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1879 esac
1880 return
1881 fi
1882
1883 local expansion=$(__git_aliased_command "$command")
1884 [ "$expansion" ] && command="$expansion"
1885
1886 case "$command" in
1887 am) _git_am ;;
1888 add) _git_add ;;
1889 apply) _git_apply ;;
1890 archive) _git_archive ;;
1891 bisect) _git_bisect ;;
1892 bundle) _git_bundle ;;
1893 branch) _git_branch ;;
1894 checkout) _git_checkout ;;
1895 cherry) _git_cherry ;;
1896 cherry-pick) _git_cherry_pick ;;
1897 clean) _git_clean ;;
1898 clone) _git_clone ;;
1899 commit) _git_commit ;;
1900 config) _git_config ;;
1901 describe) _git_describe ;;
1902 diff) _git_diff ;;
1903 fetch) _git_fetch ;;
1904 format-patch) _git_format_patch ;;
1905 fsck) _git_fsck ;;
1906 gc) _git_gc ;;
1907 grep) _git_grep ;;
1908 help) _git_help ;;
1909 init) _git_init ;;
1910 log) _git_log ;;
1911 ls-files) _git_ls_files ;;
1912 ls-remote) _git_ls_remote ;;
1913 ls-tree) _git_ls_tree ;;
1914 merge) _git_merge;;
1915 mergetool) _git_mergetool;;
1916 merge-base) _git_merge_base ;;
1917 mv) _git_mv ;;
1918 name-rev) _git_name_rev ;;
1919 pull) _git_pull ;;
1920 push) _git_push ;;
1921 rebase) _git_rebase ;;
1922 remote) _git_remote ;;
1923 reset) _git_reset ;;
1924 revert) _git_revert ;;
1925 rm) _git_rm ;;
1926 send-email) _git_send_email ;;
1927 shortlog) _git_shortlog ;;
1928 show) _git_show ;;
1929 show-branch) _git_show_branch ;;
1930 stash) _git_stash ;;
1931 stage) _git_add ;;
1932 submodule) _git_submodule ;;
1933 svn) _git_svn ;;
1934 tag) _git_tag ;;
1935 whatchanged) _git_log ;;
1936 *) COMPREPLY=() ;;
1937 esac
1938 }
1939
1940 _gitk ()
1941 {
1942 __git_has_doubledash && return
1943
1944 local cur="${COMP_WORDS[COMP_CWORD]}"
1945 local g="$(__gitdir)"
1946 local merge=""
1947 if [ -f "$g/MERGE_HEAD" ]; then
1948 merge="--merge"
1949 fi
1950 case "$cur" in
1951 --*)
1952 __gitcomp "
1953 $__git_log_common_options
1954 $__git_log_gitk_options
1955 $merge
1956 "
1957 return
1958 ;;
1959 esac
1960 __git_complete_revlist
1961 }
1962
1963 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1964 || complete -o default -o nospace -F _git git
1965 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1966 || complete -o default -o nospace -F _gitk gitk
1967
1968 # The following are necessary only for Cygwin, and only are needed
1969 # when the user has tab-completed the executable name and consequently
1970 # included the '.exe' suffix.
1971 #
1972 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1973 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1974 || complete -o default -o nospace -F _git git.exe
1975 fi