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