@ -33,8 +33,6 @@ esac
# returns location of .git repo
__gitdir ( )
{
# Note: this function is duplicated in git-prompt.sh
# When updating it, make sure you update the other one to match.
if [ -z " ${ 1 - } " ] ; then
if [ -n " ${ __git_dir - } " ] ; then
echo " $__git_dir "
@ -53,19 +51,6 @@ __gitdir ()
fi
}
__gitcomp_1 ( )
{
local c IFS = $' \t\n'
for c in $1 ; do
c = " $c $2 "
case $c in
--*= *| *.) ; ;
*) c = " $c " ; ;
esac
printf '%s\n' " $c "
done
}
# The following function is based on code from:
#
# bash_completion - programmable completion functions for bash 3.2+
@ -195,8 +180,18 @@ _get_comp_words_by_ref ()
}
fi
# Generates completion reply with compgen, appending a space to possible
# completion words, if necessary.
__gitcompadd ( )
{
local i = 0
for x in $1 ; do
if [ [ " $x " = = " $3 " * ] ] ; then
COMPREPLY[ i++] = " $2 $x $4 "
fi
done
}
# Generates completion reply, 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).
@ -208,19 +203,25 @@ __gitcomp ()
case " $cur_ " in
--*= )
COMPREPLY = ( )
; ;
*)
local IFS = $'\n'
COMPREPLY = ( $( compgen -P " ${ 2 - } " \
-W " $( __gitcomp_1 " ${ 1 - } " " ${ 4 - } " ) " \
-- " $cur_ " ) )
local c i = 0 IFS = $' \t\n'
for c in $1 ; do
c = " $c ${ 4 - } "
if [ [ $c = = " $cur_ " * ] ] ; then
case $c in
--*= *| *.) ; ;
*) c = " $c " ; ;
esac
COMPREPLY[ i++] = " ${ 2 - } $c "
fi
done
; ;
esac
}
# Generates completion reply with compgen from newline-separated possible
# completion words by appending a space to all of them.
# Generates completion reply 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).
@ -231,7 +232,7 @@ __gitcomp ()
__gitcomp_nl ( )
{
local IFS = $'\n'
COMPREPLY = ( $( compgen -P " ${ 2 - } " -S " ${ 4 - } " -W " $1 " -- " ${ 3 - $cur } " ) )
__gitcompadd " $1 " " ${ 2 - } " " ${ 3 - $cur } " " ${ 4 - } "
}
# Generates completion reply with compgen from newline-separated possible
@ -249,106 +250,50 @@ __gitcomp_file ()
# since tilde expansion is not applied.
# This means that COMPREPLY will be empty and Bash default
# completion will be used.
COMPREPLY = ( $( compgen -P " ${ 2 - } " -W " $1 " -- " ${ 3 - $cur } " ) )
# Tell Bash that compspec generates filenames.
compopt -o filenames 2>/dev/null
}
__git_index_file_list_filter_compat ( )
{
local path
__gitcompadd " $1 " " ${ 2 - } " " ${ 3 - $cur } " ""
while read -r path; do
case " $path " in
?*/*) echo " ${ path %%/* } / " ; ;
*) echo " $path " ; ;
esac
done
# use a hack to enable file mode in bash < 4
compopt -o filenames +o nospace 2>/dev/null ||
compgen -f /non-existing-dir/ > /dev/null
}
__git_index_file_list_filter_bash ( )
{
local path
while read -r path; do
case " $path " in
?*/*)
# XXX if we append a slash to directory names when using
# `compopt -o filenames`, Bash will append another slash.
# This is pretty stupid, and this the reason why we have to
# define a compatible version for this function.
echo " ${ path %%/* } " ; ;
*)
echo " $path " ; ;
esac
done
}
# Process path list returned by "ls-files" and "diff-index --name-only"
# commands, in order to list only file names relative to a specified
# directory, and append a slash to directory names.
__git_index_file_list_filter ( )
{
# Default to Bash >= 4.x
__git_index_file_list_filter_bash
}
# Execute git ls-files, returning paths relative to the directory
# specified in the first argument, and using the options specified in
# the second argument.
# Execute 'git ls-files', unless the --committable option is specified, in
# which case it runs 'git diff-index' to find out the files that can be
# committed. It return paths relative to the directory specified in the first
# argument, and using the options specified in the second argument.
__git_ls_files_helper ( )
{
(
test -n " ${ CDPATH +set } " && unset CDPATH
# NOTE: $2 is not quoted in order to support multiple options
cd " $1 " && git ls-files --exclude-standard $2
cd " $1 "
if [ " $2 " = = "--committable" ] ; then
git diff-index --name-only --relative HEAD
else
# NOTE: $2 is not quoted in order to support multiple options
git ls-files --exclude-standard $2
fi
) 2>/dev/null
}
# Execute git diff-index, returning paths relative to the directory
# specified in the first argument, and using the tree object id
# specified in the second argument.
__git_diff_index_helper ( )
{
(
test -n " ${ CDPATH +set } " && unset CDPATH
cd " $1 " && git diff-index --name-only --relative " $2 "
) 2>/dev/null
}
# __git_index_files accepts 1 or 2 arguments:
# 1: Options to pass to ls-files (required).
# Supported options are --cached, --modified, --deleted, --others,
# and --directory.
# 2: A directory path (optional).
# If provided, only files within the specified directory are listed.
# Sub directories are never recursed. Path must have a trailing
# slash.
__git_index_files ( )
{
local dir = " $( __gitdir) " root = " ${ 2 -. } "
local dir = " $( __gitdir) " root = " ${ 2 -. } " file
if [ -d " $dir " ] ; then
__git_ls_files_helper " $root " " $1 " | __git_index_file_list_filter |
sort | uniq
fi
}
# __git_diff_index_files accepts 1 or 2 arguments:
# 1) The id of a tree object.
# 2) A directory path (optional).
# If provided, only files within the specified directory are listed.
# Sub directories are never recursed. Path must have a trailing
# slash.
__git_diff_index_files ( )
{
local dir = " $( __gitdir) " root = " ${ 2 -. } "
if [ -d " $dir " ] ; then
__git_diff_index_helper " $root " " $1 " | __git_index_file_list_filter |
sort | uniq
__git_ls_files_helper " $root " " $1 " |
while read -r file; do
case " $file " in
?*/*) echo " ${ file %%/* } " ; ;
*) echo " $file " ; ;
esac
done | sort | uniq
fi
}
@ -424,14 +369,8 @@ __git_refs ()
done
; ;
*)
git ls-remote " $dir " HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
while read -r hash i; do
case " $i " in
*^{ } ) ; ;
refs/*) echo " ${ i #refs/*/ } " ; ;
*) echo " $i " ; ;
esac
done
echo "HEAD"
git for -each-ref --format= "%(refname:short)" -- " refs/remotes/ $dir / " | sed -e " s#^ $dir /## "
; ;
esac
}
@ -549,44 +488,23 @@ __git_complete_revlist_file ()
}
# __git_complete_index_file requires 1 argument: the options to pass to
# ls-file
# __git_complete_index_file requires 1 argument:
# 1: the options to pass to ls-file
#
# The exception is --committable, which finds the files appropriate commit.
__git_complete_index_file ( )
{
local pfx cur_ = " $cur "
local pfx = "" cur_ = " $cur "
case " $cur_ " in
?*/*)
pfx = " ${ cur_ %/* } "
cur_ = " ${ cur_ ##*/ } "
pfx = " ${ pfx } / "
__gitcomp_file " $( __git_index_files " $1 " " $pfx " ) " " $pfx " " $cur_ "
; ;
*)
__gitcomp_file " $( __git_index_files " $1 " ) " "" " $cur_ "
; ;
esac
}
# __git_complete_diff_index_file requires 1 argument: the id of a tree
# object
__git_complete_diff_index_file ( )
{
local pfx cur_ = " $cur "
case " $cur_ " in
?*/*)
pfx = " ${ cur_ %/* } "
cur_ = " ${ cur_ ##*/ } "
pfx = " ${ pfx } / "
__gitcomp_file " $( __git_diff_index_files " $1 " " $pfx " ) " " $pfx " " $cur_ "
; ;
*)
__gitcomp_file " $( __git_diff_index_files " $1 " ) " "" " $cur_ "
; ;
esac
__gitcomp_file " $( __git_index_files " $1 " " $pfx " ) " " $pfx " " $cur_ "
}
__git_complete_file ( )
@ -614,7 +532,6 @@ __git_complete_remote_or_refspec ()
case " $cmd " in
push) no_complete_refspec = 1 ; ;
fetch)
COMPREPLY = ( )
return
; ;
*) ; ;
@ -630,7 +547,6 @@ __git_complete_remote_or_refspec ()
return
fi
if [ $no_complete_refspec = 1 ] ; then
COMPREPLY = ( )
return
fi
[ " $remote " = "." ] && remote =
@ -732,6 +648,7 @@ __git_list_porcelain_commands ()
cat-file) : plumbing; ;
check-attr) : plumbing; ;
check-ignore) : plumbing; ;
check-mailmap) : plumbing; ;
check-ref-format) : plumbing; ;
checkout-index) : plumbing; ;
commit-tree) : plumbing; ;
@ -951,7 +868,6 @@ _git_am ()
"
return
esac
COMPREPLY = ( )
}
_git_apply ( )
@ -971,7 +887,6 @@ _git_apply ()
"
return
esac
COMPREPLY = ( )
}
_git_add ( )
@ -1031,7 +946,6 @@ _git_bisect ()
__gitcomp_nl " $( __git_refs) "
; ;
*)
COMPREPLY = ( )
; ;
esac
}
@ -1124,9 +1038,14 @@ _git_cherry ()
_git_cherry_pick ( )
{
local dir = " $( __gitdir) "
if [ -f " $dir " /CHERRY_PICK_HEAD ] ; then
__gitcomp "--continue --quit --abort"
return
fi
case " $cur " in
--*)
__gitcomp "--edit --no-commit"
__gitcomp "--edit --no-commit --signoff --strategy= --mainline "
; ;
*)
__gitcomp_nl " $( __git_refs) "
@ -1170,7 +1089,6 @@ _git_clone ()
return
; ;
esac
COMPREPLY = ( )
}
_git_commit ( )
@ -1182,13 +1100,6 @@ _git_commit ()
; ;
esac
case " $prev " in
-c| -C)
__gitcomp_nl " $( __git_refs) " "" " ${ cur } "
return
; ;
esac
case " $cur " in
--cleanup= *)
__gitcomp " default strip verbatim whitespace
@ -1218,7 +1129,7 @@ _git_commit ()
esac
if git rev-parse --verify --quiet HEAD >/dev/null; then
__git_complete_diff_index_file "HEAD "
__git_complete_index_file "--committable "
else
# This is the first commit
__git_complete_index_file "--cached"
@ -1251,7 +1162,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary
--no-prefix --src-prefix= --dst-prefix=
--inter-hunk-context=
--patience --histogram --minimal
--raw
--raw --word-diff
--dirstat --dirstat= --dirstat-by-file
--dirstat-by-file= --cumulative
--diff-algorithm=
@ -1299,7 +1210,7 @@ _git_difftool ()
return
; ;
esac
__git_complete_file
__git_complete_revlist_ file
}
__git_fetch_options = "
@ -1319,11 +1230,12 @@ _git_fetch ()
}
__git_format_patch_options = "
--stdout --attach --no-attach --thread --thread= --output-directory
--stdout --attach --no-attach --thread --thread= --no-thread
--numbered --start-number --numbered-files --keep-subject --signoff
--signature --no-signature --in-reply-to= --cc= --full-index --binary
--not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
--inline --suffix= --ignore-if-in-upstream --subject-prefix=
--output-directory --reroll-count --to= --quiet --notes
"
_git_format_patch ( )
@ -1354,7 +1266,6 @@ _git_fsck ()
return
; ;
esac
COMPREPLY = ( )
}
_git_gc ( )
@ -1365,7 +1276,6 @@ _git_gc ()
return
; ;
esac
COMPREPLY = ( )
}
_git_gitk ( )
@ -1442,7 +1352,6 @@ _git_init ()
return
; ;
esac
COMPREPLY = ( )
}
_git_ls_files ( )
@ -1578,7 +1487,6 @@ _git_mergetool ()
return
; ;
esac
COMPREPLY = ( )
}
_git_merge_base ( )
@ -1819,7 +1727,7 @@ __git_config_get_set_variables ()
_git_config ( )
{
case " $prev " in
branch.*.remote)
branch.*.remote| branch.*.pushremote)
__gitcomp_nl " $( __git_remotes) "
return
; ;
@ -1827,11 +1735,19 @@ _git_config ()
__gitcomp_nl " $( __git_refs) "
return
; ;
branch.*.rebase)
__gitcomp "false true"
return
; ;
remote.pushdefault)
__gitcomp_nl " $( __git_remotes) "
return
; ;
remote.*.fetch)
local remote = " ${ prev #remote. } "
remote = " ${ remote %.fetch } "
if [ -z " $cur " ] ; then
COMPREPLY = ( "refs/heads/" )
__gitcomp_nl "refs/heads/" "" "" ""
return
fi
__gitcomp_nl " $( __git_refs_remotes " $remote " ) "
@ -1866,6 +1782,10 @@ _git_config ()
"
return
; ;
diff.submodule)
__gitcomp "log short"
return
; ;
help.format)
__gitcomp "man info web html"
return
@ -1891,7 +1811,6 @@ _git_config ()
return
; ;
*.*)
COMPREPLY = ( )
return
; ;
esac
@ -1908,7 +1827,7 @@ _git_config ()
; ;
branch.*.*)
local pfx = " ${ cur %.* } . " cur_ = " ${ cur ##*. } "
__gitcomp "remote merge mergeoptions rebase" " $pfx " " $cur_ "
__gitcomp "remote pushremote merge mergeoptions rebase" " $pfx " " $cur_ "
return
; ;
branch.*)
@ -2039,7 +1958,6 @@ _git_config ()
core.fileMode
core.fsyncobjectfiles
core.gitProxy
core.ignoreCygwinFSTricks
core.ignoreStat
core.ignorecase
core.logAllRefUpdates
@ -2061,13 +1979,14 @@ _git_config ()
core.whitespace
core.worktree
diff.autorefreshindex
diff.statGraphWidth
diff.external
diff.ignoreSubmodules
diff.mnemonicprefix
diff.noprefix
diff.renameLimit
diff.renames
diff.statGraphWidth
diff.submodule
diff.suppressBlankEmpty
diff.tool
diff.wordRegex
@ -2202,6 +2121,7 @@ _git_config ()
receive.fsckObjects
receive.unpackLimit
receive.updateserverinfo
remote.pushdefault
remotes.
repack.usedeltabaseoffset
rerere.autoupdate
@ -2272,7 +2192,6 @@ _git_remote ()
__gitcomp " $c "
; ;
*)
COMPREPLY = ( )
; ;
esac
}
@ -2356,7 +2275,7 @@ _git_show ()
return
; ;
esac
__git_complete_file
__git_complete_revlist_ file
}
_git_show_branch ( )
@ -2388,8 +2307,6 @@ _git_stash ()
*)
if [ -z " $( __git_find_on_cmdline " $save_opts " ) " ] ; then
__gitcomp " $subcommands "
else
COMPREPLY = ( )
fi
; ;
esac
@ -2402,14 +2319,12 @@ _git_stash ()
__gitcomp "--index --quiet"
; ;
show,--*| drop,--*| branch,--*)
COMPREPLY = ( )
; ;
show,*| apply,*| drop,*| pop,*| branch,*)
__gitcomp_nl " $( git --git-dir= " $( __gitdir) " stash list \
| sed -n -e 's/:.*//p' ) "
; ;
*)
COMPREPLY = ( )
; ;
esac
fi
@ -2419,7 +2334,7 @@ _git_submodule ()
{
__git_has_doubledash && return
local subcommands = "add status init update summary foreach sync"
local subcommands = "add status init deinit update summary foreach sync"
if [ -z " $( __git_find_on_cmdline " $subcommands " ) " ] ; then
case " $cur " in
--*)
@ -2451,7 +2366,7 @@ _git_svn ()
--no-metadata --use-svm-props --use-svnsync-props
--log-window-size= --no-checkout --quiet
--repack-flags --use-log-author --localtime
--ignore-paths= $remote_opts
--ignore-paths= --include-paths= $remote_opts
"
local init_opts = "
--template= --shared= --trunk= --tags=
@ -2526,7 +2441,6 @@ _git_svn ()
__gitcomp "--revision= --parent"
; ;
*)
COMPREPLY = ( )
; ;
esac
fi
@ -2551,13 +2465,10 @@ _git_tag ()
case " $prev " in
-m| -F)
COMPREPLY = ( )
; ;
-*| tag)
if [ $f = 1 ] ; then
__gitcomp_nl " $( __git_tags) "
else
COMPREPLY = ( )
fi
; ;
*)
@ -2579,9 +2490,10 @@ __git_main ()
i = " ${ words [c] } "
case " $i " in
--git-dir= *) __git_dir = " ${ i #--git-dir= } " ; ;
--git-dir) ( ( c++) ) ; __git_dir = " ${ words [c] } " ; ;
--bare) __git_dir = "." ; ;
--help) command = "help" ; break ; ;
-c) c = $(( + + c) ) ; ;
-c| --work-tree| --namespace) ( ( c++) ) ; ;
-*) ; ;
*) command = " $i " ; break ; ;
esac
@ -2599,6 +2511,7 @@ __git_main ()
--exec-path
--exec-path=
--html-path
--man-path
--info-path
--work-tree=
--namespace=
@ -2693,35 +2606,19 @@ if [[ -n ${ZSH_VERSION-} ]]; then
compadd -Q -p " ${ 2 - } " -f -- ${ =1 } && _ret = 0
}
__git_zsh_helper ( )
{
emulate -L ksh
local cur cword prev
cur = ${ words [CURRENT-1] }
prev = ${ words [CURRENT-2] }
let cword = CURRENT-1
__${ service } _main
}
_git ( )
{
emulate -L zsh
local _ret = 1
__git_zsh_helper
let _ret && _default -S '' && _ret = 0
local _ret = 1 cur cword prev
cur = ${ words [CURRENT] }
prev = ${ words [CURRENT-1] }
let cword = CURRENT-1
emulate ksh -c __${ service } _main
let _ret && _default && _ret = 0
return _ret
}
compdef _git git gitk
return
elif [ [ -n ${ BASH_VERSION - } ] ] ; then
if ( ( ${ BASH_VERSINFO [0] } < 4) ) ; then
# compopt is not supported
__git_index_file_list_filter ( )
{
__git_index_file_list_filter_compat
}
fi
fi
__git_func_wrap ( )