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