Code

Merge branch 'maint' into ph/checkout
[git.git] / contrib / completion / git-completion.bash
1 #
2 # bash completion support for core Git.
3 #
4 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 # Distributed under the GNU General Public License, version 2.0.
7 #
8 # The contained completion routines provide support for completing:
9 #
10 #    *) local and remote branch names
11 #    *) local and remote tag names
12 #    *) .git/remotes file names
13 #    *) git 'subcommands'
14 #    *) tree paths within 'ref:path/to/file' expressions
15 #    *) common --long-options
16 #
17 # To use these routines:
18 #
19 #    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20 #    2) Added the following line to your .bashrc:
21 #        source ~/.git-completion.sh
22 #
23 #    3) You may want to make sure the git executable is available
24 #       in your PATH before this script is sourced, as some caching
25 #       is performed while the script loads.  If git isn't found
26 #       at source time then all lookups will be done on demand,
27 #       which may be slightly slower.
28 #
29 #    4) Consider changing your PS1 to also show the current branch:
30 #        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31 #
32 #       The argument to __git_ps1 will be displayed only if you
33 #       are currently in a git repository.  The %s token will be
34 #       the name of the current branch.
35 #
36 # To submit patches:
37 #
38 #    *) Read Documentation/SubmittingPatches
39 #    *) Send all patches to the current maintainer:
40 #
41 #       "Shawn O. Pearce" <spearce@spearce.org>
42 #
43 #    *) Always CC the Git mailing list:
44 #
45 #       git@vger.kernel.org
46 #
48 case "$COMP_WORDBREAKS" in
49 *:*) : great ;;
50 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51 esac
53 __gitdir ()
54 {
55         if [ -z "$1" ]; then
56                 if [ -n "$__git_dir" ]; then
57                         echo "$__git_dir"
58                 elif [ -d .git ]; then
59                         echo .git
60                 else
61                         git rev-parse --git-dir 2>/dev/null
62                 fi
63         elif [ -d "$1/.git" ]; then
64                 echo "$1/.git"
65         else
66                 echo "$1"
67         fi
68 }
70 __git_ps1 ()
71 {
72         local g="$(git rev-parse --git-dir 2>/dev/null)"
73         if [ -n "$g" ]; then
74                 local r
75                 local b
76                 if [ -d "$g/rebase-apply" ]
77                 then
78                         if test -f "$g/rebase-apply/rebasing"
79                         then
80                                 r="|REBASE"
81                         elif test -f "$g/rebase-apply/applying"
82                         then
83                                 r="|AM"
84                         else
85                                 r="|AM/REBASE"
86                         fi
87                         b="$(git symbolic-ref HEAD 2>/dev/null)"
88                 elif [ -f "$g/rebase-merge/interactive" ]
89                 then
90                         r="|REBASE-i"
91                         b="$(cat "$g/rebase-merge/head-name")"
92                 elif [ -d "$g/rebase-merge" ]
93                 then
94                         r="|REBASE-m"
95                         b="$(cat "$g/rebase-merge/head-name")"
96                 elif [ -f "$g/MERGE_HEAD" ]
97                 then
98                         r="|MERGING"
99                         b="$(git symbolic-ref HEAD 2>/dev/null)"
100                 else
101                         if [ -f "$g/BISECT_LOG" ]
102                         then
103                                 r="|BISECTING"
104                         fi
105                         if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
106                         then
107                                 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
108                                 then
109                                         b="$(cut -c1-7 "$g/HEAD")..."
110                                 fi
111                         fi
112                 fi
114                 if [ -n "$1" ]; then
115                         printf "$1" "${b##refs/heads/}$r"
116                 else
117                         printf " (%s)" "${b##refs/heads/}$r"
118                 fi
119         fi
122 __gitcomp_1 ()
124         local c IFS=' '$'\t'$'\n'
125         for c in $1; do
126                 case "$c$2" in
127                 --*=*) printf %s$'\n' "$c$2" ;;
128                 *.)    printf %s$'\n' "$c$2" ;;
129                 *)     printf %s$'\n' "$c$2 " ;;
130                 esac
131         done
134 __gitcomp ()
136         local cur="${COMP_WORDS[COMP_CWORD]}"
137         if [ $# -gt 2 ]; then
138                 cur="$3"
139         fi
140         case "$cur" in
141         --*=)
142                 COMPREPLY=()
143                 ;;
144         *)
145                 local IFS=$'\n'
146                 COMPREPLY=($(compgen -P "$2" \
147                         -W "$(__gitcomp_1 "$1" "$4")" \
148                         -- "$cur"))
149                 ;;
150         esac
153 __git_heads ()
155         local cmd i is_hash=y dir="$(__gitdir "$1")"
156         if [ -d "$dir" ]; then
157                 for i in $(git --git-dir="$dir" \
158                         for-each-ref --format='%(refname)' \
159                         refs/heads ); do
160                         echo "${i#refs/heads/}"
161                 done
162                 return
163         fi
164         for i in $(git ls-remote "$1" 2>/dev/null); do
165                 case "$is_hash,$i" in
166                 y,*) is_hash=n ;;
167                 n,*^{}) is_hash=y ;;
168                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169                 n,*) is_hash=y; echo "$i" ;;
170                 esac
171         done
174 __git_tags ()
176         local cmd i is_hash=y dir="$(__gitdir "$1")"
177         if [ -d "$dir" ]; then
178                 for i in $(git --git-dir="$dir" \
179                         for-each-ref --format='%(refname)' \
180                         refs/tags ); do
181                         echo "${i#refs/tags/}"
182                 done
183                 return
184         fi
185         for i in $(git ls-remote "$1" 2>/dev/null); do
186                 case "$is_hash,$i" in
187                 y,*) is_hash=n ;;
188                 n,*^{}) is_hash=y ;;
189                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190                 n,*) is_hash=y; echo "$i" ;;
191                 esac
192         done
195 __git_refs ()
197         local cmd i is_hash=y dir="$(__gitdir "$1")"
198         if [ -d "$dir" ]; then
199                 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200                 for i in $(git --git-dir="$dir" \
201                         for-each-ref --format='%(refname)' \
202                         refs/tags refs/heads refs/remotes); do
203                         case "$i" in
204                                 refs/tags/*)    echo "${i#refs/tags/}" ;;
205                                 refs/heads/*)   echo "${i#refs/heads/}" ;;
206                                 refs/remotes/*) echo "${i#refs/remotes/}" ;;
207                                 *)              echo "$i" ;;
208                         esac
209                 done
210                 return
211         fi
212         for i in $(git ls-remote "$dir" 2>/dev/null); do
213                 case "$is_hash,$i" in
214                 y,*) is_hash=n ;;
215                 n,*^{}) is_hash=y ;;
216                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
218                 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
219                 n,*) is_hash=y; echo "$i" ;;
220                 esac
221         done
224 __git_refs2 ()
226         local i
227         for i in $(__git_refs "$1"); do
228                 echo "$i:$i"
229         done
232 __git_refs_remotes ()
234         local cmd i is_hash=y
235         for i in $(git ls-remote "$1" 2>/dev/null); do
236                 case "$is_hash,$i" in
237                 n,refs/heads/*)
238                         is_hash=y
239                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
240                         ;;
241                 y,*) is_hash=n ;;
242                 n,*^{}) is_hash=y ;;
243                 n,refs/tags/*) is_hash=y;;
244                 n,*) is_hash=y; ;;
245                 esac
246         done
249 __git_remotes ()
251         local i ngoff IFS=$'\n' d="$(__gitdir)"
252         shopt -q nullglob || ngoff=1
253         shopt -s nullglob
254         for i in "$d/remotes"/*; do
255                 echo ${i#$d/remotes/}
256         done
257         [ "$ngoff" ] && shopt -u nullglob
258         for i in $(git --git-dir="$d" config --list); do
259                 case "$i" in
260                 remote.*.url=*)
261                         i="${i#remote.}"
262                         echo "${i/.url=*/}"
263                         ;;
264                 esac
265         done
268 __git_merge_strategies ()
270         if [ -n "$__git_merge_strategylist" ]; then
271                 echo "$__git_merge_strategylist"
272                 return
273         fi
274         sed -n "/^all_strategies='/{
275                 s/^all_strategies='//
276                 s/'//
277                 p
278                 q
279                 }" "$(git --exec-path)/git-merge"
281 __git_merge_strategylist=
282 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
284 __git_complete_file ()
286         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
287         case "$cur" in
288         ?*:*)
289                 ref="${cur%%:*}"
290                 cur="${cur#*:}"
291                 case "$cur" in
292                 ?*/*)
293                         pfx="${cur%/*}"
294                         cur="${cur##*/}"
295                         ls="$ref:$pfx"
296                         pfx="$pfx/"
297                         ;;
298                 *)
299                         ls="$ref"
300                         ;;
301             esac
303                 case "$COMP_WORDBREAKS" in
304                 *:*) : great ;;
305                 *)   pfx="$ref:$pfx" ;;
306                 esac
308                 local IFS=$'\n'
309                 COMPREPLY=($(compgen -P "$pfx" \
310                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
311                                 | sed '/^100... blob /{
312                                            s,^.*        ,,
313                                            s,$, ,
314                                        }
315                                        /^120000 blob /{
316                                            s,^.*        ,,
317                                            s,$, ,
318                                        }
319                                        /^040000 tree /{
320                                            s,^.*        ,,
321                                            s,$,/,
322                                        }
323                                        s/^.*    //')" \
324                         -- "$cur"))
325                 ;;
326         *)
327                 __gitcomp "$(__git_refs)"
328                 ;;
329         esac
332 __git_complete_revlist ()
334         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
335         case "$cur" in
336         *...*)
337                 pfx="${cur%...*}..."
338                 cur="${cur#*...}"
339                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
340                 ;;
341         *..*)
342                 pfx="${cur%..*}.."
343                 cur="${cur#*..}"
344                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
345                 ;;
346         *)
347                 __gitcomp "$(__git_refs)"
348                 ;;
349         esac
352 __git_commands ()
354         if [ -n "$__git_commandlist" ]; then
355                 echo "$__git_commandlist"
356                 return
357         fi
358         local i IFS=" "$'\n'
359         for i in $(git help -a|egrep '^ ')
360         do
361                 case $i in
362                 *--*)             : helper pattern;;
363                 applymbox)        : ask gittus;;
364                 applypatch)       : ask gittus;;
365                 archimport)       : import;;
366                 cat-file)         : plumbing;;
367                 check-attr)       : plumbing;;
368                 check-ref-format) : plumbing;;
369                 commit-tree)      : plumbing;;
370                 cvsexportcommit)  : export;;
371                 cvsimport)        : import;;
372                 cvsserver)        : daemon;;
373                 daemon)           : daemon;;
374                 diff-files)       : plumbing;;
375                 diff-index)       : plumbing;;
376                 diff-tree)        : plumbing;;
377                 fast-import)      : import;;
378                 fsck-objects)     : plumbing;;
379                 fetch-pack)       : plumbing;;
380                 fmt-merge-msg)    : plumbing;;
381                 for-each-ref)     : plumbing;;
382                 hash-object)      : plumbing;;
383                 http-*)           : transport;;
384                 index-pack)       : plumbing;;
385                 init-db)          : deprecated;;
386                 local-fetch)      : plumbing;;
387                 mailinfo)         : plumbing;;
388                 mailsplit)        : plumbing;;
389                 merge-*)          : plumbing;;
390                 mktree)           : plumbing;;
391                 mktag)            : plumbing;;
392                 pack-objects)     : plumbing;;
393                 pack-redundant)   : plumbing;;
394                 pack-refs)        : plumbing;;
395                 parse-remote)     : plumbing;;
396                 patch-id)         : plumbing;;
397                 peek-remote)      : plumbing;;
398                 prune)            : plumbing;;
399                 prune-packed)     : plumbing;;
400                 quiltimport)      : import;;
401                 read-tree)        : plumbing;;
402                 receive-pack)     : plumbing;;
403                 reflog)           : plumbing;;
404                 repo-config)      : deprecated;;
405                 rerere)           : plumbing;;
406                 rev-list)         : plumbing;;
407                 rev-parse)        : plumbing;;
408                 runstatus)        : plumbing;;
409                 sh-setup)         : internal;;
410                 shell)            : daemon;;
411                 send-pack)        : plumbing;;
412                 show-index)       : plumbing;;
413                 ssh-*)            : transport;;
414                 stripspace)       : plumbing;;
415                 symbolic-ref)     : plumbing;;
416                 tar-tree)         : deprecated;;
417                 unpack-file)      : plumbing;;
418                 unpack-objects)   : plumbing;;
419                 update-index)     : plumbing;;
420                 update-ref)       : plumbing;;
421                 update-server-info) : daemon;;
422                 upload-archive)   : plumbing;;
423                 upload-pack)      : plumbing;;
424                 write-tree)       : plumbing;;
425                 verify-tag)       : plumbing;;
426                 *) echo $i;;
427                 esac
428         done
430 __git_commandlist=
431 __git_commandlist="$(__git_commands 2>/dev/null)"
433 __git_aliases ()
435         local i IFS=$'\n'
436         for i in $(git --git-dir="$(__gitdir)" config --list); do
437                 case "$i" in
438                 alias.*)
439                         i="${i#alias.}"
440                         echo "${i/=*/}"
441                         ;;
442                 esac
443         done
446 __git_aliased_command ()
448         local word cmdline=$(git --git-dir="$(__gitdir)" \
449                 config --get "alias.$1")
450         for word in $cmdline; do
451                 if [ "${word##-*}" ]; then
452                         echo $word
453                         return
454                 fi
455         done
458 __git_find_subcommand ()
460         local word subcommand c=1
462         while [ $c -lt $COMP_CWORD ]; do
463                 word="${COMP_WORDS[c]}"
464                 for subcommand in $1; do
465                         if [ "$subcommand" = "$word" ]; then
466                                 echo "$subcommand"
467                                 return
468                         fi
469                 done
470                 c=$((++c))
471         done
474 __git_has_doubledash ()
476         local c=1
477         while [ $c -lt $COMP_CWORD ]; do
478                 if [ "--" = "${COMP_WORDS[c]}" ]; then
479                         return 0
480                 fi
481                 c=$((++c))
482         done
483         return 1
486 __git_whitespacelist="nowarn warn error error-all strip"
488 _git_am ()
490         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
491         if [ -d "$dir"/rebase-apply ]; then
492                 __gitcomp "--skip --resolved --abort"
493                 return
494         fi
495         case "$cur" in
496         --whitespace=*)
497                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
498                 return
499                 ;;
500         --*)
501                 __gitcomp "
502                         --signoff --utf8 --binary --3way --interactive
503                         --whitespace=
504                         "
505                 return
506         esac
507         COMPREPLY=()
510 _git_apply ()
512         local cur="${COMP_WORDS[COMP_CWORD]}"
513         case "$cur" in
514         --whitespace=*)
515                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
516                 return
517                 ;;
518         --*)
519                 __gitcomp "
520                         --stat --numstat --summary --check --index
521                         --cached --index-info --reverse --reject --unidiff-zero
522                         --apply --no-add --exclude=
523                         --whitespace= --inaccurate-eof --verbose
524                         "
525                 return
526         esac
527         COMPREPLY=()
530 _git_add ()
532         __git_has_doubledash && return
534         local cur="${COMP_WORDS[COMP_CWORD]}"
535         case "$cur" in
536         --*)
537                 __gitcomp "
538                         --interactive --refresh --patch --update --dry-run
539                         --ignore-errors
540                         "
541                 return
542         esac
543         COMPREPLY=()
546 _git_bisect ()
548         __git_has_doubledash && return
550         local subcommands="start bad good skip reset visualize replay log run"
551         local subcommand="$(__git_find_subcommand "$subcommands")"
552         if [ -z "$subcommand" ]; then
553                 __gitcomp "$subcommands"
554                 return
555         fi
557         case "$subcommand" in
558         bad|good|reset|skip)
559                 __gitcomp "$(__git_refs)"
560                 ;;
561         *)
562                 COMPREPLY=()
563                 ;;
564         esac
567 _git_branch ()
569         local i c=1 only_local_ref="n" has_r="n"
571         while [ $c -lt $COMP_CWORD ]; do
572                 i="${COMP_WORDS[c]}"
573                 case "$i" in
574                 -d|-m)  only_local_ref="y" ;;
575                 -r)     has_r="y" ;;
576                 esac
577                 c=$((++c))
578         done
580         case "${COMP_WORDS[COMP_CWORD]}" in
581         --*=*)  COMPREPLY=() ;;
582         --*)
583                 __gitcomp "
584                         --color --no-color --verbose --abbrev= --no-abbrev
585                         --track --no-track --contains --merged --no-merged
586                         "
587                 ;;
588         *)
589                 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
590                         __gitcomp "$(__git_heads)"
591                 else
592                         __gitcomp "$(__git_refs)"
593                 fi
594                 ;;
595         esac
598 _git_bundle ()
600         local mycword="$COMP_CWORD"
601         case "${COMP_WORDS[0]}" in
602         git)
603                 local cmd="${COMP_WORDS[2]}"
604                 mycword="$((mycword-1))"
605                 ;;
606         git-bundle*)
607                 local cmd="${COMP_WORDS[1]}"
608                 ;;
609         esac
610         case "$mycword" in
611         1)
612                 __gitcomp "create list-heads verify unbundle"
613                 ;;
614         2)
615                 # looking for a file
616                 ;;
617         *)
618                 case "$cmd" in
619                         create)
620                                 __git_complete_revlist
621                         ;;
622                 esac
623                 ;;
624         esac
627 _git_checkout ()
629         __gitcomp "$(__git_refs)"
632 _git_cherry ()
634         __gitcomp "$(__git_refs)"
637 _git_cherry_pick ()
639         local cur="${COMP_WORDS[COMP_CWORD]}"
640         case "$cur" in
641         --*)
642                 __gitcomp "--edit --no-commit"
643                 ;;
644         *)
645                 __gitcomp "$(__git_refs)"
646                 ;;
647         esac
650 _git_commit ()
652         __git_has_doubledash && return
654         local cur="${COMP_WORDS[COMP_CWORD]}"
655         case "$cur" in
656         --*)
657                 __gitcomp "
658                         --all --author= --signoff --verify --no-verify
659                         --edit --amend --include --only
660                         "
661                 return
662         esac
663         COMPREPLY=()
666 _git_describe ()
668         __gitcomp "$(__git_refs)"
671 _git_diff ()
673         __git_has_doubledash && return
675         local cur="${COMP_WORDS[COMP_CWORD]}"
676         case "$cur" in
677         --*)
678                 __gitcomp "--cached --stat --numstat --shortstat --summary
679                         --patch-with-stat --name-only --name-status --color
680                         --no-color --color-words --no-renames --check
681                         --full-index --binary --abbrev --diff-filter
682                         --find-copies-harder --pickaxe-all --pickaxe-regex
683                         --text --ignore-space-at-eol --ignore-space-change
684                         --ignore-all-space --exit-code --quiet --ext-diff
685                         --no-ext-diff
686                         --no-prefix --src-prefix= --dst-prefix=
687                         --base --ours --theirs
688                         "
689                 return
690                 ;;
691         esac
692         __git_complete_file
695 _git_diff_tree ()
697         __gitcomp "$(__git_refs)"
700 _git_fetch ()
702         local cur="${COMP_WORDS[COMP_CWORD]}"
704         case "${COMP_WORDS[0]},$COMP_CWORD" in
705         git-fetch*,1)
706                 __gitcomp "$(__git_remotes)"
707                 ;;
708         git,2)
709                 __gitcomp "$(__git_remotes)"
710                 ;;
711         *)
712                 case "$cur" in
713                 *:*)
714                         local pfx=""
715                         case "$COMP_WORDBREAKS" in
716                         *:*) : great ;;
717                         *)   pfx="${cur%%:*}:" ;;
718                         esac
719                         __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
720                         ;;
721                 *)
722                         local remote
723                         case "${COMP_WORDS[0]}" in
724                         git-fetch) remote="${COMP_WORDS[1]}" ;;
725                         git)       remote="${COMP_WORDS[2]}" ;;
726                         esac
727                         __gitcomp "$(__git_refs2 "$remote")"
728                         ;;
729                 esac
730                 ;;
731         esac
734 _git_format_patch ()
736         local cur="${COMP_WORDS[COMP_CWORD]}"
737         case "$cur" in
738         --*)
739                 __gitcomp "
740                         --stdout --attach --thread
741                         --output-directory
742                         --numbered --start-number
743                         --numbered-files
744                         --keep-subject
745                         --signoff
746                         --in-reply-to=
747                         --full-index --binary
748                         --not --all
749                         --cover-letter
750                         --no-prefix --src-prefix= --dst-prefix=
751                         "
752                 return
753                 ;;
754         esac
755         __git_complete_revlist
758 _git_gc ()
760         local cur="${COMP_WORDS[COMP_CWORD]}"
761         case "$cur" in
762         --*)
763                 __gitcomp "--prune --aggressive"
764                 return
765                 ;;
766         esac
767         COMPREPLY=()
770 _git_ls_remote ()
772         __gitcomp "$(__git_remotes)"
775 _git_ls_tree ()
777         __git_complete_file
780 _git_log ()
782         __git_has_doubledash && return
784         local cur="${COMP_WORDS[COMP_CWORD]}"
785         case "$cur" in
786         --pretty=*)
787                 __gitcomp "
788                         oneline short medium full fuller email raw
789                         " "" "${cur##--pretty=}"
790                 return
791                 ;;
792         --date=*)
793                 __gitcomp "
794                         relative iso8601 rfc2822 short local default
795                 " "" "${cur##--date=}"
796                 return
797                 ;;
798         --*)
799                 __gitcomp "
800                         --max-count= --max-age= --since= --after=
801                         --min-age= --before= --until=
802                         --root --topo-order --date-order --reverse
803                         --no-merges --follow
804                         --abbrev-commit --abbrev=
805                         --relative-date --date=
806                         --author= --committer= --grep=
807                         --all-match
808                         --pretty= --name-status --name-only --raw
809                         --not --all
810                         --left-right --cherry-pick
811                         --graph
812                         --stat --numstat --shortstat
813                         --decorate --diff-filter=
814                         --color-words --walk-reflogs
815                         "
816                 return
817                 ;;
818         esac
819         __git_complete_revlist
822 _git_merge ()
824         local cur="${COMP_WORDS[COMP_CWORD]}"
825         case "${COMP_WORDS[COMP_CWORD-1]}" in
826         -s|--strategy)
827                 __gitcomp "$(__git_merge_strategies)"
828                 return
829         esac
830         case "$cur" in
831         --strategy=*)
832                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
833                 return
834                 ;;
835         --*)
836                 __gitcomp "
837                         --no-commit --no-stat --log --no-log --squash --strategy
838                         "
839                 return
840         esac
841         __gitcomp "$(__git_refs)"
844 _git_merge_base ()
846         __gitcomp "$(__git_refs)"
849 _git_name_rev ()
851         __gitcomp "--tags --all --stdin"
854 _git_pull ()
856         local cur="${COMP_WORDS[COMP_CWORD]}"
858         case "${COMP_WORDS[0]},$COMP_CWORD" in
859         git-pull*,1)
860                 __gitcomp "$(__git_remotes)"
861                 ;;
862         git,2)
863                 __gitcomp "$(__git_remotes)"
864                 ;;
865         *)
866                 local remote
867                 case "${COMP_WORDS[0]}" in
868                 git-pull)  remote="${COMP_WORDS[1]}" ;;
869                 git)       remote="${COMP_WORDS[2]}" ;;
870                 esac
871                 __gitcomp "$(__git_refs "$remote")"
872                 ;;
873         esac
876 _git_push ()
878         local cur="${COMP_WORDS[COMP_CWORD]}"
880         case "${COMP_WORDS[0]},$COMP_CWORD" in
881         git-push*,1)
882                 __gitcomp "$(__git_remotes)"
883                 ;;
884         git,2)
885                 __gitcomp "$(__git_remotes)"
886                 ;;
887         *)
888                 case "$cur" in
889                 *:*)
890                         local remote
891                         case "${COMP_WORDS[0]}" in
892                         git-push)  remote="${COMP_WORDS[1]}" ;;
893                         git)       remote="${COMP_WORDS[2]}" ;;
894                         esac
896                         local pfx=""
897                         case "$COMP_WORDBREAKS" in
898                         *:*) : great ;;
899                         *)   pfx="${cur%%:*}:" ;;
900                         esac
902                         __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
903                         ;;
904                 +*)
905                         __gitcomp "$(__git_refs)" + "${cur#+}"
906                         ;;
907                 *)
908                         __gitcomp "$(__git_refs)"
909                         ;;
910                 esac
911                 ;;
912         esac
915 _git_rebase ()
917         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
918         if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
919                 __gitcomp "--continue --skip --abort"
920                 return
921         fi
922         case "${COMP_WORDS[COMP_CWORD-1]}" in
923         -s|--strategy)
924                 __gitcomp "$(__git_merge_strategies)"
925                 return
926         esac
927         case "$cur" in
928         --strategy=*)
929                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
930                 return
931                 ;;
932         --*)
933                 __gitcomp "--onto --merge --strategy --interactive"
934                 return
935         esac
936         __gitcomp "$(__git_refs)"
939 _git_send_email ()
941         local cur="${COMP_WORDS[COMP_CWORD]}"
942         case "$cur" in
943         --*)
944                 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
945                         --dry-run --envelope-sender --from --identity
946                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
947                         --no-suppress-from --no-thread --quiet
948                         --signed-off-by-cc --smtp-pass --smtp-server
949                         --smtp-server-port --smtp-ssl --smtp-user --subject
950                         --suppress-cc --suppress-from --thread --to"
951                 return
952                 ;;
953         esac
954         COMPREPLY=()
957 _git_config ()
959         local cur="${COMP_WORDS[COMP_CWORD]}"
960         local prv="${COMP_WORDS[COMP_CWORD-1]}"
961         case "$prv" in
962         branch.*.remote)
963                 __gitcomp "$(__git_remotes)"
964                 return
965                 ;;
966         branch.*.merge)
967                 __gitcomp "$(__git_refs)"
968                 return
969                 ;;
970         remote.*.fetch)
971                 local remote="${prv#remote.}"
972                 remote="${remote%.fetch}"
973                 __gitcomp "$(__git_refs_remotes "$remote")"
974                 return
975                 ;;
976         remote.*.push)
977                 local remote="${prv#remote.}"
978                 remote="${remote%.push}"
979                 __gitcomp "$(git --git-dir="$(__gitdir)" \
980                         for-each-ref --format='%(refname):%(refname)' \
981                         refs/heads)"
982                 return
983                 ;;
984         pull.twohead|pull.octopus)
985                 __gitcomp "$(__git_merge_strategies)"
986                 return
987                 ;;
988         color.branch|color.diff|color.status)
989                 __gitcomp "always never auto"
990                 return
991                 ;;
992         color.*.*)
993                 __gitcomp "
994                         black red green yellow blue magenta cyan white
995                         bold dim ul blink reverse
996                         "
997                 return
998                 ;;
999         *.*)
1000                 COMPREPLY=()
1001                 return
1002                 ;;
1003         esac
1004         case "$cur" in
1005         --*)
1006                 __gitcomp "
1007                         --global --system --file=
1008                         --list --replace-all
1009                         --get --get-all --get-regexp
1010                         --add --unset --unset-all
1011                         --remove-section --rename-section
1012                         "
1013                 return
1014                 ;;
1015         branch.*.*)
1016                 local pfx="${cur%.*}."
1017                 cur="${cur##*.}"
1018                 __gitcomp "remote merge" "$pfx" "$cur"
1019                 return
1020                 ;;
1021         branch.*)
1022                 local pfx="${cur%.*}."
1023                 cur="${cur#*.}"
1024                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1025                 return
1026                 ;;
1027         remote.*.*)
1028                 local pfx="${cur%.*}."
1029                 cur="${cur##*.}"
1030                 __gitcomp "
1031                         url fetch push skipDefaultUpdate
1032                         receivepack uploadpack tagopt
1033                         " "$pfx" "$cur"
1034                 return
1035                 ;;
1036         remote.*)
1037                 local pfx="${cur%.*}."
1038                 cur="${cur#*.}"
1039                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1040                 return
1041                 ;;
1042         esac
1043         __gitcomp "
1044                 apply.whitespace
1045                 core.fileMode
1046                 core.gitProxy
1047                 core.ignoreStat
1048                 core.preferSymlinkRefs
1049                 core.logAllRefUpdates
1050                 core.loosecompression
1051                 core.repositoryFormatVersion
1052                 core.sharedRepository
1053                 core.warnAmbiguousRefs
1054                 core.compression
1055                 core.packedGitWindowSize
1056                 core.packedGitLimit
1057                 clean.requireForce
1058                 color.branch
1059                 color.branch.current
1060                 color.branch.local
1061                 color.branch.remote
1062                 color.branch.plain
1063                 color.diff
1064                 color.diff.plain
1065                 color.diff.meta
1066                 color.diff.frag
1067                 color.diff.old
1068                 color.diff.new
1069                 color.diff.commit
1070                 color.diff.whitespace
1071                 color.pager
1072                 color.status
1073                 color.status.header
1074                 color.status.added
1075                 color.status.changed
1076                 color.status.untracked
1077                 diff.renameLimit
1078                 diff.renames
1079                 fetch.unpackLimit
1080                 format.headers
1081                 format.subjectprefix
1082                 gitcvs.enabled
1083                 gitcvs.logfile
1084                 gitcvs.allbinary
1085                 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1086                 gitcvs.dbtablenameprefix
1087                 gc.packrefs
1088                 gc.reflogexpire
1089                 gc.reflogexpireunreachable
1090                 gc.rerereresolved
1091                 gc.rerereunresolved
1092                 http.sslVerify
1093                 http.sslCert
1094                 http.sslKey
1095                 http.sslCAInfo
1096                 http.sslCAPath
1097                 http.maxRequests
1098                 http.lowSpeedLimit
1099                 http.lowSpeedTime
1100                 http.noEPSV
1101                 i18n.commitEncoding
1102                 i18n.logOutputEncoding
1103                 log.showroot
1104                 merge.tool
1105                 merge.summary
1106                 merge.verbosity
1107                 pack.window
1108                 pack.depth
1109                 pack.windowMemory
1110                 pack.compression
1111                 pack.deltaCacheSize
1112                 pack.deltaCacheLimit
1113                 pull.octopus
1114                 pull.twohead
1115                 repack.useDeltaBaseOffset
1116                 showbranch.default
1117                 tar.umask
1118                 transfer.unpackLimit
1119                 receive.unpackLimit
1120                 receive.denyNonFastForwards
1121                 user.name
1122                 user.email
1123                 user.signingkey
1124                 branch. remote.
1125         "
1128 _git_remote ()
1130         local subcommands="add rm show prune update"
1131         local subcommand="$(__git_find_subcommand "$subcommands")"
1132         if [ -z "$subcommand" ]; then
1133                 __gitcomp "$subcommands"
1134                 return
1135         fi
1137         case "$subcommand" in
1138         rm|show|prune)
1139                 __gitcomp "$(__git_remotes)"
1140                 ;;
1141         update)
1142                 local i c='' IFS=$'\n'
1143                 for i in $(git --git-dir="$(__gitdir)" config --list); do
1144                         case "$i" in
1145                         remotes.*)
1146                                 i="${i#remotes.}"
1147                                 c="$c ${i/=*/}"
1148                                 ;;
1149                         esac
1150                 done
1151                 __gitcomp "$c"
1152                 ;;
1153         *)
1154                 COMPREPLY=()
1155                 ;;
1156         esac
1159 _git_reset ()
1161         __git_has_doubledash && return
1163         local cur="${COMP_WORDS[COMP_CWORD]}"
1164         case "$cur" in
1165         --*)
1166                 __gitcomp "--mixed --hard --soft"
1167                 return
1168                 ;;
1169         esac
1170         __gitcomp "$(__git_refs)"
1173 _git_rm ()
1175         __git_has_doubledash && return
1177         local cur="${COMP_WORDS[COMP_CWORD]}"
1178         case "$cur" in
1179         --*)
1180                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1181                 return
1182                 ;;
1183         esac
1184         COMPREPLY=()
1187 _git_shortlog ()
1189         __git_has_doubledash && return
1191         local cur="${COMP_WORDS[COMP_CWORD]}"
1192         case "$cur" in
1193         --*)
1194                 __gitcomp "
1195                         --max-count= --max-age= --since= --after=
1196                         --min-age= --before= --until=
1197                         --no-merges
1198                         --author= --committer= --grep=
1199                         --all-match
1200                         --not --all
1201                         --numbered --summary
1202                         "
1203                 return
1204                 ;;
1205         esac
1206         __git_complete_revlist
1209 _git_show ()
1211         local cur="${COMP_WORDS[COMP_CWORD]}"
1212         case "$cur" in
1213         --pretty=*)
1214                 __gitcomp "
1215                         oneline short medium full fuller email raw
1216                         " "" "${cur##--pretty=}"
1217                 return
1218                 ;;
1219         --*)
1220                 __gitcomp "--pretty="
1221                 return
1222                 ;;
1223         esac
1224         __git_complete_file
1227 _git_show_branch ()
1229         local cur="${COMP_WORDS[COMP_CWORD]}"
1230         case "$cur" in
1231         --*)
1232                 __gitcomp "
1233                         --all --remotes --topo-order --current --more=
1234                         --list --independent --merge-base --no-name
1235                         --sha1-name --topics --reflog
1236                         "
1237                 return
1238                 ;;
1239         esac
1240         __git_complete_revlist
1243 _git_stash ()
1245         local subcommands='save list show apply clear drop pop create'
1246         local subcommand="$(__git_find_subcommand "$subcommands")"
1247         if [ -z "$subcommand" ]; then
1248                 __gitcomp "$subcommands"
1249         else
1250                 local cur="${COMP_WORDS[COMP_CWORD]}"
1251                 case "$subcommand,$cur" in
1252                 save,--*)
1253                         __gitcomp "--keep-index"
1254                         ;;
1255                 *)
1256                         COMPREPLY=()
1257                         ;;
1258                 esac
1259         fi
1262 _git_submodule ()
1264         __git_has_doubledash && return
1266         local subcommands="add status init update"
1267         if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1268                 local cur="${COMP_WORDS[COMP_CWORD]}"
1269                 case "$cur" in
1270                 --*)
1271                         __gitcomp "--quiet --cached"
1272                         ;;
1273                 *)
1274                         __gitcomp "$subcommands"
1275                         ;;
1276                 esac
1277                 return
1278         fi
1281 _git_svn ()
1283         local subcommands="
1284                 init fetch clone rebase dcommit log find-rev
1285                 set-tree commit-diff info create-ignore propget
1286                 proplist show-ignore show-externals
1287                 "
1288         local subcommand="$(__git_find_subcommand "$subcommands")"
1289         if [ -z "$subcommand" ]; then
1290                 __gitcomp "$subcommands"
1291         else
1292                 local remote_opts="--username= --config-dir= --no-auth-cache"
1293                 local fc_opts="
1294                         --follow-parent --authors-file= --repack=
1295                         --no-metadata --use-svm-props --use-svnsync-props
1296                         --log-window-size= --no-checkout --quiet
1297                         --repack-flags --user-log-author $remote_opts
1298                         "
1299                 local init_opts="
1300                         --template= --shared= --trunk= --tags=
1301                         --branches= --stdlayout --minimize-url
1302                         --no-metadata --use-svm-props --use-svnsync-props
1303                         --rewrite-root= $remote_opts
1304                         "
1305                 local cmt_opts="
1306                         --edit --rmdir --find-copies-harder --copy-similarity=
1307                         "
1309                 local cur="${COMP_WORDS[COMP_CWORD]}"
1310                 case "$subcommand,$cur" in
1311                 fetch,--*)
1312                         __gitcomp "--revision= --fetch-all $fc_opts"
1313                         ;;
1314                 clone,--*)
1315                         __gitcomp "--revision= $fc_opts $init_opts"
1316                         ;;
1317                 init,--*)
1318                         __gitcomp "$init_opts"
1319                         ;;
1320                 dcommit,--*)
1321                         __gitcomp "
1322                                 --merge --strategy= --verbose --dry-run
1323                                 --fetch-all --no-rebase $cmt_opts $fc_opts
1324                                 "
1325                         ;;
1326                 set-tree,--*)
1327                         __gitcomp "--stdin $cmt_opts $fc_opts"
1328                         ;;
1329                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1330                 show-externals,--*)
1331                         __gitcomp "--revision="
1332                         ;;
1333                 log,--*)
1334                         __gitcomp "
1335                                 --limit= --revision= --verbose --incremental
1336                                 --oneline --show-commit --non-recursive
1337                                 --authors-file=
1338                                 "
1339                         ;;
1340                 rebase,--*)
1341                         __gitcomp "
1342                                 --merge --verbose --strategy= --local
1343                                 --fetch-all $fc_opts
1344                                 "
1345                         ;;
1346                 commit-diff,--*)
1347                         __gitcomp "--message= --file= --revision= $cmt_opts"
1348                         ;;
1349                 info,--*)
1350                         __gitcomp "--url"
1351                         ;;
1352                 *)
1353                         COMPREPLY=()
1354                         ;;
1355                 esac
1356         fi
1359 _git_tag ()
1361         local i c=1 f=0
1362         while [ $c -lt $COMP_CWORD ]; do
1363                 i="${COMP_WORDS[c]}"
1364                 case "$i" in
1365                 -d|-v)
1366                         __gitcomp "$(__git_tags)"
1367                         return
1368                         ;;
1369                 -f)
1370                         f=1
1371                         ;;
1372                 esac
1373                 c=$((++c))
1374         done
1376         case "${COMP_WORDS[COMP_CWORD-1]}" in
1377         -m|-F)
1378                 COMPREPLY=()
1379                 ;;
1380         -*|tag|git-tag)
1381                 if [ $f = 1 ]; then
1382                         __gitcomp "$(__git_tags)"
1383                 else
1384                         COMPREPLY=()
1385                 fi
1386                 ;;
1387         *)
1388                 __gitcomp "$(__git_refs)"
1389                 ;;
1390         esac
1393 _git ()
1395         local i c=1 command __git_dir
1397         while [ $c -lt $COMP_CWORD ]; do
1398                 i="${COMP_WORDS[c]}"
1399                 case "$i" in
1400                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1401                 --bare)      __git_dir="." ;;
1402                 --version|--help|-p|--paginate) ;;
1403                 *) command="$i"; break ;;
1404                 esac
1405                 c=$((++c))
1406         done
1408         if [ -z "$command" ]; then
1409                 case "${COMP_WORDS[COMP_CWORD]}" in
1410                 --*=*) COMPREPLY=() ;;
1411                 --*)   __gitcomp "
1412                         --paginate
1413                         --no-pager
1414                         --git-dir=
1415                         --bare
1416                         --version
1417                         --exec-path
1418                         --work-tree=
1419                         --help
1420                         "
1421                         ;;
1422                 *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1423                 esac
1424                 return
1425         fi
1427         local expansion=$(__git_aliased_command "$command")
1428         [ "$expansion" ] && command="$expansion"
1430         case "$command" in
1431         am)          _git_am ;;
1432         add)         _git_add ;;
1433         apply)       _git_apply ;;
1434         bisect)      _git_bisect ;;
1435         bundle)      _git_bundle ;;
1436         branch)      _git_branch ;;
1437         checkout)    _git_checkout ;;
1438         cherry)      _git_cherry ;;
1439         cherry-pick) _git_cherry_pick ;;
1440         commit)      _git_commit ;;
1441         config)      _git_config ;;
1442         describe)    _git_describe ;;
1443         diff)        _git_diff ;;
1444         fetch)       _git_fetch ;;
1445         format-patch) _git_format_patch ;;
1446         gc)          _git_gc ;;
1447         log)         _git_log ;;
1448         ls-remote)   _git_ls_remote ;;
1449         ls-tree)     _git_ls_tree ;;
1450         merge)       _git_merge;;
1451         merge-base)  _git_merge_base ;;
1452         name-rev)    _git_name_rev ;;
1453         pull)        _git_pull ;;
1454         push)        _git_push ;;
1455         rebase)      _git_rebase ;;
1456         remote)      _git_remote ;;
1457         reset)       _git_reset ;;
1458         rm)          _git_rm ;;
1459         send-email)  _git_send_email ;;
1460         shortlog)    _git_shortlog ;;
1461         show)        _git_show ;;
1462         show-branch) _git_show_branch ;;
1463         stash)       _git_stash ;;
1464         submodule)   _git_submodule ;;
1465         svn)         _git_svn ;;
1466         tag)         _git_tag ;;
1467         whatchanged) _git_log ;;
1468         *)           COMPREPLY=() ;;
1469         esac
1472 _gitk ()
1474         __git_has_doubledash && return
1476         local cur="${COMP_WORDS[COMP_CWORD]}"
1477         local g="$(git rev-parse --git-dir 2>/dev/null)"
1478         local merge=""
1479         if [ -f $g/MERGE_HEAD ]; then
1480                 merge="--merge"
1481         fi
1482         case "$cur" in
1483         --*)
1484                 __gitcomp "--not --all $merge"
1485                 return
1486                 ;;
1487         esac
1488         __git_complete_revlist
1491 complete -o default -o nospace -F _git git
1492 complete -o default -o nospace -F _gitk gitk
1494 # The following are necessary only for Cygwin, and only are needed
1495 # when the user has tab-completed the executable name and consequently
1496 # included the '.exe' suffix.
1498 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1499 complete -o default -o nospace -F _git git.exe
1500 fi