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