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