2009-01-15 17:02:23 +01:00
|
|
|
#!bash
|
2006-09-28 11:31:25 +02:00
|
|
|
#
|
2011-04-27 05:23:35 +02:00
|
|
|
# bash/zsh completion support for core Git.
|
2006-09-28 11:31:25 +02:00
|
|
|
#
|
2007-05-24 07:36:46 +02:00
|
|
|
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
|
2006-09-28 11:31:25 +02:00
|
|
|
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
|
2007-05-24 07:36:46 +02:00
|
|
|
# Distributed under the GNU General Public License, version 2.0.
|
2006-09-28 11:31:25 +02:00
|
|
|
#
|
|
|
|
# The contained completion routines provide support for completing:
|
|
|
|
#
|
|
|
|
# *) local and remote branch names
|
|
|
|
# *) local and remote tag names
|
|
|
|
# *) .git/remotes file names
|
|
|
|
# *) git 'subcommands'
|
|
|
|
# *) tree paths within 'ref:path/to/file' expressions
|
2007-05-24 07:36:46 +02:00
|
|
|
# *) common --long-options
|
2006-09-28 11:31:25 +02:00
|
|
|
#
|
|
|
|
# To use these routines:
|
|
|
|
#
|
|
|
|
# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
|
2011-04-27 05:23:35 +02:00
|
|
|
# 2) Add the following line to your .bashrc/.zshrc:
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
# source ~/.git-completion.sh
|
|
|
|
#
|
2009-11-18 01:49:10 +01:00
|
|
|
# 3) Consider changing your PS1 to also show the current branch:
|
2011-04-27 05:23:35 +02:00
|
|
|
# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
|
|
|
|
# ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
|
2006-11-27 09:41:28 +01:00
|
|
|
#
|
|
|
|
# The argument to __git_ps1 will be displayed only if you
|
|
|
|
# are currently in a git repository. The %s token will be
|
|
|
|
# the name of the current branch.
|
|
|
|
#
|
2009-02-06 17:05:38 +01:00
|
|
|
# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
|
|
|
|
# value, unstaged (*) and staged (+) changes will be shown next
|
|
|
|
# to the branch name. You can configure this per-repository
|
|
|
|
# with the bash.showDirtyState variable, which defaults to true
|
|
|
|
# once GIT_PS1_SHOWDIRTYSTATE is enabled.
|
2009-02-03 10:20:54 +01:00
|
|
|
#
|
2009-06-02 20:03:22 +02:00
|
|
|
# You can also see if currently something is stashed, by setting
|
|
|
|
# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
|
|
|
|
# then a '$' will be shown next to the branch name.
|
|
|
|
#
|
2009-07-22 10:31:34 +02:00
|
|
|
# If you would like to see if there're untracked files, then you can
|
|
|
|
# set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
|
|
|
|
# untracked files, then a '%' will be shown next to the branch name.
|
|
|
|
#
|
2010-06-17 23:32:02 +02:00
|
|
|
# If you would like to see the difference between HEAD and its
|
|
|
|
# upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
|
|
|
|
# you are behind, ">" indicates you are ahead, and "<>"
|
|
|
|
# indicates you have diverged. You can further control
|
|
|
|
# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
|
|
|
|
# list of values:
|
|
|
|
# verbose show number of commits ahead/behind (+/-) upstream
|
|
|
|
# legacy don't use the '--count' option available in recent
|
|
|
|
# versions of git-rev-list
|
|
|
|
# git always compare HEAD to @{upstream}
|
|
|
|
# svn always compare HEAD to your SVN upstream
|
|
|
|
# By default, __git_ps1 will compare HEAD to your SVN upstream
|
|
|
|
# if it can find one, or @{upstream} otherwise. Once you have
|
|
|
|
# set GIT_PS1_SHOWUPSTREAM, you can override it on a
|
|
|
|
# per-repository basis by setting the bash.showUpstream config
|
|
|
|
# variable.
|
|
|
|
#
|
|
|
|
#
|
2007-05-24 07:36:46 +02:00
|
|
|
# To submit patches:
|
|
|
|
#
|
|
|
|
# *) Read Documentation/SubmittingPatches
|
|
|
|
# *) Send all patches to the current maintainer:
|
|
|
|
#
|
|
|
|
# "Shawn O. Pearce" <spearce@spearce.org>
|
|
|
|
#
|
|
|
|
# *) Always CC the Git mailing list:
|
|
|
|
#
|
|
|
|
# git@vger.kernel.org
|
|
|
|
#
|
2006-09-28 11:31:25 +02:00
|
|
|
|
2011-04-27 05:23:35 +02:00
|
|
|
if [[ -n ${ZSH_VERSION-} ]]; then
|
|
|
|
autoload -U +X bashcompinit && bashcompinit
|
|
|
|
fi
|
|
|
|
|
2008-07-15 07:52:04 +02:00
|
|
|
case "$COMP_WORDBREAKS" in
|
|
|
|
*:*) : great ;;
|
|
|
|
*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
|
|
|
|
esac
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __gitdir accepts 0 or 1 arguments (i.e., location)
|
|
|
|
# returns location of .git repo
|
2006-11-05 12:21:57 +01:00
|
|
|
__gitdir ()
|
|
|
|
{
|
2009-01-15 17:02:21 +01:00
|
|
|
if [ -z "${1-}" ]; then
|
2009-02-11 19:03:26 +01:00
|
|
|
if [ -n "${__git_dir-}" ]; then
|
2006-11-28 18:12:26 +01:00
|
|
|
echo "$__git_dir"
|
|
|
|
elif [ -d .git ]; then
|
|
|
|
echo .git
|
|
|
|
else
|
|
|
|
git rev-parse --git-dir 2>/dev/null
|
|
|
|
fi
|
|
|
|
elif [ -d "$1/.git" ]; then
|
|
|
|
echo "$1/.git"
|
|
|
|
else
|
|
|
|
echo "$1"
|
|
|
|
fi
|
2006-11-05 12:21:57 +01:00
|
|
|
}
|
|
|
|
|
2010-06-17 23:32:02 +02:00
|
|
|
# stores the divergence from upstream in $p
|
|
|
|
# used by GIT_PS1_SHOWUPSTREAM
|
|
|
|
__git_ps1_show_upstream ()
|
|
|
|
{
|
|
|
|
local key value
|
|
|
|
local svn_remote=() svn_url_pattern count n
|
|
|
|
local upstream=git legacy="" verbose=""
|
|
|
|
|
|
|
|
# get some config options from git-config
|
|
|
|
while read key value; do
|
|
|
|
case "$key" in
|
|
|
|
bash.showupstream)
|
|
|
|
GIT_PS1_SHOWUPSTREAM="$value"
|
|
|
|
if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
|
|
|
|
p=""
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
svn-remote.*.url)
|
|
|
|
svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
|
|
|
|
svn_url_pattern+="\\|$value"
|
|
|
|
upstream=svn+git # default upstream is SVN if available, else git
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done < <(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')
|
|
|
|
|
|
|
|
# parse configuration values
|
|
|
|
for option in ${GIT_PS1_SHOWUPSTREAM}; do
|
|
|
|
case "$option" in
|
|
|
|
git|svn) upstream="$option" ;;
|
|
|
|
verbose) verbose=1 ;;
|
|
|
|
legacy) legacy=1 ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# Find our upstream
|
|
|
|
case "$upstream" in
|
|
|
|
git) upstream="@{upstream}" ;;
|
|
|
|
svn*)
|
|
|
|
# get the upstream from the "git-svn-id: ..." in a commit message
|
|
|
|
# (git-svn uses essentially the same procedure internally)
|
|
|
|
local svn_upstream=($(git log --first-parent -1 \
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
|
2010-06-17 23:32:02 +02:00
|
|
|
if [[ 0 -ne ${#svn_upstream[@]} ]]; then
|
|
|
|
svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
|
|
|
|
svn_upstream=${svn_upstream%@*}
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
local n_stop="${#svn_remote[@]}"
|
|
|
|
for ((n=1; n <= n_stop; ++n)); do
|
2010-06-17 23:32:02 +02:00
|
|
|
svn_upstream=${svn_upstream#${svn_remote[$n]}}
|
|
|
|
done
|
|
|
|
|
|
|
|
if [[ -z "$svn_upstream" ]]; then
|
|
|
|
# default branch name for checkouts with no layout:
|
|
|
|
upstream=${GIT_SVN_ID:-git-svn}
|
|
|
|
else
|
|
|
|
upstream=${svn_upstream#/}
|
|
|
|
fi
|
|
|
|
elif [[ "svn+git" = "$upstream" ]]; then
|
|
|
|
upstream="@{upstream}"
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# Find how many commits we are ahead/behind our upstream
|
|
|
|
if [[ -z "$legacy" ]]; then
|
|
|
|
count="$(git rev-list --count --left-right \
|
|
|
|
"$upstream"...HEAD 2>/dev/null)"
|
|
|
|
else
|
|
|
|
# produce equivalent output to --count for older versions of git
|
|
|
|
local commits
|
|
|
|
if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
|
|
|
|
then
|
|
|
|
local commit behind=0 ahead=0
|
|
|
|
for commit in $commits
|
|
|
|
do
|
|
|
|
case "$commit" in
|
|
|
|
"<"*) let ++behind
|
|
|
|
;;
|
|
|
|
*) let ++ahead
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
count="$behind $ahead"
|
|
|
|
else
|
|
|
|
count=""
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
# calculate the result
|
|
|
|
if [[ -z "$verbose" ]]; then
|
|
|
|
case "$count" in
|
|
|
|
"") # no upstream
|
|
|
|
p="" ;;
|
|
|
|
"0 0") # equal to upstream
|
|
|
|
p="=" ;;
|
|
|
|
"0 "*) # ahead of upstream
|
|
|
|
p=">" ;;
|
|
|
|
*" 0") # behind upstream
|
|
|
|
p="<" ;;
|
|
|
|
*) # diverged from upstream
|
|
|
|
p="<>" ;;
|
|
|
|
esac
|
|
|
|
else
|
|
|
|
case "$count" in
|
|
|
|
"") # no upstream
|
|
|
|
p="" ;;
|
|
|
|
"0 0") # equal to upstream
|
|
|
|
p=" u=" ;;
|
|
|
|
"0 "*) # ahead of upstream
|
|
|
|
p=" u+${count#0 }" ;;
|
|
|
|
*" 0") # behind upstream
|
|
|
|
p=" u-${count% 0}" ;;
|
|
|
|
*) # diverged from upstream
|
|
|
|
p=" u+${count#* }-${count% *}" ;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
|
|
|
|
# returns text to add to bash PS1 prompt (includes branch name)
|
2006-11-27 09:41:28 +01:00
|
|
|
__git_ps1 ()
|
|
|
|
{
|
2009-02-11 19:03:23 +01:00
|
|
|
local g="$(__gitdir)"
|
2007-09-30 02:20:45 +02:00
|
|
|
if [ -n "$g" ]; then
|
2010-06-17 23:32:16 +02:00
|
|
|
local r=""
|
|
|
|
local b=""
|
2009-05-26 07:56:03 +02:00
|
|
|
if [ -f "$g/rebase-merge/interactive" ]; then
|
2007-09-30 02:20:45 +02:00
|
|
|
r="|REBASE-i"
|
2008-07-16 03:33:44 +02:00
|
|
|
b="$(cat "$g/rebase-merge/head-name")"
|
2009-02-11 19:03:24 +01:00
|
|
|
elif [ -d "$g/rebase-merge" ]; then
|
2007-09-30 02:20:45 +02:00
|
|
|
r="|REBASE-m"
|
2008-07-16 03:33:44 +02:00
|
|
|
b="$(cat "$g/rebase-merge/head-name")"
|
2007-09-30 02:20:45 +02:00
|
|
|
else
|
2009-05-26 07:56:03 +02:00
|
|
|
if [ -d "$g/rebase-apply" ]; then
|
|
|
|
if [ -f "$g/rebase-apply/rebasing" ]; then
|
|
|
|
r="|REBASE"
|
|
|
|
elif [ -f "$g/rebase-apply/applying" ]; then
|
|
|
|
r="|AM"
|
|
|
|
else
|
|
|
|
r="|AM/REBASE"
|
|
|
|
fi
|
|
|
|
elif [ -f "$g/MERGE_HEAD" ]; then
|
2009-05-16 20:46:22 +02:00
|
|
|
r="|MERGING"
|
2011-02-20 05:12:28 +01:00
|
|
|
elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
|
|
|
|
r="|CHERRY-PICKING"
|
2009-05-26 07:56:03 +02:00
|
|
|
elif [ -f "$g/BISECT_LOG" ]; then
|
2007-09-30 02:20:45 +02:00
|
|
|
r="|BISECTING"
|
|
|
|
fi
|
2009-05-10 10:53:19 +02:00
|
|
|
|
|
|
|
b="$(git symbolic-ref HEAD 2>/dev/null)" || {
|
2009-05-10 10:56:21 +02:00
|
|
|
|
|
|
|
b="$(
|
|
|
|
case "${GIT_PS1_DESCRIBE_STYLE-}" in
|
|
|
|
(contains)
|
|
|
|
git describe --contains HEAD ;;
|
|
|
|
(branch)
|
|
|
|
git describe --contains --all HEAD ;;
|
|
|
|
(describe)
|
|
|
|
git describe HEAD ;;
|
|
|
|
(* | default)
|
2010-12-01 14:17:00 +01:00
|
|
|
git describe --tags --exact-match HEAD ;;
|
2009-05-10 10:56:21 +02:00
|
|
|
esac 2>/dev/null)" ||
|
|
|
|
|
2009-05-10 10:53:19 +02:00
|
|
|
b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
|
|
|
|
b="unknown"
|
|
|
|
b="($b)"
|
|
|
|
}
|
2007-09-30 02:20:45 +02:00
|
|
|
fi
|
|
|
|
|
2010-06-17 23:32:16 +02:00
|
|
|
local w=""
|
|
|
|
local i=""
|
|
|
|
local s=""
|
|
|
|
local u=""
|
|
|
|
local c=""
|
2010-06-17 23:32:02 +02:00
|
|
|
local p=""
|
2009-02-03 10:20:54 +01:00
|
|
|
|
2009-02-11 19:03:25 +01:00
|
|
|
if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
|
2009-05-18 18:24:30 +02:00
|
|
|
if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
|
2009-02-21 15:48:43 +01:00
|
|
|
c="BARE:"
|
|
|
|
else
|
|
|
|
b="GIT_DIR!"
|
|
|
|
fi
|
2009-02-11 19:03:25 +01:00
|
|
|
elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
|
|
|
|
if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
|
|
|
|
if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
|
2009-12-31 12:48:41 +01:00
|
|
|
git diff --no-ext-diff --quiet --exit-code || w="*"
|
2009-02-11 19:03:25 +01:00
|
|
|
if git rev-parse --quiet --verify HEAD >/dev/null; then
|
2009-12-31 12:48:41 +01:00
|
|
|
git diff-index --cached --quiet HEAD -- || i="+"
|
2009-02-11 19:03:25 +01:00
|
|
|
else
|
|
|
|
i="#"
|
|
|
|
fi
|
2009-02-03 10:20:54 +01:00
|
|
|
fi
|
|
|
|
fi
|
2009-06-02 20:03:22 +02:00
|
|
|
if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
|
|
|
|
git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
|
|
|
|
fi
|
2009-07-22 10:31:34 +02:00
|
|
|
|
|
|
|
if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
|
|
|
|
if [ -n "$(git ls-files --others --exclude-standard)" ]; then
|
|
|
|
u="%"
|
|
|
|
fi
|
|
|
|
fi
|
2010-06-17 23:32:02 +02:00
|
|
|
|
|
|
|
if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
|
|
|
|
__git_ps1_show_upstream
|
|
|
|
fi
|
2009-02-03 10:20:54 +01:00
|
|
|
fi
|
|
|
|
|
2009-12-31 04:04:38 +01:00
|
|
|
local f="$w$i$s$u"
|
2010-06-17 23:32:02 +02:00
|
|
|
printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
|
2006-11-27 09:41:28 +01:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __gitcomp_1 requires 2 arguments
|
2008-07-13 04:37:42 +02:00
|
|
|
__gitcomp_1 ()
|
|
|
|
{
|
|
|
|
local c IFS=' '$'\t'$'\n'
|
|
|
|
for c in $1; do
|
|
|
|
case "$c$2" in
|
|
|
|
--*=*) printf %s$'\n' "$c$2" ;;
|
|
|
|
*.) printf %s$'\n' "$c$2" ;;
|
|
|
|
*) printf %s$'\n' "$c$2 " ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2010-12-15 05:57:58 +01:00
|
|
|
# The following function is based on code from:
|
|
|
|
#
|
|
|
|
# bash_completion - programmable completion functions for bash 3.2+
|
|
|
|
#
|
|
|
|
# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
|
|
|
|
# © 2009-2010, Bash Completion Maintainers
|
|
|
|
# <bash-completion-devel@lists.alioth.debian.org>
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
# any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
|
|
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
#
|
|
|
|
# The latest version of this software can be obtained here:
|
|
|
|
#
|
|
|
|
# http://bash-completion.alioth.debian.org/
|
|
|
|
#
|
|
|
|
# RELEASE: 2.x
|
|
|
|
|
|
|
|
# This function can be used to access a tokenized list of words
|
|
|
|
# on the command line:
|
|
|
|
#
|
|
|
|
# __git_reassemble_comp_words_by_ref '=:'
|
|
|
|
# if test "${words_[cword_-1]}" = -w
|
|
|
|
# then
|
|
|
|
# ...
|
|
|
|
# fi
|
|
|
|
#
|
|
|
|
# The argument should be a collection of characters from the list of
|
|
|
|
# word completion separators (COMP_WORDBREAKS) to treat as ordinary
|
|
|
|
# characters.
|
|
|
|
#
|
|
|
|
# This is roughly equivalent to going back in time and setting
|
|
|
|
# COMP_WORDBREAKS to exclude those characters. The intent is to
|
|
|
|
# make option types like --date=<type> and <rev>:<path> easy to
|
|
|
|
# recognize by treating each shell word as a single token.
|
|
|
|
#
|
|
|
|
# It is best not to set COMP_WORDBREAKS directly because the value is
|
|
|
|
# shared with other completion scripts. By the time the completion
|
|
|
|
# function gets called, COMP_WORDS has already been populated so local
|
|
|
|
# changes to COMP_WORDBREAKS have no effect.
|
|
|
|
#
|
|
|
|
# Output: words_, cword_, cur_.
|
|
|
|
|
|
|
|
__git_reassemble_comp_words_by_ref()
|
|
|
|
{
|
|
|
|
local exclude i j first
|
|
|
|
# Which word separators to exclude?
|
|
|
|
exclude="${1//[^$COMP_WORDBREAKS]}"
|
|
|
|
cword_=$COMP_CWORD
|
|
|
|
if [ -z "$exclude" ]; then
|
|
|
|
words_=("${COMP_WORDS[@]}")
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
# List of word completion separators has shrunk;
|
|
|
|
# re-assemble words to complete.
|
|
|
|
for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
|
|
|
|
# Append each nonempty word consisting of just
|
|
|
|
# word separator characters to the current word.
|
|
|
|
first=t
|
|
|
|
while
|
|
|
|
[ $i -gt 0 ] &&
|
|
|
|
[ -n "${COMP_WORDS[$i]}" ] &&
|
|
|
|
# word consists of excluded word separators
|
|
|
|
[ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
|
|
|
|
do
|
|
|
|
# Attach to the previous token,
|
|
|
|
# unless the previous token is the command name.
|
|
|
|
if [ $j -ge 2 ] && [ -n "$first" ]; then
|
|
|
|
((j--))
|
|
|
|
fi
|
|
|
|
first=
|
|
|
|
words_[$j]=${words_[j]}${COMP_WORDS[i]}
|
|
|
|
if [ $i = $COMP_CWORD ]; then
|
|
|
|
cword_=$j
|
|
|
|
fi
|
|
|
|
if (($i < ${#COMP_WORDS[@]} - 1)); then
|
|
|
|
((i++))
|
|
|
|
else
|
|
|
|
# Done.
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
words_[$j]=${words_[j]}${COMP_WORDS[i]}
|
|
|
|
if [ $i = $COMP_CWORD ]; then
|
|
|
|
cword_=$j
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
|
2010-12-15 07:05:33 +01:00
|
|
|
if [[ -z ${ZSH_VERSION:+set} ]]; then
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
_get_comp_words_by_ref ()
|
|
|
|
{
|
2010-12-15 05:57:58 +01:00
|
|
|
local exclude cur_ words_ cword_
|
|
|
|
if [ "$1" = "-n" ]; then
|
|
|
|
exclude=$2
|
|
|
|
shift 2
|
|
|
|
fi
|
|
|
|
__git_reassemble_comp_words_by_ref "$exclude"
|
|
|
|
cur_=${words_[cword_]}
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
case "$1" in
|
|
|
|
cur)
|
2010-12-15 05:57:58 +01:00
|
|
|
cur=$cur_
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
;;
|
|
|
|
prev)
|
2010-12-15 05:57:58 +01:00
|
|
|
prev=${words_[$cword_-1]}
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
;;
|
|
|
|
words)
|
2010-12-15 05:57:58 +01:00
|
|
|
words=("${words_[@]}")
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
;;
|
|
|
|
cword)
|
2010-12-15 05:57:58 +01:00
|
|
|
cword=$cword_
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
}
|
2010-12-15 07:05:33 +01:00
|
|
|
else
|
|
|
|
_get_comp_words_by_ref ()
|
|
|
|
{
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
case "$1" in
|
|
|
|
cur)
|
|
|
|
cur=${COMP_WORDS[COMP_CWORD]}
|
|
|
|
;;
|
|
|
|
prev)
|
|
|
|
prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
|
|
;;
|
|
|
|
words)
|
|
|
|
words=("${COMP_WORDS[@]}")
|
|
|
|
;;
|
|
|
|
cword)
|
|
|
|
cword=$COMP_CWORD
|
|
|
|
;;
|
|
|
|
-n)
|
|
|
|
# assume COMP_WORDBREAKS is already set sanely
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
}
|
|
|
|
fi
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
fi
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __gitcomp accepts 1, 2, 3, or 4 arguments
|
|
|
|
# generates completion reply with compgen
|
2007-02-04 08:38:27 +01:00
|
|
|
__gitcomp ()
|
|
|
|
{
|
2011-04-28 18:01:51 +02:00
|
|
|
local cur_="$cur"
|
|
|
|
|
2007-02-04 08:38:43 +01:00
|
|
|
if [ $# -gt 2 ]; then
|
2011-04-28 18:01:51 +02:00
|
|
|
cur_="$3"
|
2007-02-04 08:38:37 +01:00
|
|
|
fi
|
2011-04-28 18:01:51 +02:00
|
|
|
case "$cur_" in
|
2008-03-05 20:07:49 +01:00
|
|
|
--*=)
|
|
|
|
COMPREPLY=()
|
|
|
|
;;
|
|
|
|
*)
|
2008-07-13 04:37:42 +02:00
|
|
|
local IFS=$'\n'
|
2009-01-15 17:02:21 +01:00
|
|
|
COMPREPLY=($(compgen -P "${2-}" \
|
|
|
|
-W "$(__gitcomp_1 "${1-}" "${4-}")" \
|
2011-04-28 18:01:51 +02:00
|
|
|
-- "$cur_"))
|
2008-03-05 20:07:49 +01:00
|
|
|
;;
|
|
|
|
esac
|
2007-02-04 08:38:27 +01:00
|
|
|
}
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
|
2006-11-27 10:44:47 +01:00
|
|
|
__git_heads ()
|
|
|
|
{
|
2009-01-15 17:02:21 +01:00
|
|
|
local cmd i is_hash=y dir="$(__gitdir "${1-}")"
|
2006-11-27 10:44:47 +01:00
|
|
|
if [ -d "$dir" ]; then
|
2008-09-20 00:15:25 +02:00
|
|
|
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
|
|
|
|
refs/heads
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
fi
|
2009-01-15 17:02:21 +01:00
|
|
|
for i in $(git ls-remote "${1-}" 2>/dev/null); do
|
2006-11-27 10:44:47 +01:00
|
|
|
case "$is_hash,$i" in
|
|
|
|
y,*) is_hash=n ;;
|
|
|
|
n,*^{}) is_hash=y ;;
|
|
|
|
n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
|
|
|
|
n,*) is_hash=y; echo "$i" ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
|
2007-09-01 05:47:01 +02:00
|
|
|
__git_tags ()
|
|
|
|
{
|
2009-01-15 17:02:21 +01:00
|
|
|
local cmd i is_hash=y dir="$(__gitdir "${1-}")"
|
2007-09-01 05:47:01 +02:00
|
|
|
if [ -d "$dir" ]; then
|
2008-09-20 00:15:25 +02:00
|
|
|
git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
|
|
|
|
refs/tags
|
2007-09-01 05:47:01 +02:00
|
|
|
return
|
|
|
|
fi
|
2009-01-15 17:02:21 +01:00
|
|
|
for i in $(git ls-remote "${1-}" 2>/dev/null); do
|
2007-09-01 05:47:01 +02:00
|
|
|
case "$is_hash,$i" in
|
|
|
|
y,*) is_hash=n ;;
|
|
|
|
n,*^{}) is_hash=y ;;
|
|
|
|
n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
|
|
|
|
n,*) is_hash=y; echo "$i" ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2010-10-12 23:38:12 +02:00
|
|
|
# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
|
|
|
|
# presence of 2nd argument means use the guess heuristic employed
|
|
|
|
# by checkout for tracking branches
|
2006-09-28 11:31:25 +02:00
|
|
|
__git_refs ()
|
|
|
|
{
|
2010-10-12 23:38:12 +02:00
|
|
|
local i is_hash=y dir="$(__gitdir "${1-}")" track="${2-}"
|
2011-04-28 18:01:52 +02:00
|
|
|
local format refs
|
2006-11-05 12:21:57 +01:00
|
|
|
if [ -d "$dir" ]; then
|
2008-11-28 01:46:38 +01:00
|
|
|
case "$cur" in
|
|
|
|
refs|refs/*)
|
|
|
|
format="refname"
|
|
|
|
refs="${cur%/*}"
|
2010-10-12 23:38:12 +02:00
|
|
|
track=""
|
2008-11-28 01:46:38 +01:00
|
|
|
;;
|
|
|
|
*)
|
2010-03-17 10:20:35 +01:00
|
|
|
for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
|
|
|
|
if [ -e "$dir/$i" ]; then echo $i; fi
|
|
|
|
done
|
2008-11-28 01:46:38 +01:00
|
|
|
format="refname:short"
|
|
|
|
refs="refs/tags refs/heads refs/remotes"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
git --git-dir="$dir" for-each-ref --format="%($format)" \
|
|
|
|
$refs
|
2010-10-12 23:38:12 +02:00
|
|
|
if [ -n "$track" ]; then
|
|
|
|
# employ the heuristic used by git checkout
|
|
|
|
# Try to find a remote branch that matches the completion word
|
|
|
|
# but only output if the branch name is unique
|
|
|
|
local ref entry
|
|
|
|
git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
|
|
|
|
"refs/remotes/" | \
|
|
|
|
while read entry; do
|
|
|
|
eval "$entry"
|
|
|
|
ref="${ref#*/}"
|
|
|
|
if [[ "$ref" == "$cur"* ]]; then
|
|
|
|
echo "$ref"
|
|
|
|
fi
|
|
|
|
done | uniq -u
|
|
|
|
fi
|
2006-11-27 09:42:32 +01:00
|
|
|
return
|
2006-09-28 11:31:25 +02:00
|
|
|
fi
|
2008-04-20 19:28:44 +02:00
|
|
|
for i in $(git ls-remote "$dir" 2>/dev/null); do
|
2006-09-28 11:31:25 +02:00
|
|
|
case "$is_hash,$i" in
|
|
|
|
y,*) is_hash=n ;;
|
|
|
|
n,*^{}) is_hash=y ;;
|
|
|
|
n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
|
|
|
|
n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
|
2006-11-27 09:42:32 +01:00
|
|
|
n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
|
2006-09-28 11:31:25 +02:00
|
|
|
n,*) is_hash=y; echo "$i" ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __git_refs2 requires 1 argument (to pass to __git_refs)
|
2006-09-28 11:31:25 +02:00
|
|
|
__git_refs2 ()
|
|
|
|
{
|
2006-11-28 18:12:26 +01:00
|
|
|
local i
|
|
|
|
for i in $(__git_refs "$1"); do
|
|
|
|
echo "$i:$i"
|
2006-09-28 11:31:25 +02:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __git_refs_remotes requires 1 argument (to pass to ls-remote)
|
2006-11-27 10:44:47 +01:00
|
|
|
__git_refs_remotes ()
|
|
|
|
{
|
|
|
|
local cmd i is_hash=y
|
2008-04-20 19:28:44 +02:00
|
|
|
for i in $(git ls-remote "$1" 2>/dev/null); do
|
2006-11-27 10:44:47 +01:00
|
|
|
case "$is_hash,$i" in
|
|
|
|
n,refs/heads/*)
|
|
|
|
is_hash=y
|
|
|
|
echo "$i:refs/remotes/$1/${i#refs/heads/}"
|
|
|
|
;;
|
|
|
|
y,*) is_hash=n ;;
|
|
|
|
n,*^{}) is_hash=y ;;
|
|
|
|
n,refs/tags/*) is_hash=y;;
|
|
|
|
n,*) is_hash=y; ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
__git_remotes ()
|
|
|
|
{
|
2006-11-05 12:21:57 +01:00
|
|
|
local i ngoff IFS=$'\n' d="$(__gitdir)"
|
2011-04-27 23:27:04 +02:00
|
|
|
__git_shopt -q nullglob || ngoff=1
|
|
|
|
__git_shopt -s nullglob
|
2006-11-05 12:21:57 +01:00
|
|
|
for i in "$d/remotes"/*; do
|
|
|
|
echo ${i#$d/remotes/}
|
2006-09-28 11:31:25 +02:00
|
|
|
done
|
2011-04-27 23:27:04 +02:00
|
|
|
[ "$ngoff" ] && __git_shopt -u nullglob
|
2009-09-12 01:23:45 +02:00
|
|
|
for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
|
|
|
|
i="${i#remote.}"
|
|
|
|
echo "${i/.url*/}"
|
2006-11-05 12:21:03 +01:00
|
|
|
done
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_list_merge_strategies ()
|
2006-11-27 09:40:47 +01:00
|
|
|
{
|
2008-08-20 23:13:42 +02:00
|
|
|
git merge -s help 2>&1 |
|
|
|
|
sed -n -e '/[Aa]vailable strategies are: /,/^$/{
|
|
|
|
s/\.$//
|
|
|
|
s/.*://
|
|
|
|
s/^[ ]*//
|
|
|
|
s/[ ]*$//
|
2006-11-27 09:40:47 +01:00
|
|
|
p
|
2008-08-20 23:13:42 +02:00
|
|
|
}'
|
2006-11-27 09:40:47 +01:00
|
|
|
}
|
2009-11-18 01:49:10 +01:00
|
|
|
|
|
|
|
__git_merge_strategies=
|
|
|
|
# 'git merge -s help' (and thus detection of the merge strategy
|
|
|
|
# list) fails, unfortunately, if run outside of any git working
|
|
|
|
# tree. __git_merge_strategies is set to the empty string in
|
|
|
|
# that case, and the detection will be repeated the next time it
|
|
|
|
# is needed.
|
|
|
|
__git_compute_merge_strategies ()
|
|
|
|
{
|
|
|
|
: ${__git_merge_strategies:=$(__git_list_merge_strategies)}
|
|
|
|
}
|
2006-11-27 09:40:47 +01:00
|
|
|
|
bash: complete 'git diff ...branc<TAB>'
While doing a final sanity check before merging a topic Bsomething, it
is a good idea to review what damage Bsomething branch would make, by
running:
$ git diff ...Bsomething
Unfortunately, our completion script for 'git diff' doesn't offer
anything after '...'. This is because 'git diff's completion function
invokes __git_complete_file() for non-option arguments to complete the
'<tree>:<path>' extended SHA-1 notation, but this helper function
doesn't support refs after '...' or '..'. Completion of refs after
'...' or '..' is supported by the __git_complete_revlist() helper
function, but that doesn't support '<tree>:<path>'.
To support both '...<ref>' and '<tree>:<path>' notations for 'git
diff', this patch, instead of adding yet another helper function,
joins __git_complete_file() and __git_complete_revlist() into the new
common function __git_complete_revlist_file(). The old helper
functions __git_complete_file() and __git_complete_revlist() are
changed to be a direct wrapper around the new
__git_complete_revlist_file(), because they might be used in
user-supplied completion scripts and we don't want to break them.
This change will cause some wrong suggestions for other commands which
use __git_complete_file() ('git diff' and friends) or
__git_complete_revlist() ('git log' and friends), e.g. 'git diff
...master:Doc<TAB>' and 'git log master:Doc<TAB>' will complete the
path to 'Documentation/', although neither commands make any sense.
However, both of these were actively wrong to begin with as soon as
the user entered the ':', so there is no real harm done.
Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-10 19:12:29 +01:00
|
|
|
__git_complete_revlist_file ()
|
2006-09-28 11:31:25 +02:00
|
|
|
{
|
2011-04-28 18:01:52 +02:00
|
|
|
local pfx ls ref cur_="$cur"
|
2011-04-28 18:01:51 +02:00
|
|
|
case "$cur_" in
|
bash: complete 'git diff ...branc<TAB>'
While doing a final sanity check before merging a topic Bsomething, it
is a good idea to review what damage Bsomething branch would make, by
running:
$ git diff ...Bsomething
Unfortunately, our completion script for 'git diff' doesn't offer
anything after '...'. This is because 'git diff's completion function
invokes __git_complete_file() for non-option arguments to complete the
'<tree>:<path>' extended SHA-1 notation, but this helper function
doesn't support refs after '...' or '..'. Completion of refs after
'...' or '..' is supported by the __git_complete_revlist() helper
function, but that doesn't support '<tree>:<path>'.
To support both '...<ref>' and '<tree>:<path>' notations for 'git
diff', this patch, instead of adding yet another helper function,
joins __git_complete_file() and __git_complete_revlist() into the new
common function __git_complete_revlist_file(). The old helper
functions __git_complete_file() and __git_complete_revlist() are
changed to be a direct wrapper around the new
__git_complete_revlist_file(), because they might be used in
user-supplied completion scripts and we don't want to break them.
This change will cause some wrong suggestions for other commands which
use __git_complete_file() ('git diff' and friends) or
__git_complete_revlist() ('git log' and friends), e.g. 'git diff
...master:Doc<TAB>' and 'git log master:Doc<TAB>' will complete the
path to 'Documentation/', although neither commands make any sense.
However, both of these were actively wrong to begin with as soon as
the user entered the ':', so there is no real harm done.
Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-10 19:12:29 +01:00
|
|
|
*..?*:*)
|
|
|
|
return
|
|
|
|
;;
|
2006-09-28 11:31:25 +02:00
|
|
|
?*:*)
|
2011-04-28 18:01:51 +02:00
|
|
|
ref="${cur_%%:*}"
|
|
|
|
cur_="${cur_#*:}"
|
|
|
|
case "$cur_" in
|
2006-09-28 11:31:25 +02:00
|
|
|
?*/*)
|
2011-04-28 18:01:51 +02:00
|
|
|
pfx="${cur_%/*}"
|
|
|
|
cur_="${cur_##*/}"
|
2006-09-28 11:31:25 +02:00
|
|
|
ls="$ref:$pfx"
|
|
|
|
pfx="$pfx/"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
ls="$ref"
|
|
|
|
;;
|
2011-03-10 19:12:28 +01:00
|
|
|
esac
|
2008-07-15 07:52:04 +02:00
|
|
|
|
|
|
|
case "$COMP_WORDBREAKS" in
|
|
|
|
*:*) : great ;;
|
|
|
|
*) pfx="$ref:$pfx" ;;
|
|
|
|
esac
|
|
|
|
|
2008-07-14 02:22:03 +02:00
|
|
|
local IFS=$'\n'
|
2006-09-28 11:31:25 +02:00
|
|
|
COMPREPLY=($(compgen -P "$pfx" \
|
2006-11-05 12:21:57 +01:00
|
|
|
-W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
|
2008-07-14 02:22:03 +02:00
|
|
|
| sed '/^100... blob /{
|
|
|
|
s,^.* ,,
|
|
|
|
s,$, ,
|
|
|
|
}
|
|
|
|
/^120000 blob /{
|
|
|
|
s,^.* ,,
|
|
|
|
s,$, ,
|
|
|
|
}
|
2006-09-28 11:31:25 +02:00
|
|
|
/^040000 tree /{
|
|
|
|
s,^.* ,,
|
|
|
|
s,$,/,
|
|
|
|
}
|
|
|
|
s/^.* //')" \
|
2011-04-28 18:01:51 +02:00
|
|
|
-- "$cur_"))
|
2006-09-28 11:31:25 +02:00
|
|
|
;;
|
2006-11-27 09:41:43 +01:00
|
|
|
*...*)
|
2011-04-28 18:01:51 +02:00
|
|
|
pfx="${cur_%...*}..."
|
|
|
|
cur_="${cur_#*...}"
|
|
|
|
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
2006-11-27 09:41:43 +01:00
|
|
|
;;
|
|
|
|
*..*)
|
2011-04-28 18:01:51 +02:00
|
|
|
pfx="${cur_%..*}.."
|
|
|
|
cur_="${cur_#*..}"
|
|
|
|
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
2007-02-04 08:38:43 +01:00
|
|
|
;;
|
2006-11-27 09:41:43 +01:00
|
|
|
*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
2006-11-27 09:41:43 +01:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
bash: complete 'git diff ...branc<TAB>'
While doing a final sanity check before merging a topic Bsomething, it
is a good idea to review what damage Bsomething branch would make, by
running:
$ git diff ...Bsomething
Unfortunately, our completion script for 'git diff' doesn't offer
anything after '...'. This is because 'git diff's completion function
invokes __git_complete_file() for non-option arguments to complete the
'<tree>:<path>' extended SHA-1 notation, but this helper function
doesn't support refs after '...' or '..'. Completion of refs after
'...' or '..' is supported by the __git_complete_revlist() helper
function, but that doesn't support '<tree>:<path>'.
To support both '...<ref>' and '<tree>:<path>' notations for 'git
diff', this patch, instead of adding yet another helper function,
joins __git_complete_file() and __git_complete_revlist() into the new
common function __git_complete_revlist_file(). The old helper
functions __git_complete_file() and __git_complete_revlist() are
changed to be a direct wrapper around the new
__git_complete_revlist_file(), because they might be used in
user-supplied completion scripts and we don't want to break them.
This change will cause some wrong suggestions for other commands which
use __git_complete_file() ('git diff' and friends) or
__git_complete_revlist() ('git log' and friends), e.g. 'git diff
...master:Doc<TAB>' and 'git log master:Doc<TAB>' will complete the
path to 'Documentation/', although neither commands make any sense.
However, both of these were actively wrong to begin with as soon as
the user entered the ':', so there is no real harm done.
Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-10 19:12:29 +01:00
|
|
|
|
|
|
|
__git_complete_file ()
|
|
|
|
{
|
|
|
|
__git_complete_revlist_file
|
|
|
|
}
|
|
|
|
|
|
|
|
__git_complete_revlist ()
|
|
|
|
{
|
|
|
|
__git_complete_revlist_file
|
|
|
|
}
|
|
|
|
|
2009-03-06 05:39:31 +01:00
|
|
|
__git_complete_remote_or_refspec ()
|
|
|
|
{
|
2011-04-28 18:01:51 +02:00
|
|
|
local cur_="$cur" cmd="${words[1]}"
|
2009-03-06 05:39:33 +01:00
|
|
|
local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
while [ $c -lt $cword ]; do
|
|
|
|
i="${words[c]}"
|
2009-03-06 05:39:31 +01:00
|
|
|
case "$i" in
|
2009-12-12 11:21:46 +01:00
|
|
|
--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
|
|
|
|
--all)
|
|
|
|
case "$cmd" in
|
|
|
|
push) no_complete_refspec=1 ;;
|
|
|
|
fetch)
|
|
|
|
COMPREPLY=()
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
*) ;;
|
|
|
|
esac
|
|
|
|
;;
|
2009-03-06 05:39:31 +01:00
|
|
|
-*) ;;
|
|
|
|
*) remote="$i"; break ;;
|
|
|
|
esac
|
|
|
|
c=$((++c))
|
|
|
|
done
|
|
|
|
if [ -z "$remote" ]; then
|
|
|
|
__gitcomp "$(__git_remotes)"
|
|
|
|
return
|
|
|
|
fi
|
2009-03-06 05:39:33 +01:00
|
|
|
if [ $no_complete_refspec = 1 ]; then
|
|
|
|
COMPREPLY=()
|
|
|
|
return
|
|
|
|
fi
|
2009-03-06 05:39:31 +01:00
|
|
|
[ "$remote" = "." ] && remote=
|
2011-04-28 18:01:51 +02:00
|
|
|
case "$cur_" in
|
2009-03-06 05:39:31 +01:00
|
|
|
*:*)
|
|
|
|
case "$COMP_WORDBREAKS" in
|
|
|
|
*:*) : great ;;
|
2011-04-28 18:01:51 +02:00
|
|
|
*) pfx="${cur_%%:*}:" ;;
|
2009-03-06 05:39:31 +01:00
|
|
|
esac
|
2011-04-28 18:01:51 +02:00
|
|
|
cur_="${cur_#*:}"
|
2009-03-06 05:39:31 +01:00
|
|
|
lhs=0
|
|
|
|
;;
|
|
|
|
+*)
|
|
|
|
pfx="+"
|
2011-04-28 18:01:51 +02:00
|
|
|
cur_="${cur_#+}"
|
2009-03-06 05:39:31 +01:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
case "$cmd" in
|
|
|
|
fetch)
|
|
|
|
if [ $lhs = 1 ]; then
|
2011-04-28 18:01:51 +02:00
|
|
|
__gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
else
|
2011-04-28 18:01:51 +02:00
|
|
|
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
pull)
|
|
|
|
if [ $lhs = 1 ]; then
|
2011-04-28 18:01:51 +02:00
|
|
|
__gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
else
|
2011-04-28 18:01:51 +02:00
|
|
|
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
push)
|
|
|
|
if [ $lhs = 1 ]; then
|
2011-04-28 18:01:51 +02:00
|
|
|
__gitcomp "$(__git_refs)" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
else
|
2011-04-28 18:01:51 +02:00
|
|
|
__gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2009-03-06 17:30:44 +01:00
|
|
|
__git_complete_strategy ()
|
|
|
|
{
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_compute_merge_strategies
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
case "$prev" in
|
2009-03-06 17:30:44 +01:00
|
|
|
-s|--strategy)
|
2009-11-18 01:49:10 +01:00
|
|
|
__gitcomp "$__git_merge_strategies"
|
2009-03-06 17:30:44 +01:00
|
|
|
return 0
|
|
|
|
esac
|
|
|
|
case "$cur" in
|
|
|
|
--strategy=*)
|
2009-11-18 01:49:10 +01:00
|
|
|
__gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
|
2009-03-06 17:30:44 +01:00
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_list_all_commands ()
|
2006-11-27 09:41:01 +01:00
|
|
|
{
|
|
|
|
local i IFS=" "$'\n'
|
2009-10-09 08:21:43 +02:00
|
|
|
for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
|
2008-07-24 02:07:23 +02:00
|
|
|
do
|
|
|
|
case $i in
|
|
|
|
*--*) : helper pattern;;
|
|
|
|
*) echo $i;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_all_commands=
|
|
|
|
__git_compute_all_commands ()
|
|
|
|
{
|
|
|
|
: ${__git_all_commands:=$(__git_list_all_commands)}
|
|
|
|
}
|
|
|
|
|
|
|
|
__git_list_porcelain_commands ()
|
2008-07-24 02:07:23 +02:00
|
|
|
{
|
|
|
|
local i IFS=" "$'\n'
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_compute_all_commands
|
|
|
|
for i in "help" $__git_all_commands
|
2006-11-27 09:41:01 +01:00
|
|
|
do
|
|
|
|
case $i in
|
2007-12-15 12:11:54 +01:00
|
|
|
*--*) : helper pattern;;
|
2007-02-04 08:38:30 +01:00
|
|
|
applymbox) : ask gittus;;
|
|
|
|
applypatch) : ask gittus;;
|
|
|
|
archimport) : import;;
|
2007-02-04 08:38:21 +01:00
|
|
|
cat-file) : plumbing;;
|
2007-05-19 23:35:21 +02:00
|
|
|
check-attr) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
check-ref-format) : plumbing;;
|
2008-08-26 19:11:44 +02:00
|
|
|
checkout-index) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
commit-tree) : plumbing;;
|
2008-08-26 19:11:44 +02:00
|
|
|
count-objects) : infrequent;;
|
2007-02-04 08:38:30 +01:00
|
|
|
cvsexportcommit) : export;;
|
|
|
|
cvsimport) : import;;
|
2006-11-27 09:41:01 +01:00
|
|
|
cvsserver) : daemon;;
|
|
|
|
daemon) : daemon;;
|
2007-05-24 07:01:02 +02:00
|
|
|
diff-files) : plumbing;;
|
|
|
|
diff-index) : plumbing;;
|
|
|
|
diff-tree) : plumbing;;
|
2007-02-12 01:55:22 +01:00
|
|
|
fast-import) : import;;
|
2008-08-26 19:11:44 +02:00
|
|
|
fast-export) : export;;
|
2007-02-04 08:38:30 +01:00
|
|
|
fsck-objects) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
fetch-pack) : plumbing;;
|
2007-02-04 08:38:30 +01:00
|
|
|
fmt-merge-msg) : plumbing;;
|
2007-05-19 23:35:21 +02:00
|
|
|
for-each-ref) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
hash-object) : plumbing;;
|
|
|
|
http-*) : transport;;
|
|
|
|
index-pack) : plumbing;;
|
2007-02-04 08:38:30 +01:00
|
|
|
init-db) : deprecated;;
|
2006-11-27 09:41:01 +01:00
|
|
|
local-fetch) : plumbing;;
|
2008-08-26 19:11:44 +02:00
|
|
|
lost-found) : infrequent;;
|
|
|
|
ls-files) : plumbing;;
|
|
|
|
ls-remote) : plumbing;;
|
|
|
|
ls-tree) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
mailinfo) : plumbing;;
|
|
|
|
mailsplit) : plumbing;;
|
|
|
|
merge-*) : plumbing;;
|
|
|
|
mktree) : plumbing;;
|
|
|
|
mktag) : plumbing;;
|
|
|
|
pack-objects) : plumbing;;
|
|
|
|
pack-redundant) : plumbing;;
|
|
|
|
pack-refs) : plumbing;;
|
|
|
|
parse-remote) : plumbing;;
|
|
|
|
patch-id) : plumbing;;
|
|
|
|
peek-remote) : plumbing;;
|
2007-02-04 08:38:30 +01:00
|
|
|
prune) : plumbing;;
|
|
|
|
prune-packed) : plumbing;;
|
|
|
|
quiltimport) : import;;
|
2006-11-27 09:41:01 +01:00
|
|
|
read-tree) : plumbing;;
|
|
|
|
receive-pack) : plumbing;;
|
2010-01-22 11:54:51 +01:00
|
|
|
remote-*) : transport;;
|
2008-01-18 07:52:40 +01:00
|
|
|
repo-config) : deprecated;;
|
2006-11-27 09:41:01 +01:00
|
|
|
rerere) : plumbing;;
|
|
|
|
rev-list) : plumbing;;
|
|
|
|
rev-parse) : plumbing;;
|
|
|
|
runstatus) : plumbing;;
|
|
|
|
sh-setup) : internal;;
|
|
|
|
shell) : daemon;;
|
2008-08-26 19:11:44 +02:00
|
|
|
show-ref) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
send-pack) : plumbing;;
|
|
|
|
show-index) : plumbing;;
|
|
|
|
ssh-*) : transport;;
|
|
|
|
stripspace) : plumbing;;
|
|
|
|
symbolic-ref) : plumbing;;
|
2007-02-04 08:38:30 +01:00
|
|
|
tar-tree) : deprecated;;
|
2006-11-27 09:41:01 +01:00
|
|
|
unpack-file) : plumbing;;
|
|
|
|
unpack-objects) : plumbing;;
|
2007-02-04 08:38:30 +01:00
|
|
|
update-index) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
update-ref) : plumbing;;
|
|
|
|
update-server-info) : daemon;;
|
|
|
|
upload-archive) : plumbing;;
|
|
|
|
upload-pack) : plumbing;;
|
|
|
|
write-tree) : plumbing;;
|
2008-08-26 19:11:44 +02:00
|
|
|
var) : infrequent;;
|
|
|
|
verify-pack) : infrequent;;
|
2007-02-04 08:38:30 +01:00
|
|
|
verify-tag) : plumbing;;
|
2006-11-27 09:41:01 +01:00
|
|
|
*) echo $i;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
2009-11-18 01:49:10 +01:00
|
|
|
|
|
|
|
__git_porcelain_commands=
|
|
|
|
__git_compute_porcelain_commands ()
|
|
|
|
{
|
|
|
|
__git_compute_all_commands
|
|
|
|
: ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
|
|
|
|
}
|
2006-11-27 09:41:01 +01:00
|
|
|
|
2010-10-11 00:06:22 +02:00
|
|
|
__git_pretty_aliases ()
|
|
|
|
{
|
|
|
|
local i IFS=$'\n'
|
|
|
|
for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
|
|
|
|
case "$i" in
|
|
|
|
pretty.*)
|
|
|
|
i="${i#pretty.}"
|
|
|
|
echo "${i/ */}"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2006-10-28 14:12:20 +02:00
|
|
|
__git_aliases ()
|
|
|
|
{
|
2006-11-05 12:21:03 +01:00
|
|
|
local i IFS=$'\n'
|
2009-09-12 01:23:45 +02:00
|
|
|
for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
|
2009-10-09 08:21:44 +02:00
|
|
|
case "$i" in
|
|
|
|
alias.*)
|
|
|
|
i="${i#alias.}"
|
|
|
|
echo "${i/ */}"
|
|
|
|
;;
|
|
|
|
esac
|
2006-11-05 12:21:03 +01:00
|
|
|
done
|
2006-10-28 14:12:20 +02:00
|
|
|
}
|
|
|
|
|
2009-01-15 17:02:23 +01:00
|
|
|
# __git_aliased_command requires 1 argument
|
2006-10-28 14:12:20 +02:00
|
|
|
__git_aliased_command ()
|
|
|
|
{
|
2006-11-05 12:21:57 +01:00
|
|
|
local word cmdline=$(git --git-dir="$(__gitdir)" \
|
2007-01-29 01:16:53 +01:00
|
|
|
config --get "alias.$1")
|
2006-10-28 14:12:20 +02:00
|
|
|
for word in $cmdline; do
|
bash: improve aliased command recognition
To support completion for aliases, the completion script tries to
figure out which git command is invoked by an alias. Its
implementation in __git_aliased_command() is rather straightforward:
it returns the first word from the alias. For simple aliases starting
with the git command (e.g. alias.last = cat-file commit HEAD) this
gives the right results. Unfortunately, it does not work with shell
command aliases, which can get rather complex, as illustrated by one
of Junio's aliases:
[alias]
lgm = "!sh -c 'GIT_NOTES_REF=refs/notes/amlog git log \"$@\" || :' -"
In this case the current implementation returns "!sh" as the aliased
git command, which is obviosly wrong.
The full parsing of a shell command alias like that in the completion
code is clearly unfeasible. However, we can easily improve on aliased
command recognition by eleminating stuff that is definitely not a git
command: shell commands (anything starting with '!'), command line
options (anything starting with '-'), environment variables (anything
with a '=' in it), and git itself. This way the above alias would be
handled correctly, and the completion script would correctly recognize
"log" as the aliased git command.
Of course, this solution is not perfect either, and could be fooled
easily. It's not hard to construct an alias, in which a word does not
match any of these filter patterns, but is still not a git command
(e.g. by setting an environment variable to a value which contains
spaces). It may even return false positives, when the output of a git
command is piped into an other git command, and the second gets the
command line options via $@, but options for the first one are
offered. However, the following patches will enable the user to
supply custom completion scripts for aliases, which can be used to
remedy these problematic cases.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:57 +01:00
|
|
|
case "$word" in
|
2010-02-23 22:03:00 +01:00
|
|
|
\!gitk|gitk)
|
|
|
|
echo "gitk"
|
2006-10-28 14:12:20 +02:00
|
|
|
return
|
2010-02-23 22:03:00 +01:00
|
|
|
;;
|
bash: improve aliased command recognition
To support completion for aliases, the completion script tries to
figure out which git command is invoked by an alias. Its
implementation in __git_aliased_command() is rather straightforward:
it returns the first word from the alias. For simple aliases starting
with the git command (e.g. alias.last = cat-file commit HEAD) this
gives the right results. Unfortunately, it does not work with shell
command aliases, which can get rather complex, as illustrated by one
of Junio's aliases:
[alias]
lgm = "!sh -c 'GIT_NOTES_REF=refs/notes/amlog git log \"$@\" || :' -"
In this case the current implementation returns "!sh" as the aliased
git command, which is obviosly wrong.
The full parsing of a shell command alias like that in the completion
code is clearly unfeasible. However, we can easily improve on aliased
command recognition by eleminating stuff that is definitely not a git
command: shell commands (anything starting with '!'), command line
options (anything starting with '-'), environment variables (anything
with a '=' in it), and git itself. This way the above alias would be
handled correctly, and the completion script would correctly recognize
"log" as the aliased git command.
Of course, this solution is not perfect either, and could be fooled
easily. It's not hard to construct an alias, in which a word does not
match any of these filter patterns, but is still not a git command
(e.g. by setting an environment variable to a value which contains
spaces). It may even return false positives, when the output of a git
command is piped into an other git command, and the second gets the
command line options via $@, but options for the first one are
offered. However, the following patches will enable the user to
supply custom completion scripts for aliases, which can be used to
remedy these problematic cases.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:57 +01:00
|
|
|
\!*) : shell command alias ;;
|
|
|
|
-*) : option ;;
|
|
|
|
*=*) : setting env ;;
|
|
|
|
git) : git itself ;;
|
|
|
|
*)
|
|
|
|
echo "$word"
|
2006-10-28 14:12:20 +02:00
|
|
|
return
|
bash: improve aliased command recognition
To support completion for aliases, the completion script tries to
figure out which git command is invoked by an alias. Its
implementation in __git_aliased_command() is rather straightforward:
it returns the first word from the alias. For simple aliases starting
with the git command (e.g. alias.last = cat-file commit HEAD) this
gives the right results. Unfortunately, it does not work with shell
command aliases, which can get rather complex, as illustrated by one
of Junio's aliases:
[alias]
lgm = "!sh -c 'GIT_NOTES_REF=refs/notes/amlog git log \"$@\" || :' -"
In this case the current implementation returns "!sh" as the aliased
git command, which is obviosly wrong.
The full parsing of a shell command alias like that in the completion
code is clearly unfeasible. However, we can easily improve on aliased
command recognition by eleminating stuff that is definitely not a git
command: shell commands (anything starting with '!'), command line
options (anything starting with '-'), environment variables (anything
with a '=' in it), and git itself. This way the above alias would be
handled correctly, and the completion script would correctly recognize
"log" as the aliased git command.
Of course, this solution is not perfect either, and could be fooled
easily. It's not hard to construct an alias, in which a word does not
match any of these filter patterns, but is still not a git command
(e.g. by setting an environment variable to a value which contains
spaces). It may even return false positives, when the output of a git
command is piped into an other git command, and the second gets the
command line options via $@, but options for the first one are
offered. However, the following patches will enable the user to
supply custom completion scripts for aliases, which can be used to
remedy these problematic cases.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:57 +01:00
|
|
|
esac
|
2006-10-28 14:12:20 +02:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2009-09-15 12:21:43 +02:00
|
|
|
# __git_find_on_cmdline requires 1 argument
|
|
|
|
__git_find_on_cmdline ()
|
2008-03-10 16:02:23 +01:00
|
|
|
{
|
2011-04-28 18:01:52 +02:00
|
|
|
local word subcommand c=1
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
while [ $c -lt $cword ]; do
|
|
|
|
word="${words[c]}"
|
2008-03-10 16:02:23 +01:00
|
|
|
for subcommand in $1; do
|
|
|
|
if [ "$subcommand" = "$word" ]; then
|
|
|
|
echo "$subcommand"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
c=$((++c))
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash ()
|
|
|
|
{
|
2011-04-28 18:01:52 +02:00
|
|
|
local c=1
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
while [ $c -lt $cword ]; do
|
|
|
|
if [ "--" = "${words[c]}" ]; then
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
c=$((++c))
|
|
|
|
done
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2008-08-14 19:12:54 +02:00
|
|
|
__git_whitespacelist="nowarn warn error error-all fix"
|
2006-11-27 21:12:03 +01:00
|
|
|
|
|
|
|
_git_am ()
|
|
|
|
{
|
2011-04-28 18:01:52 +02:00
|
|
|
local dir="$(__gitdir)"
|
2008-07-21 12:51:02 +02:00
|
|
|
if [ -d "$dir"/rebase-apply ]; then
|
2010-02-12 15:11:47 +01:00
|
|
|
__gitcomp "--skip --continue --resolved --abort"
|
2006-11-27 21:12:03 +01:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
case "$cur" in
|
|
|
|
--whitespace=*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
|
2006-11-27 21:12:03 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "
|
2009-04-05 18:33:38 +02:00
|
|
|
--3way --committer-date-is-author-date --ignore-date
|
2009-08-04 13:16:49 +02:00
|
|
|
--ignore-whitespace --ignore-space-change
|
2009-04-05 18:33:38 +02:00
|
|
|
--interactive --keep --no-utf8 --signoff --utf8
|
2009-10-07 10:48:50 +02:00
|
|
|
--whitespace= --scissors
|
2007-02-04 08:38:43 +01:00
|
|
|
"
|
2006-11-27 21:12:03 +01:00
|
|
|
return
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
|
|
|
_git_apply ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--whitespace=*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
|
2006-11-27 21:12:03 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "
|
2006-11-27 21:12:03 +01:00
|
|
|
--stat --numstat --summary --check --index
|
|
|
|
--cached --index-info --reverse --reject --unidiff-zero
|
|
|
|
--apply --no-add --exclude=
|
2009-08-04 13:16:49 +02:00
|
|
|
--ignore-whitespace --ignore-space-change
|
2006-11-27 21:12:03 +01:00
|
|
|
--whitespace= --inaccurate-eof --verbose
|
2007-02-04 08:38:43 +01:00
|
|
|
"
|
2006-11-27 21:12:03 +01:00
|
|
|
return
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2007-02-04 08:38:23 +01:00
|
|
|
_git_add ()
|
|
|
|
{
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2007-02-04 08:38:23 +01:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2008-06-14 11:48:01 +02:00
|
|
|
__gitcomp "
|
|
|
|
--interactive --refresh --patch --update --dry-run
|
2008-12-10 20:39:17 +01:00
|
|
|
--ignore-errors --intent-to-add
|
2008-06-14 11:48:01 +02:00
|
|
|
"
|
2007-02-04 08:38:23 +01:00
|
|
|
return
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2008-08-05 07:50:36 +02:00
|
|
|
_git_archive ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--format=*)
|
|
|
|
__gitcomp "$(git archive --list)" "" "${cur##--format=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--remote=*)
|
|
|
|
__gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--format= --list --verbose
|
|
|
|
--prefix= --remote= --exec=
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
__git_complete_file
|
|
|
|
}
|
|
|
|
|
2007-02-05 21:44:37 +01:00
|
|
|
_git_bisect ()
|
|
|
|
{
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2008-07-02 15:29:50 +02:00
|
|
|
local subcommands="start bad good skip reset visualize replay log run"
|
2009-09-15 12:21:43 +02:00
|
|
|
local subcommand="$(__git_find_on_cmdline "$subcommands")"
|
2008-03-10 16:02:23 +01:00
|
|
|
if [ -z "$subcommand" ]; then
|
2010-10-10 23:39:34 +02:00
|
|
|
if [ -f "$(__gitdir)"/BISECT_START ]; then
|
|
|
|
__gitcomp "$subcommands"
|
|
|
|
else
|
|
|
|
__gitcomp "replay start"
|
|
|
|
fi
|
2007-02-05 21:44:37 +01:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
2008-03-10 16:02:23 +01:00
|
|
|
case "$subcommand" in
|
2010-10-10 23:39:33 +02:00
|
|
|
bad|good|reset|skip|start)
|
2007-02-05 21:44:37 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
COMPREPLY=()
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git_branch ()
|
|
|
|
{
|
2011-04-28 18:01:52 +02:00
|
|
|
local i c=1 only_local_ref="n" has_r="n"
|
2008-03-04 19:00:59 +01:00
|
|
|
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
while [ $c -lt $cword ]; do
|
|
|
|
i="${words[c]}"
|
2008-03-04 19:00:59 +01:00
|
|
|
case "$i" in
|
|
|
|
-d|-m) only_local_ref="y" ;;
|
|
|
|
-r) has_r="y" ;;
|
|
|
|
esac
|
|
|
|
c=$((++c))
|
|
|
|
done
|
|
|
|
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
case "$cur" in
|
2008-03-04 19:00:58 +01:00
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--color --no-color --verbose --abbrev= --no-abbrev
|
2008-07-07 22:41:54 +02:00
|
|
|
--track --no-track --contains --merged --no-merged
|
2010-05-26 10:46:41 +02:00
|
|
|
--set-upstream
|
2008-03-04 19:00:58 +01:00
|
|
|
"
|
|
|
|
;;
|
2008-03-04 19:00:59 +01:00
|
|
|
*)
|
|
|
|
if [ $only_local_ref = "y" -a $has_r = "n" ]; then
|
|
|
|
__gitcomp "$(__git_heads)"
|
|
|
|
else
|
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
fi
|
|
|
|
;;
|
2008-03-04 19:00:58 +01:00
|
|
|
esac
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2007-08-12 20:46:12 +02:00
|
|
|
_git_bundle ()
|
|
|
|
{
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
local cmd="${words[2]}"
|
|
|
|
case "$cword" in
|
2008-11-27 14:35:38 +01:00
|
|
|
2)
|
2007-08-12 20:46:12 +02:00
|
|
|
__gitcomp "create list-heads verify unbundle"
|
|
|
|
;;
|
2008-11-27 14:35:38 +01:00
|
|
|
3)
|
2007-08-12 20:46:12 +02:00
|
|
|
# looking for a file
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
case "$cmd" in
|
|
|
|
create)
|
|
|
|
__git_complete_revlist
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git_checkout ()
|
|
|
|
{
|
2008-07-23 13:49:22 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2009-09-24 14:23:15 +02:00
|
|
|
case "$cur" in
|
|
|
|
--conflict=*)
|
|
|
|
__gitcomp "diff3 merge" "" "${cur##--conflict=}"
|
|
|
|
;;
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--quiet --ours --theirs --track --no-track --merge
|
2010-05-22 02:43:52 +02:00
|
|
|
--conflict= --orphan --patch
|
2009-09-24 14:23:15 +02:00
|
|
|
"
|
|
|
|
;;
|
|
|
|
*)
|
2010-10-12 23:38:12 +02:00
|
|
|
# check if --track, --no-track, or --no-guess was specified
|
|
|
|
# if so, disable DWIM mode
|
|
|
|
local flags="--track --no-track --no-guess" track=1
|
|
|
|
if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
|
|
|
|
track=''
|
|
|
|
fi
|
|
|
|
__gitcomp "$(__git_refs '' $track)"
|
2009-09-24 14:23:15 +02:00
|
|
|
;;
|
|
|
|
esac
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2007-02-05 21:44:22 +01:00
|
|
|
_git_cherry ()
|
|
|
|
{
|
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
}
|
|
|
|
|
2006-11-27 09:41:59 +01:00
|
|
|
_git_cherry_pick ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "--edit --no-commit"
|
2006-11-27 09:41:59 +01:00
|
|
|
;;
|
|
|
|
*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
2006-11-27 09:41:59 +01:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2008-08-05 07:50:32 +02:00
|
|
|
_git_clean ()
|
|
|
|
{
|
|
|
|
__git_has_doubledash && return
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "--dry-run --quiet"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2008-08-05 07:50:31 +02:00
|
|
|
_git_clone ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--local
|
|
|
|
--no-hardlinks
|
|
|
|
--shared
|
|
|
|
--reference
|
|
|
|
--quiet
|
|
|
|
--no-checkout
|
|
|
|
--bare
|
|
|
|
--mirror
|
|
|
|
--origin
|
|
|
|
--upload-pack
|
|
|
|
--template=
|
|
|
|
--depth
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2006-11-28 18:12:08 +01:00
|
|
|
_git_commit ()
|
|
|
|
{
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2006-11-28 18:12:08 +01:00
|
|
|
case "$cur" in
|
2009-12-05 01:51:41 +01:00
|
|
|
--cleanup=*)
|
|
|
|
__gitcomp "default strip verbatim whitespace
|
|
|
|
" "" "${cur##--cleanup=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--reuse-message=*)
|
|
|
|
__gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--reedit-message=*)
|
|
|
|
__gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--untracked-files=*)
|
|
|
|
__gitcomp "all no normal" "" "${cur##--untracked-files=}"
|
|
|
|
return
|
|
|
|
;;
|
2006-11-28 18:12:08 +01:00
|
|
|
--*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "
|
2006-11-28 18:12:08 +01:00
|
|
|
--all --author= --signoff --verify --no-verify
|
2008-09-11 02:40:20 +02:00
|
|
|
--edit --amend --include --only --interactive
|
2009-12-05 01:51:41 +01:00
|
|
|
--dry-run --reuse-message= --reedit-message=
|
|
|
|
--reset-author --file= --message= --template=
|
|
|
|
--cleanup= --untracked-files --untracked-files=
|
|
|
|
--verbose --quiet
|
2007-02-04 08:38:43 +01:00
|
|
|
"
|
2006-11-28 18:12:08 +01:00
|
|
|
return
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2007-08-23 07:42:11 +02:00
|
|
|
_git_describe ()
|
|
|
|
{
|
2008-07-26 12:26:56 +02:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--all --tags --contains --abbrev= --candidates=
|
|
|
|
--exact-match --debug --long --match --always
|
|
|
|
"
|
|
|
|
return
|
|
|
|
esac
|
2007-08-23 07:42:11 +02:00
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
}
|
|
|
|
|
2009-01-19 22:18:00 +01:00
|
|
|
__git_diff_common_options="--stat --numstat --shortstat --summary
|
2007-11-23 02:11:35 +01:00
|
|
|
--patch-with-stat --name-only --name-status --color
|
|
|
|
--no-color --color-words --no-renames --check
|
2008-08-22 19:25:06 +02:00
|
|
|
--full-index --binary --abbrev --diff-filter=
|
2009-01-19 22:17:59 +01:00
|
|
|
--find-copies-harder
|
2007-11-23 02:11:35 +01:00
|
|
|
--text --ignore-space-at-eol --ignore-space-change
|
|
|
|
--ignore-all-space --exit-code --quiet --ext-diff
|
2008-04-06 18:56:08 +02:00
|
|
|
--no-ext-diff
|
|
|
|
--no-prefix --src-prefix= --dst-prefix=
|
2008-12-28 19:45:32 +01:00
|
|
|
--inter-hunk-context=
|
2009-01-01 17:39:37 +01:00
|
|
|
--patience
|
2009-01-19 22:18:00 +01:00
|
|
|
--raw
|
2009-10-07 10:48:51 +02:00
|
|
|
--dirstat --dirstat= --dirstat-by-file
|
|
|
|
--dirstat-by-file= --cumulative
|
2009-01-19 22:18:00 +01:00
|
|
|
"
|
|
|
|
|
|
|
|
_git_diff ()
|
|
|
|
{
|
|
|
|
__git_has_doubledash && return
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2009-03-22 00:29:27 +01:00
|
|
|
__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
|
2010-09-23 14:33:51 +02:00
|
|
|
--base --ours --theirs --no-index
|
2009-01-19 22:18:00 +01:00
|
|
|
$__git_diff_common_options
|
2008-04-06 18:56:08 +02:00
|
|
|
"
|
2007-11-23 02:11:35 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
bash: complete 'git diff ...branc<TAB>'
While doing a final sanity check before merging a topic Bsomething, it
is a good idea to review what damage Bsomething branch would make, by
running:
$ git diff ...Bsomething
Unfortunately, our completion script for 'git diff' doesn't offer
anything after '...'. This is because 'git diff's completion function
invokes __git_complete_file() for non-option arguments to complete the
'<tree>:<path>' extended SHA-1 notation, but this helper function
doesn't support refs after '...' or '..'. Completion of refs after
'...' or '..' is supported by the __git_complete_revlist() helper
function, but that doesn't support '<tree>:<path>'.
To support both '...<ref>' and '<tree>:<path>' notations for 'git
diff', this patch, instead of adding yet another helper function,
joins __git_complete_file() and __git_complete_revlist() into the new
common function __git_complete_revlist_file(). The old helper
functions __git_complete_file() and __git_complete_revlist() are
changed to be a direct wrapper around the new
__git_complete_revlist_file(), because they might be used in
user-supplied completion scripts and we don't want to break them.
This change will cause some wrong suggestions for other commands which
use __git_complete_file() ('git diff' and friends) or
__git_complete_revlist() ('git log' and friends), e.g. 'git diff
...master:Doc<TAB>' and 'git log master:Doc<TAB>' will complete the
path to 'Documentation/', although neither commands make any sense.
However, both of these were actively wrong to begin with as soon as
the user entered the ':', so there is no real harm done.
Suggested-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-10 19:12:29 +01:00
|
|
|
__git_complete_revlist_file
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2009-04-06 10:31:27 +02:00
|
|
|
__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
|
2011-02-27 12:32:46 +01:00
|
|
|
tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
|
2009-04-06 10:31:27 +02:00
|
|
|
"
|
|
|
|
|
|
|
|
_git_difftool ()
|
|
|
|
{
|
2009-10-28 10:45:38 +01:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2009-04-06 10:31:27 +02:00
|
|
|
case "$cur" in
|
|
|
|
--tool=*)
|
|
|
|
__gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
2009-10-28 10:45:38 +01:00
|
|
|
__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
|
|
|
|
--base --ours --theirs
|
|
|
|
--no-renames --diff-filter= --find-copies-harder
|
|
|
|
--relative --ignore-submodules
|
|
|
|
--tool="
|
2009-04-06 10:31:27 +02:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2009-10-28 10:45:38 +01:00
|
|
|
__git_complete_file
|
2009-04-06 10:31:27 +02:00
|
|
|
}
|
|
|
|
|
2009-03-06 05:39:33 +01:00
|
|
|
__git_fetch_options="
|
|
|
|
--quiet --verbose --append --upload-pack --force --keep --depth=
|
2009-12-12 11:21:46 +01:00
|
|
|
--tags --no-tags --all --prune --dry-run
|
2009-03-06 05:39:33 +01:00
|
|
|
"
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git_fetch ()
|
|
|
|
{
|
2009-03-06 05:39:33 +01:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "$__git_fetch_options"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2009-03-06 05:39:31 +01:00
|
|
|
__git_complete_remote_or_refspec
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2006-11-27 09:41:43 +01:00
|
|
|
_git_format_patch ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
2009-03-23 11:26:51 +01:00
|
|
|
--thread=*)
|
|
|
|
__gitcomp "
|
|
|
|
deep shallow
|
|
|
|
" "" "${cur##--thread=}"
|
|
|
|
return
|
|
|
|
;;
|
2006-11-27 09:41:43 +01:00
|
|
|
--*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "
|
2009-03-23 11:26:51 +01:00
|
|
|
--stdout --attach --no-attach --thread --thread=
|
2006-11-27 09:41:43 +01:00
|
|
|
--output-directory
|
|
|
|
--numbered --start-number
|
2007-08-23 07:39:22 +02:00
|
|
|
--numbered-files
|
2006-11-27 09:41:43 +01:00
|
|
|
--keep-subject
|
2010-06-16 07:59:26 +02:00
|
|
|
--signoff --signature --no-signature
|
2009-03-23 11:26:50 +01:00
|
|
|
--in-reply-to= --cc=
|
2006-11-27 09:41:43 +01:00
|
|
|
--full-index --binary
|
2007-02-04 08:38:47 +01:00
|
|
|
--not --all
|
2008-02-21 17:21:49 +01:00
|
|
|
--cover-letter
|
2008-04-06 18:56:08 +02:00
|
|
|
--no-prefix --src-prefix= --dst-prefix=
|
2009-01-16 17:02:04 +01:00
|
|
|
--inline --suffix= --ignore-if-in-upstream
|
|
|
|
--subject-prefix=
|
2007-02-04 08:38:43 +01:00
|
|
|
"
|
2006-11-27 09:41:43 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
__git_complete_revlist
|
|
|
|
}
|
|
|
|
|
2009-03-22 19:49:07 +01:00
|
|
|
_git_fsck ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--tags --root --unreachable --cache --no-reflogs --full
|
|
|
|
--strict --verbose --lost-found
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2007-02-05 21:44:28 +01:00
|
|
|
_git_gc ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2007-08-23 07:39:22 +02:00
|
|
|
__gitcomp "--prune --aggressive"
|
2007-02-05 21:44:28 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2010-02-23 22:03:00 +01:00
|
|
|
_git_gitk ()
|
|
|
|
{
|
|
|
|
_gitk
|
|
|
|
}
|
|
|
|
|
2008-08-02 02:56:33 +02:00
|
|
|
_git_grep ()
|
|
|
|
{
|
|
|
|
__git_has_doubledash && return
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--cached
|
|
|
|
--text --ignore-case --word-regexp --invert-match
|
2011-05-05 00:00:18 +02:00
|
|
|
--full-name --line-number
|
2008-08-02 02:56:33 +02:00
|
|
|
--extended-regexp --basic-regexp --fixed-strings
|
2011-05-09 23:52:05 +02:00
|
|
|
--perl-regexp
|
2008-08-02 02:56:33 +02:00
|
|
|
--files-with-matches --name-only
|
|
|
|
--files-without-match
|
grep: Add --max-depth option.
It is useful to grep directories non-recursively, e.g. when one wants to
look for all files in the toplevel directory, but not in any subdirectory,
or in Documentation/, but not in Documentation/technical/.
This patch adds support for --max-depth <depth> option to git-grep. If it is
given, git-grep descends at most <depth> levels of directories below paths
specified on the command line.
Note that if path specified on command line contains wildcards, this option
makes no sense, e.g.
$ git grep -l --max-depth 0 GNU -- 'contrib/*'
(note the quotes) will search all files in contrib/, even in
subdirectories, because '*' matches all files.
Documentation updates, bash-completion and simple test cases are also
provided.
Signed-off-by: Michał Kiedrowicz <michal.kiedrowicz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-07-22 19:52:15 +02:00
|
|
|
--max-depth
|
2008-08-02 02:56:33 +02:00
|
|
|
--count
|
|
|
|
--and --or --not --all-match
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2009-10-12 11:00:09 +02:00
|
|
|
|
|
|
|
__gitcomp "$(__git_refs)"
|
2008-08-02 02:56:33 +02:00
|
|
|
}
|
|
|
|
|
2008-07-24 02:07:23 +02:00
|
|
|
_git_help ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "--all --info --man --web"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_compute_all_commands
|
2011-03-21 10:25:06 +01:00
|
|
|
__gitcomp "$__git_all_commands $(__git_aliases)
|
2008-08-15 19:59:28 +02:00
|
|
|
attributes cli core-tutorial cvs-migration
|
|
|
|
diffcore gitk glossary hooks ignore modules
|
|
|
|
repository-layout tutorial tutorial-2
|
2008-10-20 19:31:38 +02:00
|
|
|
workflows
|
2008-08-15 19:59:28 +02:00
|
|
|
"
|
2008-07-24 02:07:23 +02:00
|
|
|
}
|
|
|
|
|
2008-08-05 07:50:33 +02:00
|
|
|
_git_init ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--shared=*)
|
|
|
|
__gitcomp "
|
|
|
|
false true umask group all world everybody
|
|
|
|
" "" "${cur##--shared=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
|
|
|
__gitcomp "--quiet --bare --template= --shared --shared="
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2008-08-05 07:50:37 +02:00
|
|
|
_git_ls_files ()
|
|
|
|
{
|
|
|
|
__git_has_doubledash && return
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "--cached --deleted --modified --others --ignored
|
|
|
|
--stage --directory --no-empty-directory --unmerged
|
|
|
|
--killed --exclude= --exclude-from=
|
|
|
|
--exclude-per-directory= --exclude-standard
|
|
|
|
--error-unmatch --with-tree= --full-name
|
|
|
|
--abbrev --ignored --exclude-per-directory
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git_ls_remote ()
|
|
|
|
{
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$(__git_remotes)"
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
_git_ls_tree ()
|
|
|
|
{
|
|
|
|
__git_complete_file
|
|
|
|
}
|
|
|
|
|
2009-02-16 17:34:56 +01:00
|
|
|
# Options that go well for log, shortlog and gitk
|
|
|
|
__git_log_common_options="
|
|
|
|
--not --all
|
|
|
|
--branches --tags --remotes
|
2009-07-13 17:11:45 +02:00
|
|
|
--first-parent --merges --no-merges
|
2009-02-16 17:34:56 +01:00
|
|
|
--max-count=
|
|
|
|
--max-age= --since= --after=
|
|
|
|
--min-age= --until= --before=
|
2011-03-23 10:38:51 +01:00
|
|
|
--min-parents= --max-parents=
|
|
|
|
--no-min-parents --no-max-parents
|
2009-02-16 17:34:56 +01:00
|
|
|
"
|
|
|
|
# Options that go well for log and gitk (not shortlog)
|
|
|
|
__git_log_gitk_options="
|
|
|
|
--dense --sparse --full-history
|
|
|
|
--simplify-merges --simplify-by-decoration
|
2011-04-14 19:53:13 +02:00
|
|
|
--left-right --notes --no-notes
|
2009-02-16 17:34:56 +01:00
|
|
|
"
|
|
|
|
# Options that go well for log and shortlog (not gitk)
|
|
|
|
__git_log_shortlog_options="
|
|
|
|
--author= --committer= --grep=
|
|
|
|
--all-match
|
|
|
|
"
|
|
|
|
|
2009-01-16 17:02:15 +01:00
|
|
|
__git_log_pretty_formats="oneline short medium full fuller email raw format:"
|
2009-05-04 08:25:34 +02:00
|
|
|
__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
|
2009-01-16 17:02:15 +01:00
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git_log ()
|
|
|
|
{
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2009-02-16 17:34:57 +01:00
|
|
|
local g="$(git rev-parse --git-dir 2>/dev/null)"
|
|
|
|
local merge=""
|
2009-03-30 13:27:37 +02:00
|
|
|
if [ -f "$g/MERGE_HEAD" ]; then
|
2009-02-16 17:34:57 +01:00
|
|
|
merge="--merge"
|
|
|
|
fi
|
2006-11-27 09:42:18 +01:00
|
|
|
case "$cur" in
|
|
|
|
--pretty=*)
|
2010-10-11 00:06:22 +02:00
|
|
|
__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
|
2007-02-04 08:38:43 +01:00
|
|
|
" "" "${cur##--pretty=}"
|
2006-11-27 09:42:18 +01:00
|
|
|
return
|
|
|
|
;;
|
2009-02-24 14:33:29 +01:00
|
|
|
--format=*)
|
2010-10-11 00:06:22 +02:00
|
|
|
__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
|
2009-02-24 14:33:29 +01:00
|
|
|
" "" "${cur##--format=}"
|
|
|
|
return
|
|
|
|
;;
|
2007-08-23 07:39:22 +02:00
|
|
|
--date=*)
|
2009-05-04 08:25:34 +02:00
|
|
|
__gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
|
2007-08-23 07:39:22 +02:00
|
|
|
return
|
|
|
|
;;
|
2009-10-07 10:48:50 +02:00
|
|
|
--decorate=*)
|
|
|
|
__gitcomp "long short" "" "${cur##--decorate=}"
|
|
|
|
return
|
|
|
|
;;
|
2006-11-27 09:42:18 +01:00
|
|
|
--*)
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "
|
2009-02-16 17:34:56 +01:00
|
|
|
$__git_log_common_options
|
|
|
|
$__git_log_shortlog_options
|
|
|
|
$__git_log_gitk_options
|
2007-05-24 07:51:30 +02:00
|
|
|
--root --topo-order --date-order --reverse
|
2009-06-03 22:20:58 +02:00
|
|
|
--follow --full-diff
|
2006-11-27 09:42:18 +01:00
|
|
|
--abbrev-commit --abbrev=
|
2007-08-23 07:39:22 +02:00
|
|
|
--relative-date --date=
|
2009-02-24 14:33:29 +01:00
|
|
|
--pretty= --format= --oneline
|
2009-02-16 17:34:56 +01:00
|
|
|
--cherry-pick
|
2008-06-19 23:15:53 +02:00
|
|
|
--graph
|
2009-10-07 10:48:50 +02:00
|
|
|
--decorate --decorate=
|
2009-01-19 22:18:00 +01:00
|
|
|
--walk-reflogs
|
2009-02-16 17:34:56 +01:00
|
|
|
--parents --children
|
2009-02-16 17:34:57 +01:00
|
|
|
$merge
|
2009-01-19 22:18:00 +01:00
|
|
|
$__git_diff_common_options
|
2009-01-19 22:17:59 +01:00
|
|
|
--pickaxe-all --pickaxe-regex
|
2007-02-04 08:38:43 +01:00
|
|
|
"
|
2006-11-27 09:42:18 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2006-11-27 09:41:43 +01:00
|
|
|
__git_complete_revlist
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2009-03-06 05:39:33 +01:00
|
|
|
__git_merge_options="
|
|
|
|
--no-commit --no-stat --log --no-log --squash --strategy
|
2009-11-11 05:49:07 +01:00
|
|
|
--commit --stat --no-squash --ff --no-ff --ff-only
|
2009-03-06 05:39:33 +01:00
|
|
|
"
|
|
|
|
|
2006-11-27 09:40:47 +01:00
|
|
|
_git_merge ()
|
|
|
|
{
|
2009-03-06 17:30:44 +01:00
|
|
|
__git_complete_strategy && return
|
|
|
|
|
2006-11-27 09:40:47 +01:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2009-03-06 05:39:33 +01:00
|
|
|
__gitcomp "$__git_merge_options"
|
2006-11-27 09:40:47 +01:00
|
|
|
return
|
|
|
|
esac
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
2006-11-27 09:40:47 +01:00
|
|
|
}
|
|
|
|
|
2008-08-15 00:41:10 +02:00
|
|
|
_git_mergetool ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--tool=*)
|
2009-04-06 10:31:27 +02:00
|
|
|
__gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
|
2008-08-15 00:41:10 +02:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
|
|
|
__gitcomp "--tool="
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git_merge_base ()
|
|
|
|
{
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2008-08-05 07:50:38 +02:00
|
|
|
_git_mv ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "--dry-run"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2006-11-27 09:41:12 +01:00
|
|
|
_git_name_rev ()
|
|
|
|
{
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "--tags --all --stdin"
|
2006-11-27 09:41:12 +01:00
|
|
|
}
|
|
|
|
|
2010-01-28 02:05:55 +01:00
|
|
|
_git_notes ()
|
|
|
|
{
|
2010-10-10 23:43:33 +02:00
|
|
|
local subcommands='add append copy edit list prune remove show'
|
|
|
|
local subcommand="$(__git_find_on_cmdline "$subcommands")"
|
2010-01-28 02:05:55 +01:00
|
|
|
|
2010-10-10 23:43:33 +02:00
|
|
|
case "$subcommand,$cur" in
|
|
|
|
,--*)
|
|
|
|
__gitcomp '--ref'
|
|
|
|
;;
|
|
|
|
,*)
|
2010-12-22 23:40:55 +01:00
|
|
|
case "${words[cword-1]}" in
|
2010-10-10 23:43:33 +02:00
|
|
|
--ref)
|
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__gitcomp "$subcommands --ref"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
;;
|
|
|
|
add,--reuse-message=*|append,--reuse-message=*)
|
|
|
|
__gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
|
|
|
|
;;
|
|
|
|
add,--reedit-message=*|append,--reedit-message=*)
|
|
|
|
__gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
|
|
|
|
;;
|
|
|
|
add,--*|append,--*)
|
|
|
|
__gitcomp '--file= --message= --reedit-message=
|
|
|
|
--reuse-message='
|
|
|
|
;;
|
|
|
|
copy,--*)
|
|
|
|
__gitcomp '--stdin'
|
|
|
|
;;
|
|
|
|
prune,--*)
|
|
|
|
__gitcomp '--dry-run --verbose'
|
|
|
|
;;
|
|
|
|
prune,*)
|
2010-01-28 02:05:55 +01:00
|
|
|
;;
|
|
|
|
*)
|
2010-12-22 23:40:55 +01:00
|
|
|
case "${words[cword-1]}" in
|
2010-10-10 23:43:33 +02:00
|
|
|
-m|-F)
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
;;
|
|
|
|
esac
|
2010-01-28 02:05:55 +01:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git_pull ()
|
|
|
|
{
|
2009-03-06 05:39:33 +01:00
|
|
|
__git_complete_strategy && return
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--rebase --no-rebase
|
|
|
|
$__git_merge_options
|
|
|
|
$__git_fetch_options
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2009-03-06 05:39:31 +01:00
|
|
|
__git_complete_remote_or_refspec
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
_git_push ()
|
|
|
|
{
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
case "$prev" in
|
2009-03-06 05:39:33 +01:00
|
|
|
--repo)
|
|
|
|
__gitcomp "$(__git_remotes)"
|
|
|
|
return
|
|
|
|
esac
|
|
|
|
case "$cur" in
|
|
|
|
--repo=*)
|
|
|
|
__gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--all --mirror --tags --dry-run --force --verbose
|
|
|
|
--receive-pack= --repo=
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2009-03-06 05:39:31 +01:00
|
|
|
__git_complete_remote_or_refspec
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2006-11-27 09:42:07 +01:00
|
|
|
_git_rebase ()
|
|
|
|
{
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
local dir="$(__gitdir)"
|
2008-07-21 12:51:02 +02:00
|
|
|
if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "--continue --skip --abort"
|
2006-11-27 09:42:07 +01:00
|
|
|
return
|
|
|
|
fi
|
2009-03-06 17:30:44 +01:00
|
|
|
__git_complete_strategy && return
|
2006-11-27 09:42:07 +01:00
|
|
|
case "$cur" in
|
2009-10-17 11:33:38 +02:00
|
|
|
--whitespace=*)
|
|
|
|
__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
|
|
|
|
return
|
|
|
|
;;
|
2006-11-27 09:42:07 +01:00
|
|
|
--*)
|
2009-10-17 11:33:38 +02:00
|
|
|
__gitcomp "
|
|
|
|
--onto --merge --strategy --interactive
|
|
|
|
--preserve-merges --stat --no-stat
|
|
|
|
--committer-date-is-author-date --ignore-date
|
|
|
|
--ignore-whitespace --whitespace=
|
2010-02-06 09:37:53 +01:00
|
|
|
--autosquash
|
2009-10-17 11:33:38 +02:00
|
|
|
"
|
|
|
|
|
2006-11-27 09:42:07 +01:00
|
|
|
return
|
|
|
|
esac
|
2007-02-04 08:38:43 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
2006-11-27 09:42:07 +01:00
|
|
|
}
|
|
|
|
|
2010-12-16 07:56:08 +01:00
|
|
|
_git_reflog ()
|
|
|
|
{
|
|
|
|
local subcommands="show delete expire"
|
|
|
|
local subcommand="$(__git_find_on_cmdline "$subcommands")"
|
|
|
|
|
|
|
|
if [ -z "$subcommand" ]; then
|
|
|
|
__gitcomp "$subcommands"
|
|
|
|
else
|
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2009-05-04 08:25:35 +02:00
|
|
|
__git_send_email_confirm_options="always never auto cc compose"
|
2009-06-18 14:31:32 +02:00
|
|
|
__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
|
2009-05-04 08:25:35 +02:00
|
|
|
|
2008-07-14 10:21:02 +02:00
|
|
|
_git_send_email ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
2009-05-04 08:25:35 +02:00
|
|
|
--confirm=*)
|
|
|
|
__gitcomp "
|
|
|
|
$__git_send_email_confirm_options
|
|
|
|
" "" "${cur##--confirm=}"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--suppress-cc=*)
|
|
|
|
__gitcomp "
|
|
|
|
$__git_send_email_suppresscc_options
|
|
|
|
" "" "${cur##--suppress-cc=}"
|
|
|
|
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
--smtp-encryption=*)
|
|
|
|
__gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
|
|
|
|
return
|
|
|
|
;;
|
2008-07-14 10:21:02 +02:00
|
|
|
--*)
|
2009-03-23 11:26:49 +01:00
|
|
|
__gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
|
2009-05-04 08:25:35 +02:00
|
|
|
--compose --confirm= --dry-run --envelope-sender
|
|
|
|
--from --identity
|
2008-07-14 10:21:02 +02:00
|
|
|
--in-reply-to --no-chain-reply-to --no-signed-off-by-cc
|
|
|
|
--no-suppress-from --no-thread --quiet
|
|
|
|
--signed-off-by-cc --smtp-pass --smtp-server
|
2009-05-04 08:25:35 +02:00
|
|
|
--smtp-server-port --smtp-encryption= --smtp-user
|
|
|
|
--subject --suppress-cc= --suppress-from --thread --to
|
2008-09-28 06:51:21 +02:00
|
|
|
--validate --no-validate"
|
2008-07-14 10:21:02 +02:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
bash: support user-supplied completion scripts for user's git commands
The bash completion script already provides support to complete
aliases, options and refs for aliases (if the alias can be traced back
to a supported git command by __git_aliased_command()), and the user's
custom git commands, but it does not support the options of the user's
custom git commands (of course; how could it know about the options of
a custom git command?). Users of such custom git commands could
extend git's bash completion script by writing functions to support
their commands, but they might have issues with it: they might not
have the rights to modify a system-wide git completion script, and
they will need to track and merge upstream changes in the future.
This patch addresses this by providing means for users to supply
custom completion scriplets for their custom git commands without
modifying the main git bash completion script.
Instead of having a huge hard-coded list of command-completion
function pairs (in _git()), the completion script will figure out
which completion function to call based on the command's name. That
is, when completing the options of 'git foo', the main completion
script will check whether the function '_git_foo' is declared, and if
declared, it will invoke that function to perform the completion. If
such a function is not declared, it will fall back to complete file
names. So, users will only need to provide this '_git_foo' completion
function in a separate file, source that file, and it will be used the
next time they press TAB after 'git foo '.
There are two git commands (stage and whatchanged), for which the
completion functions of other commands were used, therefore they
got their own completion function.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:58 +01:00
|
|
|
_git_stage ()
|
|
|
|
{
|
|
|
|
_git_add
|
|
|
|
}
|
|
|
|
|
2009-05-09 03:23:32 +02:00
|
|
|
__git_config_get_set_variables ()
|
|
|
|
{
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
local prevword word config_file= c=$cword
|
2009-05-09 03:23:32 +02:00
|
|
|
while [ $c -gt 1 ]; do
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
word="${words[c]}"
|
2009-05-09 03:23:32 +02:00
|
|
|
case "$word" in
|
|
|
|
--global|--system|--file=*)
|
|
|
|
config_file="$word"
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-f|--file)
|
|
|
|
config_file="$word $prevword"
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
prevword=$word
|
|
|
|
c=$((--c))
|
|
|
|
done
|
|
|
|
|
2009-06-30 07:08:38 +02:00
|
|
|
git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
|
|
|
|
while read line
|
|
|
|
do
|
|
|
|
case "$line" in
|
|
|
|
*.*=*)
|
|
|
|
echo "${line/=*/}"
|
2009-05-09 03:23:32 +02:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2007-01-29 01:16:53 +01:00
|
|
|
_git_config ()
|
2006-11-27 10:44:47 +01:00
|
|
|
{
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
case "$prev" in
|
2006-11-27 10:44:47 +01:00
|
|
|
branch.*.remote)
|
2007-02-04 08:38:37 +01:00
|
|
|
__gitcomp "$(__git_remotes)"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
branch.*.merge)
|
2007-02-04 08:38:37 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
remote.*.fetch)
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
local remote="${prev#remote.}"
|
2006-11-27 10:44:47 +01:00
|
|
|
remote="${remote%.fetch}"
|
2007-02-04 08:38:37 +01:00
|
|
|
__gitcomp "$(__git_refs_remotes "$remote")"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
remote.*.push)
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
local remote="${prev#remote.}"
|
2006-11-27 10:44:47 +01:00
|
|
|
remote="${remote%.push}"
|
2007-02-04 08:38:37 +01:00
|
|
|
__gitcomp "$(git --git-dir="$(__gitdir)" \
|
2006-11-27 10:44:47 +01:00
|
|
|
for-each-ref --format='%(refname):%(refname)' \
|
2007-02-04 08:38:37 +01:00
|
|
|
refs/heads)"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
pull.twohead|pull.octopus)
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_compute_merge_strategies
|
|
|
|
__gitcomp "$__git_merge_strategies"
|
2007-02-04 08:38:37 +01:00
|
|
|
return
|
|
|
|
;;
|
2009-04-25 13:46:14 +02:00
|
|
|
color.branch|color.diff|color.interactive|\
|
|
|
|
color.showbranch|color.status|color.ui)
|
2007-02-04 08:38:37 +01:00
|
|
|
__gitcomp "always never auto"
|
|
|
|
return
|
|
|
|
;;
|
2009-02-12 16:55:54 +01:00
|
|
|
color.pager)
|
|
|
|
__gitcomp "false true"
|
|
|
|
return
|
|
|
|
;;
|
2007-02-04 08:38:37 +01:00
|
|
|
color.*.*)
|
|
|
|
__gitcomp "
|
2008-12-15 18:45:49 +01:00
|
|
|
normal black red green yellow blue magenta cyan white
|
2007-02-04 08:38:37 +01:00
|
|
|
bold dim ul blink reverse
|
|
|
|
"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
2009-05-04 08:25:33 +02:00
|
|
|
help.format)
|
|
|
|
__gitcomp "man info web html"
|
|
|
|
return
|
|
|
|
;;
|
2009-05-04 08:25:34 +02:00
|
|
|
log.date)
|
|
|
|
__gitcomp "$__git_log_date_formats"
|
|
|
|
return
|
|
|
|
;;
|
2009-05-04 08:25:35 +02:00
|
|
|
sendemail.aliasesfiletype)
|
|
|
|
__gitcomp "mutt mailrc pine elm gnus"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
sendemail.confirm)
|
|
|
|
__gitcomp "$__git_send_email_confirm_options"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
sendemail.suppresscc)
|
|
|
|
__gitcomp "$__git_send_email_suppresscc_options"
|
|
|
|
return
|
|
|
|
;;
|
2009-05-09 03:23:32 +02:00
|
|
|
--get|--get-all|--unset|--unset-all)
|
|
|
|
__gitcomp "$(__git_config_get_set_variables)"
|
|
|
|
return
|
|
|
|
;;
|
2006-11-27 10:44:47 +01:00
|
|
|
*.*)
|
|
|
|
COMPREPLY=()
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2007-02-04 08:38:37 +01:00
|
|
|
__gitcomp "
|
2007-08-23 07:39:22 +02:00
|
|
|
--global --system --file=
|
2007-05-24 08:07:45 +02:00
|
|
|
--list --replace-all
|
2006-11-27 10:44:47 +01:00
|
|
|
--get --get-all --get-regexp
|
2007-02-05 21:44:32 +01:00
|
|
|
--add --unset --unset-all
|
2007-05-24 08:07:45 +02:00
|
|
|
--remove-section --rename-section
|
2007-02-04 08:38:37 +01:00
|
|
|
"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
branch.*.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur##*.}"
|
|
|
|
__gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
branch.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur#*.}"
|
|
|
|
__gitcomp "$(__git_heads)" "$pfx" "$cur_" "."
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
2009-05-04 08:25:32 +02:00
|
|
|
guitool.*.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur##*.}"
|
2009-05-04 08:25:32 +02:00
|
|
|
__gitcomp "
|
|
|
|
argprompt cmd confirm needsfile noconsole norescan
|
|
|
|
prompt revprompt revunmerged title
|
2011-04-28 18:01:51 +02:00
|
|
|
" "$pfx" "$cur_"
|
2009-05-04 08:25:32 +02:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
difftool.*.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur##*.}"
|
|
|
|
__gitcomp "cmd path" "$pfx" "$cur_"
|
2009-05-04 08:25:32 +02:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
man.*.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur##*.}"
|
|
|
|
__gitcomp "cmd path" "$pfx" "$cur_"
|
2009-05-04 08:25:32 +02:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
mergetool.*.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur##*.}"
|
|
|
|
__gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
|
2009-05-04 08:25:32 +02:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
pager.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur#*.}"
|
2009-11-18 01:49:10 +01:00
|
|
|
__git_compute_all_commands
|
2011-04-28 18:01:51 +02:00
|
|
|
__gitcomp "$__git_all_commands" "$pfx" "$cur_"
|
2009-05-04 08:25:32 +02:00
|
|
|
return
|
|
|
|
;;
|
2006-11-27 10:44:47 +01:00
|
|
|
remote.*.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur##*.}"
|
2007-05-24 08:07:45 +02:00
|
|
|
__gitcomp "
|
2008-12-15 18:45:49 +01:00
|
|
|
url proxy fetch push mirror skipDefaultUpdate
|
2009-06-30 06:24:24 +02:00
|
|
|
receivepack uploadpack tagopt pushurl
|
2011-04-28 18:01:51 +02:00
|
|
|
" "$pfx" "$cur_"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
remote.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur#*.}"
|
|
|
|
__gitcomp "$(__git_remotes)" "$pfx" "$cur_" "."
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
2009-05-04 08:25:32 +02:00
|
|
|
url.*.*)
|
2011-04-28 18:01:51 +02:00
|
|
|
local pfx="${cur%.*}." cur_="${cur##*.}"
|
|
|
|
__gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
|
2009-05-04 08:25:32 +02:00
|
|
|
return
|
|
|
|
;;
|
2006-11-27 10:44:47 +01:00
|
|
|
esac
|
2007-02-04 08:38:37 +01:00
|
|
|
__gitcomp "
|
2010-12-20 16:18:25 +01:00
|
|
|
add.ignoreErrors
|
|
|
|
advice.commitBeforeMerge
|
|
|
|
advice.detachedHead
|
|
|
|
advice.implicitIdentity
|
|
|
|
advice.pushNonFastForward
|
|
|
|
advice.resolveConflict
|
|
|
|
advice.statusHints
|
2009-05-04 08:25:31 +02:00
|
|
|
alias.
|
2010-12-20 16:18:25 +01:00
|
|
|
am.keepcr
|
2009-08-04 13:16:49 +02:00
|
|
|
apply.ignorewhitespace
|
2006-11-27 10:44:47 +01:00
|
|
|
apply.whitespace
|
2008-12-15 18:45:49 +01:00
|
|
|
branch.autosetupmerge
|
|
|
|
branch.autosetuprebase
|
2010-12-20 16:18:25 +01:00
|
|
|
browser.
|
2007-04-24 02:18:16 +02:00
|
|
|
clean.requireForce
|
2007-02-04 08:38:37 +01:00
|
|
|
color.branch
|
|
|
|
color.branch.current
|
|
|
|
color.branch.local
|
|
|
|
color.branch.plain
|
2008-12-15 18:45:48 +01:00
|
|
|
color.branch.remote
|
2010-12-20 16:18:25 +01:00
|
|
|
color.decorate.HEAD
|
|
|
|
color.decorate.branch
|
|
|
|
color.decorate.remoteBranch
|
|
|
|
color.decorate.stash
|
|
|
|
color.decorate.tag
|
2006-12-13 10:13:28 +01:00
|
|
|
color.diff
|
2008-12-15 18:45:48 +01:00
|
|
|
color.diff.commit
|
2007-02-04 08:38:37 +01:00
|
|
|
color.diff.frag
|
2010-12-20 16:18:25 +01:00
|
|
|
color.diff.func
|
2008-12-15 18:45:48 +01:00
|
|
|
color.diff.meta
|
2007-02-04 08:38:37 +01:00
|
|
|
color.diff.new
|
2008-12-15 18:45:48 +01:00
|
|
|
color.diff.old
|
|
|
|
color.diff.plain
|
2007-02-04 08:38:37 +01:00
|
|
|
color.diff.whitespace
|
2009-05-04 08:25:31 +02:00
|
|
|
color.grep
|
2010-12-20 16:18:25 +01:00
|
|
|
color.grep.context
|
|
|
|
color.grep.filename
|
|
|
|
color.grep.function
|
|
|
|
color.grep.linenumber
|
2009-05-04 08:25:31 +02:00
|
|
|
color.grep.match
|
2010-12-20 16:18:25 +01:00
|
|
|
color.grep.selected
|
|
|
|
color.grep.separator
|
2008-12-15 18:45:49 +01:00
|
|
|
color.interactive
|
2010-12-20 16:18:25 +01:00
|
|
|
color.interactive.error
|
2008-12-15 18:45:49 +01:00
|
|
|
color.interactive.header
|
|
|
|
color.interactive.help
|
|
|
|
color.interactive.prompt
|
2006-12-13 10:13:28 +01:00
|
|
|
color.pager
|
2009-04-25 13:46:14 +02:00
|
|
|
color.showbranch
|
2006-12-13 10:13:28 +01:00
|
|
|
color.status
|
2007-02-04 08:38:37 +01:00
|
|
|
color.status.added
|
|
|
|
color.status.changed
|
2008-12-15 18:45:48 +01:00
|
|
|
color.status.header
|
2008-12-15 18:45:49 +01:00
|
|
|
color.status.nobranch
|
2007-02-04 08:38:37 +01:00
|
|
|
color.status.untracked
|
2008-12-15 18:45:49 +01:00
|
|
|
color.status.updated
|
|
|
|
color.ui
|
2010-12-20 16:18:25 +01:00
|
|
|
commit.status
|
2008-12-15 18:45:49 +01:00
|
|
|
commit.template
|
2010-12-20 16:18:25 +01:00
|
|
|
core.abbrevguard
|
|
|
|
core.askpass
|
|
|
|
core.attributesfile
|
2008-12-15 18:45:49 +01:00
|
|
|
core.autocrlf
|
|
|
|
core.bare
|
2010-12-20 16:18:25 +01:00
|
|
|
core.bigFileThreshold
|
2008-12-15 18:45:48 +01:00
|
|
|
core.compression
|
2009-05-04 08:25:31 +02:00
|
|
|
core.createObject
|
2008-12-15 18:45:49 +01:00
|
|
|
core.deltaBaseCacheLimit
|
|
|
|
core.editor
|
2010-12-20 16:18:25 +01:00
|
|
|
core.eol
|
2008-12-15 18:45:49 +01:00
|
|
|
core.excludesfile
|
2008-12-15 18:45:48 +01:00
|
|
|
core.fileMode
|
2008-12-15 18:45:49 +01:00
|
|
|
core.fsyncobjectfiles
|
2008-12-15 18:45:48 +01:00
|
|
|
core.gitProxy
|
2008-12-15 18:45:49 +01:00
|
|
|
core.ignoreCygwinFSTricks
|
2008-12-15 18:45:48 +01:00
|
|
|
core.ignoreStat
|
2010-12-20 16:18:25 +01:00
|
|
|
core.ignorecase
|
2008-12-15 18:45:48 +01:00
|
|
|
core.logAllRefUpdates
|
|
|
|
core.loosecompression
|
2010-12-20 16:18:25 +01:00
|
|
|
core.notesRef
|
2008-12-15 18:45:48 +01:00
|
|
|
core.packedGitLimit
|
|
|
|
core.packedGitWindowSize
|
2008-12-15 18:45:49 +01:00
|
|
|
core.pager
|
2008-12-15 18:45:48 +01:00
|
|
|
core.preferSymlinkRefs
|
2008-12-15 18:45:49 +01:00
|
|
|
core.preloadindex
|
|
|
|
core.quotepath
|
2008-12-15 18:45:48 +01:00
|
|
|
core.repositoryFormatVersion
|
2008-12-15 18:45:49 +01:00
|
|
|
core.safecrlf
|
2008-12-15 18:45:48 +01:00
|
|
|
core.sharedRepository
|
2010-12-20 16:18:25 +01:00
|
|
|
core.sparseCheckout
|
2008-12-15 18:45:49 +01:00
|
|
|
core.symlinks
|
|
|
|
core.trustctime
|
2008-12-15 18:45:48 +01:00
|
|
|
core.warnAmbiguousRefs
|
2008-12-15 18:45:49 +01:00
|
|
|
core.whitespace
|
|
|
|
core.worktree
|
|
|
|
diff.autorefreshindex
|
|
|
|
diff.external
|
2010-12-20 16:18:25 +01:00
|
|
|
diff.ignoreSubmodules
|
2008-12-15 18:45:49 +01:00
|
|
|
diff.mnemonicprefix
|
2010-12-20 16:18:25 +01:00
|
|
|
diff.noprefix
|
2007-02-04 08:38:37 +01:00
|
|
|
diff.renameLimit
|
|
|
|
diff.renames
|
2009-05-04 08:25:31 +02:00
|
|
|
diff.suppressBlankEmpty
|
|
|
|
diff.tool
|
|
|
|
diff.wordRegex
|
2009-05-04 08:25:32 +02:00
|
|
|
difftool.
|
2009-05-04 08:25:31 +02:00
|
|
|
difftool.prompt
|
2010-12-20 16:18:25 +01:00
|
|
|
fetch.recurseSubmodules
|
2007-02-04 08:38:37 +01:00
|
|
|
fetch.unpackLimit
|
2009-05-04 08:25:31 +02:00
|
|
|
format.attach
|
|
|
|
format.cc
|
2007-02-04 08:38:37 +01:00
|
|
|
format.headers
|
2008-12-15 18:45:49 +01:00
|
|
|
format.numbered
|
|
|
|
format.pretty
|
2010-06-16 07:59:26 +02:00
|
|
|
format.signature
|
2009-05-04 08:25:31 +02:00
|
|
|
format.signoff
|
|
|
|
format.subjectprefix
|
2008-12-15 18:45:49 +01:00
|
|
|
format.suffix
|
2009-05-04 08:25:31 +02:00
|
|
|
format.thread
|
2010-12-20 16:18:25 +01:00
|
|
|
format.to
|
|
|
|
gc.
|
2008-12-15 18:45:49 +01:00
|
|
|
gc.aggressiveWindow
|
|
|
|
gc.auto
|
|
|
|
gc.autopacklimit
|
2007-05-24 08:07:45 +02:00
|
|
|
gc.packrefs
|
2008-12-15 18:45:49 +01:00
|
|
|
gc.pruneexpire
|
2007-02-04 08:38:37 +01:00
|
|
|
gc.reflogexpire
|
|
|
|
gc.reflogexpireunreachable
|
|
|
|
gc.rerereresolved
|
|
|
|
gc.rerereunresolved
|
2008-12-15 18:45:48 +01:00
|
|
|
gitcvs.allbinary
|
2009-05-04 08:25:31 +02:00
|
|
|
gitcvs.commitmsgannotation
|
2008-12-15 18:45:49 +01:00
|
|
|
gitcvs.dbTableNamePrefix
|
2008-12-15 18:45:48 +01:00
|
|
|
gitcvs.dbdriver
|
|
|
|
gitcvs.dbname
|
|
|
|
gitcvs.dbpass
|
|
|
|
gitcvs.dbuser
|
|
|
|
gitcvs.enabled
|
|
|
|
gitcvs.logfile
|
2008-12-15 18:45:49 +01:00
|
|
|
gitcvs.usecrlfattr
|
2009-05-04 08:25:32 +02:00
|
|
|
guitool.
|
2008-12-15 18:45:49 +01:00
|
|
|
gui.blamehistoryctx
|
|
|
|
gui.commitmsgwidth
|
|
|
|
gui.copyblamethreshold
|
|
|
|
gui.diffcontext
|
|
|
|
gui.encoding
|
|
|
|
gui.fastcopyblame
|
|
|
|
gui.matchtrackingbranch
|
|
|
|
gui.newbranchtemplate
|
|
|
|
gui.pruneduringfetch
|
|
|
|
gui.spellingdictionary
|
|
|
|
gui.trustmtime
|
|
|
|
help.autocorrect
|
|
|
|
help.browser
|
|
|
|
help.format
|
2007-02-04 08:38:37 +01:00
|
|
|
http.lowSpeedLimit
|
|
|
|
http.lowSpeedTime
|
2008-12-15 18:45:48 +01:00
|
|
|
http.maxRequests
|
2010-12-20 16:18:25 +01:00
|
|
|
http.minSessions
|
2006-11-27 10:44:47 +01:00
|
|
|
http.noEPSV
|
2010-12-20 16:18:25 +01:00
|
|
|
http.postBuffer
|
2008-12-15 18:45:49 +01:00
|
|
|
http.proxy
|
2008-12-15 18:45:48 +01:00
|
|
|
http.sslCAInfo
|
|
|
|
http.sslCAPath
|
|
|
|
http.sslCert
|
2010-12-20 16:18:25 +01:00
|
|
|
http.sslCertPasswordProtected
|
2008-12-15 18:45:48 +01:00
|
|
|
http.sslKey
|
|
|
|
http.sslVerify
|
2010-12-20 16:18:25 +01:00
|
|
|
http.useragent
|
2007-02-04 08:38:37 +01:00
|
|
|
i18n.commitEncoding
|
|
|
|
i18n.logOutputEncoding
|
2010-12-20 16:18:25 +01:00
|
|
|
imap.authMethod
|
2009-05-04 08:25:31 +02:00
|
|
|
imap.folder
|
|
|
|
imap.host
|
|
|
|
imap.pass
|
|
|
|
imap.port
|
|
|
|
imap.preformattedHTML
|
|
|
|
imap.sslverify
|
|
|
|
imap.tunnel
|
|
|
|
imap.user
|
2010-12-20 16:18:25 +01:00
|
|
|
init.templatedir
|
2008-12-15 18:45:49 +01:00
|
|
|
instaweb.browser
|
|
|
|
instaweb.httpd
|
|
|
|
instaweb.local
|
|
|
|
instaweb.modulepath
|
|
|
|
instaweb.port
|
2009-05-04 08:25:31 +02:00
|
|
|
interactive.singlekey
|
2008-12-15 18:45:49 +01:00
|
|
|
log.date
|
2010-12-20 16:18:25 +01:00
|
|
|
log.decorate
|
2007-02-04 08:38:37 +01:00
|
|
|
log.showroot
|
2009-05-04 08:25:31 +02:00
|
|
|
mailmap.file
|
2009-05-04 08:25:32 +02:00
|
|
|
man.
|
2008-12-15 18:45:49 +01:00
|
|
|
man.viewer
|
2010-12-20 16:18:25 +01:00
|
|
|
merge.
|
2008-12-15 18:45:49 +01:00
|
|
|
merge.conflictstyle
|
|
|
|
merge.log
|
|
|
|
merge.renameLimit
|
2010-12-20 16:18:25 +01:00
|
|
|
merge.renormalize
|
2008-12-15 18:45:49 +01:00
|
|
|
merge.stat
|
2008-12-15 18:45:48 +01:00
|
|
|
merge.tool
|
2007-02-04 08:38:37 +01:00
|
|
|
merge.verbosity
|
2009-05-04 08:25:32 +02:00
|
|
|
mergetool.
|
2008-12-15 18:45:49 +01:00
|
|
|
mergetool.keepBackup
|
2010-12-20 16:18:25 +01:00
|
|
|
mergetool.keepTemporaries
|
2009-05-04 08:25:31 +02:00
|
|
|
mergetool.prompt
|
2010-12-20 16:18:25 +01:00
|
|
|
notes.displayRef
|
|
|
|
notes.rewrite.
|
|
|
|
notes.rewrite.amend
|
|
|
|
notes.rewrite.rebase
|
|
|
|
notes.rewriteMode
|
|
|
|
notes.rewriteRef
|
2007-08-23 07:39:22 +02:00
|
|
|
pack.compression
|
|
|
|
pack.deltaCacheLimit
|
2008-12-15 18:45:48 +01:00
|
|
|
pack.deltaCacheSize
|
|
|
|
pack.depth
|
2008-12-15 18:45:49 +01:00
|
|
|
pack.indexVersion
|
|
|
|
pack.packSizeLimit
|
|
|
|
pack.threads
|
2008-12-15 18:45:48 +01:00
|
|
|
pack.window
|
|
|
|
pack.windowMemory
|
2009-05-04 08:25:32 +02:00
|
|
|
pager.
|
2010-12-20 16:18:25 +01:00
|
|
|
pretty.
|
2007-02-04 08:38:37 +01:00
|
|
|
pull.octopus
|
|
|
|
pull.twohead
|
2009-05-04 08:25:31 +02:00
|
|
|
push.default
|
2010-12-20 16:18:25 +01:00
|
|
|
rebase.autosquash
|
2009-05-04 08:25:31 +02:00
|
|
|
rebase.stat
|
2010-12-20 16:18:25 +01:00
|
|
|
receive.autogc
|
2008-12-15 18:45:49 +01:00
|
|
|
receive.denyCurrentBranch
|
2010-12-20 16:18:25 +01:00
|
|
|
receive.denyDeleteCurrent
|
2008-12-15 18:45:49 +01:00
|
|
|
receive.denyDeletes
|
2008-12-15 18:45:48 +01:00
|
|
|
receive.denyNonFastForwards
|
2008-12-15 18:45:49 +01:00
|
|
|
receive.fsckObjects
|
2008-12-15 18:45:48 +01:00
|
|
|
receive.unpackLimit
|
2010-12-20 16:18:25 +01:00
|
|
|
receive.updateserverinfo
|
|
|
|
remotes.
|
2008-12-15 18:45:49 +01:00
|
|
|
repack.usedeltabaseoffset
|
|
|
|
rerere.autoupdate
|
|
|
|
rerere.enabled
|
2010-12-20 16:18:25 +01:00
|
|
|
sendemail.
|
2009-05-04 08:25:31 +02:00
|
|
|
sendemail.aliasesfile
|
2010-12-20 16:18:25 +01:00
|
|
|
sendemail.aliasfiletype
|
2009-05-04 08:25:31 +02:00
|
|
|
sendemail.bcc
|
|
|
|
sendemail.cc
|
|
|
|
sendemail.cccmd
|
|
|
|
sendemail.chainreplyto
|
|
|
|
sendemail.confirm
|
|
|
|
sendemail.envelopesender
|
2010-12-20 16:18:25 +01:00
|
|
|
sendemail.from
|
|
|
|
sendemail.identity
|
2009-05-04 08:25:31 +02:00
|
|
|
sendemail.multiedit
|
|
|
|
sendemail.signedoffbycc
|
2010-12-20 16:18:25 +01:00
|
|
|
sendemail.smtpdomain
|
2009-05-04 08:25:31 +02:00
|
|
|
sendemail.smtpencryption
|
|
|
|
sendemail.smtppass
|
|
|
|
sendemail.smtpserver
|
2010-12-20 16:18:25 +01:00
|
|
|
sendemail.smtpserveroption
|
2009-05-04 08:25:31 +02:00
|
|
|
sendemail.smtpserverport
|
|
|
|
sendemail.smtpuser
|
|
|
|
sendemail.suppresscc
|
|
|
|
sendemail.suppressfrom
|
|
|
|
sendemail.thread
|
|
|
|
sendemail.to
|
|
|
|
sendemail.validate
|
2007-02-04 08:38:37 +01:00
|
|
|
showbranch.default
|
2008-12-15 18:45:49 +01:00
|
|
|
status.relativePaths
|
|
|
|
status.showUntrackedFiles
|
2010-12-20 16:18:25 +01:00
|
|
|
status.submodulesummary
|
|
|
|
submodule.
|
2007-02-04 08:38:37 +01:00
|
|
|
tar.umask
|
|
|
|
transfer.unpackLimit
|
2009-05-04 08:25:32 +02:00
|
|
|
url.
|
2007-02-04 08:38:37 +01:00
|
|
|
user.email
|
2008-12-15 18:45:48 +01:00
|
|
|
user.name
|
2007-02-04 08:38:37 +01:00
|
|
|
user.signingkey
|
2008-12-15 18:45:49 +01:00
|
|
|
web.browser
|
2006-11-27 10:44:47 +01:00
|
|
|
branch. remote.
|
2007-02-04 08:38:37 +01:00
|
|
|
"
|
2006-11-27 10:44:47 +01:00
|
|
|
}
|
|
|
|
|
2007-02-05 05:52:08 +01:00
|
|
|
_git_remote ()
|
|
|
|
{
|
2009-02-25 09:32:25 +01:00
|
|
|
local subcommands="add rename rm show prune update set-head"
|
2009-09-15 12:21:43 +02:00
|
|
|
local subcommand="$(__git_find_on_cmdline "$subcommands")"
|
2008-03-10 16:02:23 +01:00
|
|
|
if [ -z "$subcommand" ]; then
|
2008-04-20 21:34:07 +02:00
|
|
|
__gitcomp "$subcommands"
|
2007-02-05 05:52:08 +01:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
2008-03-10 16:02:23 +01:00
|
|
|
case "$subcommand" in
|
2009-01-21 20:14:55 +01:00
|
|
|
rename|rm|show|prune)
|
2007-02-05 05:52:08 +01:00
|
|
|
__gitcomp "$(__git_remotes)"
|
|
|
|
;;
|
2007-05-24 07:46:49 +02:00
|
|
|
update)
|
|
|
|
local i c='' IFS=$'\n'
|
2009-09-12 01:23:45 +02:00
|
|
|
for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
|
|
|
|
i="${i#remotes.}"
|
|
|
|
c="$c ${i/ */}"
|
2007-05-24 07:46:49 +02:00
|
|
|
done
|
|
|
|
__gitcomp "$c"
|
|
|
|
;;
|
2007-02-05 05:52:08 +01:00
|
|
|
*)
|
|
|
|
COMPREPLY=()
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
2009-10-09 22:49:06 +02:00
|
|
|
_git_replace ()
|
|
|
|
{
|
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
}
|
|
|
|
|
2006-11-04 19:57:44 +01:00
|
|
|
_git_reset ()
|
|
|
|
{
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2007-02-04 08:38:43 +01:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2009-09-15 12:21:45 +02:00
|
|
|
__gitcomp "--merge --mixed --hard --soft --patch"
|
2007-02-04 08:38:43 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
__gitcomp "$(__git_refs)"
|
2006-11-04 19:57:44 +01:00
|
|
|
}
|
|
|
|
|
2008-08-05 07:50:34 +02:00
|
|
|
_git_revert ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "--edit --mainline --no-edit --no-commit --signoff"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2008-11-27 14:35:53 +01:00
|
|
|
__gitcomp "$(__git_refs)"
|
2008-08-05 07:50:34 +02:00
|
|
|
}
|
|
|
|
|
2008-07-23 23:21:08 +02:00
|
|
|
_git_rm ()
|
|
|
|
{
|
|
|
|
__git_has_doubledash && return
|
|
|
|
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "--cached --dry-run --ignore-unmatch --quiet"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
COMPREPLY=()
|
|
|
|
}
|
|
|
|
|
2007-05-24 07:25:34 +02:00
|
|
|
_git_shortlog ()
|
|
|
|
{
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2007-05-24 07:25:34 +02:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
2009-02-16 17:34:56 +01:00
|
|
|
$__git_log_common_options
|
|
|
|
$__git_log_shortlog_options
|
2007-05-24 07:25:34 +02:00
|
|
|
--numbered --summary
|
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
__git_complete_revlist
|
|
|
|
}
|
|
|
|
|
2006-12-15 08:20:03 +01:00
|
|
|
_git_show ()
|
|
|
|
{
|
2008-10-31 01:04:46 +01:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2006-12-15 08:20:03 +01:00
|
|
|
case "$cur" in
|
|
|
|
--pretty=*)
|
2010-10-11 00:06:22 +02:00
|
|
|
__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
|
2007-02-04 08:38:43 +01:00
|
|
|
" "" "${cur##--pretty=}"
|
2006-12-15 08:20:03 +01:00
|
|
|
return
|
|
|
|
;;
|
2009-02-24 14:33:29 +01:00
|
|
|
--format=*)
|
2010-10-11 00:06:22 +02:00
|
|
|
__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
|
2009-02-24 14:33:29 +01:00
|
|
|
" "" "${cur##--format=}"
|
|
|
|
return
|
|
|
|
;;
|
2006-12-15 08:20:03 +01:00
|
|
|
--*)
|
2009-05-17 05:42:43 +02:00
|
|
|
__gitcomp "--pretty= --format= --abbrev-commit --oneline
|
2009-01-19 22:18:00 +01:00
|
|
|
$__git_diff_common_options
|
|
|
|
"
|
2006-12-15 08:20:03 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
__git_complete_file
|
|
|
|
}
|
|
|
|
|
2008-07-23 23:36:15 +02:00
|
|
|
_git_show_branch ()
|
|
|
|
{
|
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--all --remotes --topo-order --current --more=
|
|
|
|
--list --independent --merge-base --no-name
|
2009-04-25 13:46:14 +02:00
|
|
|
--color --no-color
|
2009-05-17 05:42:43 +02:00
|
|
|
--sha1-name --sparse --topics --reflog
|
2008-07-23 23:36:15 +02:00
|
|
|
"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
__git_complete_revlist
|
|
|
|
}
|
|
|
|
|
2007-08-03 11:04:37 +02:00
|
|
|
_git_stash ()
|
|
|
|
{
|
2009-09-15 12:21:44 +02:00
|
|
|
local save_opts='--keep-index --no-keep-index --quiet --patch'
|
2008-08-05 07:50:35 +02:00
|
|
|
local subcommands='save list show apply clear drop pop create branch'
|
2009-09-15 12:21:43 +02:00
|
|
|
local subcommand="$(__git_find_on_cmdline "$subcommands")"
|
2008-06-27 16:37:15 +02:00
|
|
|
if [ -z "$subcommand" ]; then
|
2009-09-15 12:21:44 +02:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "$save_opts"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
|
|
|
|
__gitcomp "$subcommands"
|
|
|
|
else
|
|
|
|
COMPREPLY=()
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
2008-06-27 16:37:15 +02:00
|
|
|
else
|
|
|
|
case "$subcommand,$cur" in
|
|
|
|
save,--*)
|
2009-09-15 12:21:44 +02:00
|
|
|
__gitcomp "$save_opts"
|
2008-06-27 16:37:15 +02:00
|
|
|
;;
|
2009-06-09 00:57:39 +02:00
|
|
|
apply,--*|pop,--*)
|
2009-09-15 12:21:44 +02:00
|
|
|
__gitcomp "--index --quiet"
|
2008-08-05 07:50:35 +02:00
|
|
|
;;
|
2009-06-09 00:57:39 +02:00
|
|
|
show,--*|drop,--*|branch,--*)
|
2008-08-05 07:50:35 +02:00
|
|
|
COMPREPLY=()
|
|
|
|
;;
|
|
|
|
show,*|apply,*|drop,*|pop,*|branch,*)
|
|
|
|
__gitcomp "$(git --git-dir="$(__gitdir)" stash list \
|
|
|
|
| sed -n -e 's/:.*//p')"
|
|
|
|
;;
|
2008-06-27 16:37:15 +02:00
|
|
|
*)
|
|
|
|
COMPREPLY=()
|
|
|
|
;;
|
|
|
|
esac
|
2008-03-10 16:02:23 +01:00
|
|
|
fi
|
2007-08-03 11:04:37 +02:00
|
|
|
}
|
|
|
|
|
2007-08-23 07:50:49 +02:00
|
|
|
_git_submodule ()
|
|
|
|
{
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2008-08-28 10:57:55 +02:00
|
|
|
local subcommands="add status init update summary foreach sync"
|
2009-09-15 12:21:43 +02:00
|
|
|
if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
|
2007-08-23 07:50:49 +02:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
|
|
|
__gitcomp "--quiet --cached"
|
|
|
|
;;
|
|
|
|
*)
|
2008-03-10 16:02:23 +01:00
|
|
|
__gitcomp "$subcommands"
|
2007-08-23 07:50:49 +02:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2008-03-10 16:02:25 +01:00
|
|
|
_git_svn ()
|
|
|
|
{
|
|
|
|
local subcommands="
|
|
|
|
init fetch clone rebase dcommit log find-rev
|
|
|
|
set-tree commit-diff info create-ignore propget
|
2009-02-14 17:21:53 +01:00
|
|
|
proplist show-ignore show-externals branch tag blame
|
2009-12-30 01:58:48 +01:00
|
|
|
migrate mkdirs reset gc
|
2008-03-10 16:02:25 +01:00
|
|
|
"
|
2009-09-15 12:21:43 +02:00
|
|
|
local subcommand="$(__git_find_on_cmdline "$subcommands")"
|
2008-03-10 16:02:25 +01:00
|
|
|
if [ -z "$subcommand" ]; then
|
|
|
|
__gitcomp "$subcommands"
|
|
|
|
else
|
|
|
|
local remote_opts="--username= --config-dir= --no-auth-cache"
|
|
|
|
local fc_opts="
|
|
|
|
--follow-parent --authors-file= --repack=
|
|
|
|
--no-metadata --use-svm-props --use-svnsync-props
|
|
|
|
--log-window-size= --no-checkout --quiet
|
2009-02-14 17:21:53 +01:00
|
|
|
--repack-flags --use-log-author --localtime
|
|
|
|
--ignore-paths= $remote_opts
|
2008-03-10 16:02:25 +01:00
|
|
|
"
|
|
|
|
local init_opts="
|
|
|
|
--template= --shared= --trunk= --tags=
|
|
|
|
--branches= --stdlayout --minimize-url
|
|
|
|
--no-metadata --use-svm-props --use-svnsync-props
|
2009-02-14 17:21:53 +01:00
|
|
|
--rewrite-root= --prefix= --use-log-author
|
|
|
|
--add-author-from $remote_opts
|
2008-03-10 16:02:25 +01:00
|
|
|
"
|
|
|
|
local cmt_opts="
|
|
|
|
--edit --rmdir --find-copies-harder --copy-similarity=
|
|
|
|
"
|
|
|
|
|
|
|
|
case "$subcommand,$cur" in
|
|
|
|
fetch,--*)
|
|
|
|
__gitcomp "--revision= --fetch-all $fc_opts"
|
|
|
|
;;
|
|
|
|
clone,--*)
|
|
|
|
__gitcomp "--revision= $fc_opts $init_opts"
|
|
|
|
;;
|
|
|
|
init,--*)
|
|
|
|
__gitcomp "$init_opts"
|
|
|
|
;;
|
|
|
|
dcommit,--*)
|
|
|
|
__gitcomp "
|
|
|
|
--merge --strategy= --verbose --dry-run
|
2009-02-14 17:21:53 +01:00
|
|
|
--fetch-all --no-rebase --commit-url
|
|
|
|
--revision $cmt_opts $fc_opts
|
2008-03-10 16:02:25 +01:00
|
|
|
"
|
|
|
|
;;
|
|
|
|
set-tree,--*)
|
|
|
|
__gitcomp "--stdin $cmt_opts $fc_opts"
|
|
|
|
;;
|
|
|
|
create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
|
2009-12-30 01:58:48 +01:00
|
|
|
show-externals,--*|mkdirs,--*)
|
2008-03-10 16:02:25 +01:00
|
|
|
__gitcomp "--revision="
|
|
|
|
;;
|
|
|
|
log,--*)
|
|
|
|
__gitcomp "
|
|
|
|
--limit= --revision= --verbose --incremental
|
|
|
|
--oneline --show-commit --non-recursive
|
2009-02-14 17:21:53 +01:00
|
|
|
--authors-file= --color
|
2008-03-10 16:02:25 +01:00
|
|
|
"
|
|
|
|
;;
|
|
|
|
rebase,--*)
|
|
|
|
__gitcomp "
|
|
|
|
--merge --verbose --strategy= --local
|
2009-02-14 17:21:53 +01:00
|
|
|
--fetch-all --dry-run $fc_opts
|
2008-03-10 16:02:25 +01:00
|
|
|
"
|
|
|
|
;;
|
|
|
|
commit-diff,--*)
|
|
|
|
__gitcomp "--message= --file= --revision= $cmt_opts"
|
|
|
|
;;
|
|
|
|
info,--*)
|
|
|
|
__gitcomp "--url"
|
|
|
|
;;
|
2009-02-14 17:21:53 +01:00
|
|
|
branch,--*)
|
|
|
|
__gitcomp "--dry-run --message --tag"
|
|
|
|
;;
|
|
|
|
tag,--*)
|
|
|
|
__gitcomp "--dry-run --message"
|
|
|
|
;;
|
|
|
|
blame,--*)
|
|
|
|
__gitcomp "--git-format"
|
|
|
|
;;
|
|
|
|
migrate,--*)
|
|
|
|
__gitcomp "
|
|
|
|
--config-dir= --ignore-paths= --minimize
|
|
|
|
--no-auth-cache --username=
|
|
|
|
"
|
|
|
|
;;
|
2009-12-30 01:58:48 +01:00
|
|
|
reset,--*)
|
|
|
|
__gitcomp "--revision= --parent"
|
|
|
|
;;
|
2008-03-10 16:02:25 +01:00
|
|
|
*)
|
|
|
|
COMPREPLY=()
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2007-09-01 05:47:01 +02:00
|
|
|
_git_tag ()
|
|
|
|
{
|
|
|
|
local i c=1 f=0
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
while [ $c -lt $cword ]; do
|
|
|
|
i="${words[c]}"
|
2007-09-01 05:47:01 +02:00
|
|
|
case "$i" in
|
|
|
|
-d|-v)
|
|
|
|
__gitcomp "$(__git_tags)"
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
-f)
|
|
|
|
f=1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
c=$((++c))
|
|
|
|
done
|
|
|
|
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
case "$prev" in
|
2007-09-01 05:47:01 +02:00
|
|
|
-m|-F)
|
|
|
|
COMPREPLY=()
|
|
|
|
;;
|
2008-11-27 14:35:38 +01:00
|
|
|
-*|tag)
|
2007-09-01 05:47:01 +02:00
|
|
|
if [ $f = 1 ]; then
|
|
|
|
__gitcomp "$(__git_tags)"
|
|
|
|
else
|
|
|
|
COMPREPLY=()
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__gitcomp "$(__git_refs)"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
bash: support user-supplied completion scripts for user's git commands
The bash completion script already provides support to complete
aliases, options and refs for aliases (if the alias can be traced back
to a supported git command by __git_aliased_command()), and the user's
custom git commands, but it does not support the options of the user's
custom git commands (of course; how could it know about the options of
a custom git command?). Users of such custom git commands could
extend git's bash completion script by writing functions to support
their commands, but they might have issues with it: they might not
have the rights to modify a system-wide git completion script, and
they will need to track and merge upstream changes in the future.
This patch addresses this by providing means for users to supply
custom completion scriplets for their custom git commands without
modifying the main git bash completion script.
Instead of having a huge hard-coded list of command-completion
function pairs (in _git()), the completion script will figure out
which completion function to call based on the command's name. That
is, when completing the options of 'git foo', the main completion
script will check whether the function '_git_foo' is declared, and if
declared, it will invoke that function to perform the completion. If
such a function is not declared, it will fall back to complete file
names. So, users will only need to provide this '_git_foo' completion
function in a separate file, source that file, and it will be used the
next time they press TAB after 'git foo '.
There are two git commands (stage and whatchanged), for which the
completion functions of other commands were used, therefore they
got their own completion function.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:58 +01:00
|
|
|
_git_whatchanged ()
|
|
|
|
{
|
|
|
|
_git_log
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
_git ()
|
|
|
|
{
|
2006-11-05 12:21:57 +01:00
|
|
|
local i c=1 command __git_dir
|
|
|
|
|
2010-10-28 03:08:21 +02:00
|
|
|
if [[ -n ${ZSH_VERSION-} ]]; then
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
emulate -L bash
|
|
|
|
setopt KSH_TYPESET
|
2011-05-10 14:20:39 +02:00
|
|
|
|
|
|
|
# workaround zsh's bug that leaves 'words' as a special
|
|
|
|
# variable in versions < 4.3.12
|
|
|
|
typeset -h words
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
fi
|
|
|
|
|
2011-04-28 18:01:52 +02:00
|
|
|
local cur words cword prev
|
|
|
|
_get_comp_words_by_ref -n =: cur words cword prev
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
while [ $c -lt $cword ]; do
|
|
|
|
i="${words[c]}"
|
2006-11-05 12:21:57 +01:00
|
|
|
case "$i" in
|
|
|
|
--git-dir=*) __git_dir="${i#--git-dir=}" ;;
|
|
|
|
--bare) __git_dir="." ;;
|
2008-07-24 02:07:23 +02:00
|
|
|
--version|-p|--paginate) ;;
|
|
|
|
--help) command="help"; break ;;
|
2006-11-05 12:21:57 +01:00
|
|
|
*) command="$i"; break ;;
|
|
|
|
esac
|
|
|
|
c=$((++c))
|
|
|
|
done
|
|
|
|
|
2008-03-10 16:02:22 +01:00
|
|
|
if [ -z "$command" ]; then
|
bash: get --pretty=m<tab> completion to work with bash v4
Bash's programmable completion provides the COMP_WORDS array variable,
which holds the individual words in the current command line. In bash
versions prior to v4 "words are split on shell metacharacters as the
shell parser would separate them" (quote from bash v3.2.48's man
page). This behavior has changed with bash v4, and the command line
"is split into words as readline would split it, using COMP_WORDBREAKS
as" "the set of characters that the readline library treats as word
separators" (quote from bash v4's man page).
Since COMP_WORDBREAKS contains the characters : and = by default, this
behavior change in bash affects git's completion script. For example,
before bash 4, running
$ git log --pretty=m <tab><tab>
would give a list of pretty-printing formats starting with 'm' but now
it completes on branch names.
It would be possible to work around this by removing '=' and ':' from
COMP_WORDBREAKS, but as noticed in v1.5.6.4~9^2 (bash completion:
Resolve git show ref:path<tab> losing ref: portion, 2008-07-15), that
would break *other* completion scripts. The bash-completion library
includes a better workaround: the _get_comp_words_by_ref function
re-assembles a copy of COMP_WORDS, excluding a collection of word
separators of the caller's choice. Use it.
As a bonus, this also improves behavior when tab is pressed with the
cursor in the middle of a word.
To avoid breaking setups with the bash-completion library not already
loaded, if the _get_comp_words_by_ref function is not defined then a
shim that just reads COMP_WORDS will be used instead (no change from
the current behavior in that case).
Signed-off-by: Peter van der Does <peter@avirtualhome.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Explained-by: SZEDER Gábor <szeder@ira.uka.de>
2010-12-02 09:17:13 +01:00
|
|
|
case "$cur" in
|
2007-08-23 07:39:22 +02:00
|
|
|
--*) __gitcomp "
|
2008-03-06 17:52:37 +01:00
|
|
|
--paginate
|
2007-08-23 07:39:22 +02:00
|
|
|
--no-pager
|
|
|
|
--git-dir=
|
|
|
|
--bare
|
|
|
|
--version
|
|
|
|
--exec-path
|
2009-04-05 04:15:16 +02:00
|
|
|
--html-path
|
2008-03-06 17:52:37 +01:00
|
|
|
--work-tree=
|
|
|
|
--help
|
2007-08-23 07:39:22 +02:00
|
|
|
"
|
|
|
|
;;
|
2009-11-18 01:49:10 +01:00
|
|
|
*) __git_compute_porcelain_commands
|
|
|
|
__gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
|
2007-02-04 08:38:27 +01:00
|
|
|
esac
|
|
|
|
return
|
2006-11-05 12:21:57 +01:00
|
|
|
fi
|
2006-10-28 14:12:20 +02:00
|
|
|
|
bash: support user-supplied completion scripts for user's git commands
The bash completion script already provides support to complete
aliases, options and refs for aliases (if the alias can be traced back
to a supported git command by __git_aliased_command()), and the user's
custom git commands, but it does not support the options of the user's
custom git commands (of course; how could it know about the options of
a custom git command?). Users of such custom git commands could
extend git's bash completion script by writing functions to support
their commands, but they might have issues with it: they might not
have the rights to modify a system-wide git completion script, and
they will need to track and merge upstream changes in the future.
This patch addresses this by providing means for users to supply
custom completion scriplets for their custom git commands without
modifying the main git bash completion script.
Instead of having a huge hard-coded list of command-completion
function pairs (in _git()), the completion script will figure out
which completion function to call based on the command's name. That
is, when completing the options of 'git foo', the main completion
script will check whether the function '_git_foo' is declared, and if
declared, it will invoke that function to perform the completion. If
such a function is not declared, it will fall back to complete file
names. So, users will only need to provide this '_git_foo' completion
function in a separate file, source that file, and it will be used the
next time they press TAB after 'git foo '.
There are two git commands (stage and whatchanged), for which the
completion functions of other commands were used, therefore they
got their own completion function.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:58 +01:00
|
|
|
local completion_func="_git_${command//-/_}"
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
declare -f $completion_func >/dev/null && $completion_func && return
|
bash: support user-supplied completion scripts for aliases
Shell command aliases can get rather complex, and the completion
script can not always determine correctly the git command invoked by
such an alias. For such cases users might want to provide custom
completion scripts the same way like for their custom commands made
possible by the previous patch.
The current completion script does not allow this, because if it
encounters an alias, then it will unconditionally perform completion
for the aliased git command (in case it can determine the aliased git
command, of course). With this patch the completion script will first
search for a completion function for the command given on the command
line, be it a git command, a custom git command of the user, or an
alias, and invoke that function to perform the completion. This has
no effect on git commands, because they can not be aliased anyway. If
it is an alias and there is a completion function for that alias (e.g.
_git_foo() for the alias 'foo'), then it will be invoked to perform
completion, allowing users to provide custom completion functions for
aliases. If such a completion function can not be found, only then
will the completion script check whether the command given on the
command line is an alias or not, and proceed as usual (i.e. find out
the aliased git command and provide completion for it).
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:59 +01:00
|
|
|
|
2006-11-05 12:21:57 +01:00
|
|
|
local expansion=$(__git_aliased_command "$command")
|
bash: support user-supplied completion scripts for aliases
Shell command aliases can get rather complex, and the completion
script can not always determine correctly the git command invoked by
such an alias. For such cases users might want to provide custom
completion scripts the same way like for their custom commands made
possible by the previous patch.
The current completion script does not allow this, because if it
encounters an alias, then it will unconditionally perform completion
for the aliased git command (in case it can determine the aliased git
command, of course). With this patch the completion script will first
search for a completion function for the command given on the command
line, be it a git command, a custom git command of the user, or an
alias, and invoke that function to perform the completion. This has
no effect on git commands, because they can not be aliased anyway. If
it is an alias and there is a completion function for that alias (e.g.
_git_foo() for the alias 'foo'), then it will be invoked to perform
completion, allowing users to provide custom completion functions for
aliases. If such a completion function can not be found, only then
will the completion script check whether the command given on the
command line is an alias or not, and proceed as usual (i.e. find out
the aliased git command and provide completion for it).
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:59 +01:00
|
|
|
if [ -n "$expansion" ]; then
|
|
|
|
completion_func="_git_${expansion//-/_}"
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
declare -f $completion_func >/dev/null && $completion_func
|
bash: support user-supplied completion scripts for aliases
Shell command aliases can get rather complex, and the completion
script can not always determine correctly the git command invoked by
such an alias. For such cases users might want to provide custom
completion scripts the same way like for their custom commands made
possible by the previous patch.
The current completion script does not allow this, because if it
encounters an alias, then it will unconditionally perform completion
for the aliased git command (in case it can determine the aliased git
command, of course). With this patch the completion script will first
search for a completion function for the command given on the command
line, be it a git command, a custom git command of the user, or an
alias, and invoke that function to perform the completion. This has
no effect on git commands, because they can not be aliased anyway. If
it is an alias and there is a completion function for that alias (e.g.
_git_foo() for the alias 'foo'), then it will be invoked to perform
completion, allowing users to provide custom completion functions for
aliases. If such a completion function can not be found, only then
will the completion script check whether the command given on the
command line is an alias or not, and proceed as usual (i.e. find out
the aliased git command and provide completion for it).
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-02-23 22:02:59 +01:00
|
|
|
fi
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
_gitk ()
|
|
|
|
{
|
2010-10-28 03:08:21 +02:00
|
|
|
if [[ -n ${ZSH_VERSION-} ]]; then
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
emulate -L bash
|
|
|
|
setopt KSH_TYPESET
|
2011-05-10 14:20:39 +02:00
|
|
|
|
|
|
|
# workaround zsh's bug that leaves 'words' as a special
|
|
|
|
# variable in versions < 4.3.12
|
|
|
|
typeset -h words
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
fi
|
|
|
|
|
2011-04-28 18:01:52 +02:00
|
|
|
local cur words cword prev
|
|
|
|
_get_comp_words_by_ref -n =: cur words cword prev
|
|
|
|
|
bash: offer only paths after '--'
Many git commands use '--' to separate subcommands, options, and refs
from paths. However, the programmable completion for several of these
commands does not respect the '--', and offer subcommands, options, or
refs after a '--', although only paths are permitted. e.g. 'git bisect
-- <TAB>' offers subcommands, 'git log -- --<TAB>' offers options and
'git log -- git<TAB>' offers all gitgui tags.
The completion for the following commands share this wrong behaviour:
am add bisect commit diff log reset shortlog submodule gitk.
To avoid this, we check the presence of a '--' on the command line first
and let the shell do filename completion, if one is found.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-08 18:56:14 +02:00
|
|
|
__git_has_doubledash && return
|
|
|
|
|
2009-02-11 19:03:23 +01:00
|
|
|
local g="$(__gitdir)"
|
2008-04-27 17:35:10 +02:00
|
|
|
local merge=""
|
2009-03-30 13:27:37 +02:00
|
|
|
if [ -f "$g/MERGE_HEAD" ]; then
|
2008-04-27 17:35:10 +02:00
|
|
|
merge="--merge"
|
|
|
|
fi
|
2007-02-04 08:38:43 +01:00
|
|
|
case "$cur" in
|
|
|
|
--*)
|
2009-02-16 17:34:56 +01:00
|
|
|
__gitcomp "
|
|
|
|
$__git_log_common_options
|
|
|
|
$__git_log_gitk_options
|
|
|
|
$merge
|
|
|
|
"
|
2007-02-04 08:38:43 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac
|
2007-02-04 08:38:47 +01:00
|
|
|
__git_complete_revlist
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
2009-01-15 17:02:22 +01:00
|
|
|
complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
|
|
|
|
|| complete -o default -o nospace -F _git git
|
|
|
|
complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
|
|
|
|
|| complete -o default -o nospace -F _gitk gitk
|
2006-09-28 11:31:25 +02:00
|
|
|
|
|
|
|
# The following are necessary only for Cygwin, and only are needed
|
|
|
|
# when the user has tab-completed the executable name and consequently
|
|
|
|
# included the '.exe' suffix.
|
|
|
|
#
|
2006-11-05 12:20:25 +01:00
|
|
|
if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
|
2009-01-15 17:02:22 +01:00
|
|
|
complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
|
|
|
|
|| complete -o default -o nospace -F _git git.exe
|
2006-11-05 12:20:25 +01:00
|
|
|
fi
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
|
2010-10-28 03:08:21 +02:00
|
|
|
if [[ -n ${ZSH_VERSION-} ]]; then
|
2011-04-27 23:27:04 +02:00
|
|
|
__git_shopt () {
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
local option
|
|
|
|
if [ $# -ne 2 ]; then
|
|
|
|
echo "USAGE: $0 (-q|-s|-u) <option>" >&2
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
case "$2" in
|
|
|
|
nullglob)
|
|
|
|
option="$2"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "$0: invalid option: $2" >&2
|
|
|
|
return 1
|
|
|
|
esac
|
|
|
|
case "$1" in
|
|
|
|
-q) setopt | grep -q "$option" ;;
|
|
|
|
-u) unsetopt "$option" ;;
|
|
|
|
-s) setopt "$option" ;;
|
|
|
|
*)
|
|
|
|
echo "$0: invalid flag: $1" >&2
|
|
|
|
return 1
|
|
|
|
esac
|
|
|
|
}
|
2011-04-27 23:27:04 +02:00
|
|
|
else
|
|
|
|
__git_shopt () {
|
|
|
|
shopt "$@"
|
|
|
|
}
|
completion: make compatible with zsh
Modify git-completion.bash so that it also works with zsh when using
bashcompinit. In particular:
declare -F
Zsh doesn't have the same 'declare -F' as bash, but 'declare -f'
is the same, and it works just as well for our purposes.
${var:2}
Zsh does not implement ${var:2} to skip the first 2 characters, but
${var#??} works in both shells to replace the first 2 characters
with nothing. Thanks to Jonathan Nieder for the suggestion.
for (( n=1; "$n" ... ))
Zsh does not allow "$var" in arithmetic loops. Instead, pre-compute
the endpoint and use the variables without $'s or quotes.
shopt
Zsh uses 'setopt', which has a different syntax than 'shopt'. Since
'shopt' is used infrequently in git-completion, we provide
a bare-bones emulation.
emulate -L bash
KSH_TYPESET
Zsh offers bash emulation, which turns on a set of features to
closely resemble bash. In particular, this enables SH_WORDSPLIT,
which splits scalar variables on word boundaries in 'for' loops.
We also need to set KSH_TYPESET, to fix "local var=$(echo foo bar)"
issues.
The last set of options are turned on only in _git and _gitk. Some of
the sub-functions may not work correctly if called directly.
Signed-off-by: Mark Lodato <lodatom@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2010-09-06 14:33:19 +02:00
|
|
|
fi
|