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