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