Skip to content

Commit

Permalink
completion: add hack to enable file mode in bash < 4
Browse files Browse the repository at this point in the history
This way we don't need all the compat stuff, different filters, and so
on. Also, now we complete exactly the same in bash 3 and bash 4.

This is the way bash-completion did it for quite some time, when bash 3
was supported. For more information about the hack:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=272660#64

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Felipe Contreras authored and Junio C Hamano committed Apr 27, 2013
1 parent fda54ef commit 3ffa4df
Showing 1 changed file with 7 additions and 36 deletions.
43 changes: 7 additions & 36 deletions contrib/completion/git-completion.bash
Original file line number Diff line number Diff line change
Expand Up @@ -254,49 +254,28 @@ __gitcomp_file ()
# completion will be used.
__gitcompadd "$1" "${2-}" "${3-$cur}" ""

# Tell Bash that compspec generates filenames.
compopt -o filenames 2>/dev/null
# use a hack to enable file mode in bash < 4
compopt -o filenames 2>/dev/null ||
compgen -f /non-existing-dir/ > /dev/null
}

__git_index_file_list_filter_compat ()
{
local path

while read -r path; do
case "$path" in
?*/*) echo "${path%%/*}/" ;;
*) echo "$path" ;;
esac
done
}

__git_index_file_list_filter_bash ()
# 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 ()
{
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', 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
Expand Down Expand Up @@ -2651,14 +2630,6 @@ if [[ -n ${ZSH_VERSION-} ]]; then

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 ()
Expand Down

0 comments on commit 3ffa4df

Please sign in to comment.