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.
|
|
|
|
#
|
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
|
2011-11-09 11:02:50 +01:00
|
|
|
local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
|
2011-12-21 16:54:14 +01:00
|
|
|
while read -r key value; do
|
2010-06-17 23:32:02 +02:00
|
|
|
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
|
2011-10-26 21:13:09 +02:00
|
|
|
done <<< "$output"
|
2010-06-17 23:32:02 +02:00
|
|
|
|
|
|
|
# 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
|
2012-02-22 09:58:13 +01:00
|
|
|
git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
|
2009-06-02 20:03:22 +02:00
|
|
|
fi
|
2009-07-22 10:31:34 +02:00
|
|
|
|
|
|
|
if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
|
2012-02-22 09:58:13 +01:00
|
|
|
if [ -n "$(git ls-files --others --exclude-standard)" ]; then
|
|
|
|
u="%"
|
|
|
|
fi
|
2009-07-22 10:31:34 +02:00
|
|
|
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"
|
2012-02-20 13:17:53 +01: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
|
|
|
|
|
2011-10-08 16:54:35 +02:00
|
|
|
# Generates completion reply with compgen, appending a space to possible
|
|
|
|
# completion words, if necessary.
|
|
|
|
# It accepts 1 to 4 arguments:
|
|
|
|
# 1: List of possible completion words.
|
|
|
|
# 2: A prefix to be added to each possible completion word (optional).
|
|
|
|
# 3: Generate possible completion matches for this word (optional).
|
|
|
|
# 4: A suffix to be appended to each possible completion word (optional).
|
2007-02-04 08:38:27 +01:00
|
|
|
__gitcomp ()
|
|
|
|
{
|
2012-02-02 20:48:08 +01:00
|
|
|
local cur_="${3-$cur}"
|
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
|
|
|
}
|
|
|
|
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
# Generates completion reply with compgen from newline-separated possible
|
|
|
|
# completion words by appending a space to all of them.
|
|
|
|
# It accepts 1 to 4 arguments:
|
|
|
|
# 1: List of possible completion words, separated by a single newline.
|
|
|
|
# 2: A prefix to be added to each possible completion word (optional).
|
|
|
|
# 3: Generate possible completion matches for this word (optional).
|
|
|
|
# 4: A suffix to be appended to each possible completion word instead of
|
|
|
|
# the default space (optional). If specified but empty, nothing is
|
|
|
|
# appended.
|
|
|
|
__gitcomp_nl ()
|
|
|
|
{
|
2012-02-02 20:48:08 +01:00
|
|
|
local IFS=$'\n'
|
|
|
|
COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
}
|
|
|
|
|
2006-11-27 10:44:47 +01:00
|
|
|
__git_heads ()
|
|
|
|
{
|
completion: remove broken dead code from __git_heads() and __git_tags()
__git_heads() was introduced in 5de40f5 (Teach bash about
git-repo-config., 2006-11-27), and __git_tags() in 88e21dc (Teach bash
about completing arguments for git-tag, 2007-08-31). As their name
suggests, __git_heads() is supposed to list only branches, and
__git_tags() only tags.
Since their introduction both of these functions consist of two
distinct parts. The first part gets branches or tags, respectively,
from a local repositoty using 'git for-each-ref'. The second part
queries a remote repository given as argument using 'git ls-remote'.
These remote-querying parts are broken in both functions since their
introduction, because they list both branches and tags from the remote
repository. (The 'git ls-remote' query is not limited to list only
heads or tags, respectively, and the for loop filtering the query
results prints everything except dereferenced tags.) This breakage
could be easily fixed by passing the '--heads' or '--tags' options or
appropriate refs patterns to the 'git ls-remote' invocations.
However, that no one noticed this breakage yet is probably not a
coincidence: neither of these two functions were used to query a
remote repository, the remote-querying parts were dead code already
upon thier introduction and remained dead ever since.
Since those parts of code are broken, are and were never used, stop
the bit-rotting and remove them.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-08 16:54:43 +02:00
|
|
|
local dir="$(__gitdir)"
|
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
|
|
|
|
}
|
|
|
|
|
2007-09-01 05:47:01 +02:00
|
|
|
__git_tags ()
|
|
|
|
{
|
completion: remove broken dead code from __git_heads() and __git_tags()
__git_heads() was introduced in 5de40f5 (Teach bash about
git-repo-config., 2006-11-27), and __git_tags() in 88e21dc (Teach bash
about completing arguments for git-tag, 2007-08-31). As their name
suggests, __git_heads() is supposed to list only branches, and
__git_tags() only tags.
Since their introduction both of these functions consist of two
distinct parts. The first part gets branches or tags, respectively,
from a local repositoty using 'git for-each-ref'. The second part
queries a remote repository given as argument using 'git ls-remote'.
These remote-querying parts are broken in both functions since their
introduction, because they list both branches and tags from the remote
repository. (The 'git ls-remote' query is not limited to list only
heads or tags, respectively, and the for loop filtering the query
results prints everything except dereferenced tags.) This breakage
could be easily fixed by passing the '--heads' or '--tags' options or
appropriate refs patterns to the 'git ls-remote' invocations.
However, that no one noticed this breakage yet is probably not a
coincidence: neither of these two functions were used to query a
remote repository, the remote-querying parts were dead code already
upon thier introduction and remained dead ever since.
Since those parts of code are broken, are and were never used, stop
the bit-rotting and remove them.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-08 16:54:43 +02:00
|
|
|
local dir="$(__gitdir)"
|
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
|
|
|
|
}
|
|
|
|
|
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 ()
|
|
|
|
{
|
2011-10-08 16:54:38 +02:00
|
|
|
local i hash 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/" | \
|
2011-12-21 16:54:14 +01:00
|
|
|
while read -r entry; do
|
2010-10-12 23:38:12 +02:00
|
|
|
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
|
2011-10-08 16:54:39 +02:00
|
|
|
case "$cur" in
|
|
|
|
refs|refs/*)
|
|
|
|
git ls-remote "$dir" "$cur*" 2>/dev/null | \
|
2011-12-21 16:54:14 +01:00
|
|
|
while read -r hash i; do
|
2011-10-08 16:54:39 +02:00
|
|
|
case "$i" in
|
|
|
|
*^{}) ;;
|
|
|
|
*) echo "$i" ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
|
2011-12-21 16:54:14 +01:00
|
|
|
while read -r hash i; do
|
2011-10-08 16:54:39 +02:00
|
|
|
case "$i" in
|
|
|
|
*^{}) ;;
|
|
|
|
refs/*) echo "${i#refs/*/}" ;;
|
|
|
|
*) echo "$i" ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
;;
|
|
|
|
esac
|
2006-09-28 11:31:25 +02:00
|
|
|
}
|
|
|
|
|
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 ()
|
|
|
|
{
|
2011-10-08 16:54:41 +02:00
|
|
|
local i hash
|
|
|
|
git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
|
2011-12-21 16:54:14 +01:00
|
|
|
while read -r hash i; do
|
2011-10-08 16:54:41 +02:00
|
|
|
echo "$i:refs/remotes/$1/${i#refs/heads/}"
|
2006-11-27 10:44:47 +01:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2006-09-28 11:31:25 +02:00
|
|
|
__git_remotes ()
|
|
|
|
{
|
2012-02-02 10:05:29 +01:00
|
|
|
local i IFS=$'\n' d="$(__gitdir)"
|
|
|
|
test -d "$d/remotes" && ls -1 "$d/remotes"
|
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 ()
|
|
|
|
{
|
2012-02-02 20:26:15 +01:00
|
|
|
test -n "$__git_merge_strategies" ||
|
|
|
|
__git_merge_strategies=$(__git_list_merge_strategies)
|
2009-11-18 01:49:10 +01:00
|
|
|
}
|
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_#*...}"
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
2006-11-27 09:41:43 +01:00
|
|
|
;;
|
|
|
|
*..*)
|
2011-04-28 18:01:51 +02:00
|
|
|
pfx="${cur_%..*}.."
|
|
|
|
cur_="${cur_#*..}"
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
2007-02-04 08:38:43 +01:00
|
|
|
;;
|
2006-11-27 09:41:43 +01:00
|
|
|
*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_remotes)"
|
2009-03-06 05:39:31 +01:00
|
|
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
else
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
pull)
|
|
|
|
if [ $lhs = 1 ]; then
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
else
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
fi
|
|
|
|
;;
|
|
|
|
push)
|
|
|
|
if [ $lhs = 1 ]; then
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
|
2009-03-06 05:39:31 +01:00
|
|
|
else
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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 ()
|
|
|
|
{
|
2012-02-02 20:26:15 +01:00
|
|
|
test -n "$__git_all_commands" ||
|
|
|
|
__git_all_commands=$(__git_list_all_commands)
|
2009-11-18 01:49:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
__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
|
2012-02-02 20:26:15 +01:00
|
|
|
test -n "$__git_porcelain_commands" ||
|
|
|
|
__git_porcelain_commands=$(__git_list_porcelain_commands)
|
2009-11-18 01:49:10 +01:00
|
|
|
}
|
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=*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
|
2008-08-05 07:50:36 +02:00
|
|
|
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)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2007-02-05 21:44:37 +01:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
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
|
2012-02-15 21:36:58 +01:00
|
|
|
--set-upstream --edit-description --list
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_heads)"
|
2008-03-04 19:00:59 +01:00
|
|
|
else
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2008-03-04 19:00:59 +01:00
|
|
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
|
|
;;
|
|
|
|
*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
|
|
|
;;
|
2011-10-06 20:40:30 +02:00
|
|
|
--reuse-message=*|--reedit-message=*|\
|
|
|
|
--fixup=*|--squash=*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
|
2009-12-05 01:51:41 +01:00
|
|
|
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=
|
2011-10-06 20:40:30 +02:00
|
|
|
--verbose --quiet --fixup= --squash=
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2007-08-23 07:42:11 +02:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2011-10-21 19:30:21 +02:00
|
|
|
__git_match_ctag() {
|
|
|
|
awk "/^${1////\\/}/ { print \$1 }" "$2"
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
2011-10-21 19:30:21 +02:00
|
|
|
case "$cword,$prev" in
|
|
|
|
2,*|*,-*)
|
|
|
|
if test -r tags; then
|
2011-12-09 22:37:18 +01:00
|
|
|
__gitcomp_nl "$(__git_match_ctag "$cur" tags)"
|
2011-10-21 19:30:21 +02:00
|
|
|
return
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
2011-07-09 01:14:10 +02:00
|
|
|
namespaces 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 ()
|
|
|
|
{
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
2011-10-08 03:09:34 +02:00
|
|
|
--pretty=*|--format=*)
|
2010-10-11 00:06:22 +02:00
|
|
|
__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
|
2011-10-08 03:09:34 +02:00
|
|
|
" "" "${cur#*=}"
|
2009-02-24 14:33:29 +01:00
|
|
|
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
|
2012-01-30 20:29:33 +01:00
|
|
|
--commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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 ()
|
|
|
|
{
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2010-10-10 23:43:33 +02:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
__gitcomp "$subcommands --ref"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
;;
|
2011-10-08 03:06:34 +02:00
|
|
|
add,--reuse-message=*|append,--reuse-message=*|\
|
2010-10-10 23:43:33 +02:00
|
|
|
add,--reedit-message=*|append,--reedit-message=*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
|
2010-10-10 23:43:33 +02:00
|
|
|
;;
|
|
|
|
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)
|
|
|
|
;;
|
|
|
|
*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2010-10-10 23:43:33 +02:00
|
|
|
;;
|
|
|
|
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)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_remotes)"
|
2009-03-06 05:39:33 +01:00
|
|
|
return
|
|
|
|
esac
|
|
|
|
case "$cur" in
|
|
|
|
--repo=*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
|
2009-03-06 05:39:33 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
--*)
|
|
|
|
__gitcomp "
|
|
|
|
--all --mirror --tags --dry-run --force --verbose
|
2011-10-06 20:40:31 +02:00
|
|
|
--receive-pack= --repo= --set-upstream
|
2009-03-06 05:39:33 +01:00
|
|
|
"
|
|
|
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2010-12-16 07:56:08 +01:00
|
|
|
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 |
|
2011-12-21 16:54:14 +01:00
|
|
|
while read -r line
|
2009-06-30 07:08:38 +02:00
|
|
|
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)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_remotes)"
|
2006-11-27 10:44:47 +01:00
|
|
|
return
|
|
|
|
;;
|
|
|
|
branch.*.merge)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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}"
|
2011-10-08 16:54:42 +02:00
|
|
|
if [ -z "$cur" ]; then
|
|
|
|
COMPREPLY=("refs/heads/")
|
|
|
|
return
|
|
|
|
fi
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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}"
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(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)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_config_get_set_variables)"
|
2009-05-09 03:23:32 +02:00
|
|
|
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#*.}"
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$__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#*.}"
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
2011-06-24 08:17:42 +02:00
|
|
|
core.abbrev
|
2010-12-20 16:18:25 +01:00
|
|
|
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)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_remotes)"
|
2007-02-05 05:52:08 +01:00
|
|
|
;;
|
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 ()
|
|
|
|
{
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2009-10-09 22:49:06 +02:00
|
|
|
}
|
|
|
|
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__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
|
2011-10-08 03:09:34 +02:00
|
|
|
--pretty=*|--format=*)
|
2010-10-11 00:06:22 +02:00
|
|
|
__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
|
2011-10-08 03:09:34 +02:00
|
|
|
" "" "${cur#*=}"
|
2009-02-24 14:33:29 +01:00
|
|
|
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,*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
|
2008-08-05 07:50:35 +02:00
|
|
|
| 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
|
2011-11-03 19:33:30 +01:00
|
|
|
--revision --interactive $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)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_tags)"
|
2007-09-01 05:47:01 +02:00
|
|
|
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
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_tags)"
|
2007-09-01 05:47:01 +02:00
|
|
|
else
|
|
|
|
COMPREPLY=()
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
*)
|
completion: optimize refs completion
After a unique command or option is completed, in most cases it is a
good thing to add a trailing a space, but sometimes it doesn't make
sense, e.g. when the completed word is an option taking an argument
('--option=') or a configuration section ('core.'). Therefore the
completion script uses the '-o nospace' option to prevent bash from
automatically appending a space to unique completions, and it has the
__gitcomp() function to add that trailing space only when necessary.
See 72e5e989 (bash: Add space after unique command name is completed.,
2007-02-04), 78d4d6a2 (bash: Support unique completion on git-config.,
2007-02-04), and b3391775 (bash: Support unique completion when
possible., 2007-02-04).
__gitcomp() therefore iterates over all possible completion words it
got as argument, and checks each word whether a trailing space is
necessary or not. This is ok for commands, options, etc., i.e. when
the number of words is relatively small, but can be noticeably slow
for large number of refs. However, while options might or might not
need that trailing space, refs are always handled uniformly and always
get that trailing space (or a trailing '.' for 'git config
branch.<head>.'). Since refs listed by __git_refs() & co. are
separated by newline, this allows us some optimizations with
'compgen'.
So, add a specialized variant of __gitcomp() that only deals with
possible completion words separated by a newline and uniformly appends
the trailing space to all words using 'compgen -S " "' (or any other
suffix, if specified), so no iteration over all words is needed. But
we need to fiddle with IFS, because the default IFS containing a space
would cause the added space suffix to be stripped off when compgen's
output is stored in the COMPREPLY array. Therefore we use only
newline as IFS, hence the requirement for the newline-separated
possible completion words.
Convert all callsites of __gitcomp() where it's called with refs, i.e.
when it gets the output of either __git_refs(), __git_heads(),
__git_tags(), __git_refs2(), __git_refs_remotes(), or the odd 'git
for-each-ref' somewhere in _git_config(). Also convert callsites
where it gets other uniformly handled newline separated word lists,
i.e. either remotes from __git_remotes(), names of set configuration
variables from __git_config_get_set_variables(), stashes, or commands.
Here are some timing results for dealing with 10000 refs.
Before:
$ refs="$(__git_refs ~/tmp/git/repo-with-10k-refs/)"
$ time __gitcomp "$refs"
real 0m1.134s
user 0m1.060s
sys 0m0.130s
After:
$ time __gitcomp_nl "$refs"
real 0m0.373s
user 0m0.360s
sys 0m0.020s
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-10-15 14:57:23 +02:00
|
|
|
__gitcomp_nl "$(__git_refs)"
|
2007-09-01 05:47:01 +02:00
|
|
|
;;
|
|
|
|
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
|
2012-01-25 02:37:02 +01:00
|
|
|
|
|
|
|
# workaround zsh's bug that quotes spaces in the COMPREPLY
|
|
|
|
# array if IFS doesn't contain spaces.
|
|
|
|
typeset -h IFS
|
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=
|
ref namespaces: infrastructure
Add support for dividing the refs of a single repository into multiple
namespaces, each of which can have its own branches, tags, and HEAD.
Git can expose each namespace as an independent repository to pull from
and push to, while sharing the object store, and exposing all the refs
to operations such as git-gc.
Storing multiple repositories as namespaces of a single repository
avoids storing duplicate copies of the same objects, such as when
storing multiple branches of the same source. The alternates mechanism
provides similar support for avoiding duplicates, but alternates do not
prevent duplication between new objects added to the repositories
without ongoing maintenance, while namespaces do.
To specify a namespace, set the GIT_NAMESPACE environment variable to
the namespace. For each ref namespace, git stores the corresponding
refs in a directory under refs/namespaces/. For example,
GIT_NAMESPACE=foo will store refs under refs/namespaces/foo/. You can
also specify namespaces via the --namespace option to git.
Note that namespaces which include a / will expand to a hierarchy of
namespaces; for example, GIT_NAMESPACE=foo/bar will store refs under
refs/namespaces/foo/refs/namespaces/bar/. This makes paths in
GIT_NAMESPACE behave hierarchically, so that cloning with
GIT_NAMESPACE=foo/bar produces the same result as cloning with
GIT_NAMESPACE=foo and cloning from that repo with GIT_NAMESPACE=bar. It
also avoids ambiguity with strange namespace paths such as
foo/refs/heads/, which could otherwise generate directory/file conflicts
within the refs directory.
Add the infrastructure for ref namespaces: handle the GIT_NAMESPACE
environment variable and --namespace option, and support iterating over
refs in a namespace.
Signed-off-by: Josh Triplett <josh@joshtriplett.org>
Signed-off-by: Jamey Sharp <jamey@minilop.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-07-05 19:54:44 +02:00
|
|
|
--namespace=
|
2008-03-06 17:52:37 +01:00
|
|
|
--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
|
2012-01-25 02:37:02 +01:00
|
|
|
|
|
|
|
# workaround zsh's bug that quotes spaces in the COMPREPLY
|
|
|
|
# array if IFS doesn't contain spaces.
|
|
|
|
typeset -h IFS
|
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
|