git-completion.bash: zsh does not implement function redirection correctly
A recent change added functions whose entire standard error stream is redirected to /dev/null using a construct that is valid POSIX.1 but is not widely used: funcname () { cd "$1" && run some command "$2" } 2>/dev/null Even though this file is "git-completion.bash", zsh completion support dot-sources it (instead of asking bash to grok it like tcsh completion does), and zsh does not implement this redirection correctly. With zsh, trying to complete an inexistant directory gave this: git add no-such-dir/__git_ls_files_helper💿2: no such file or directory: no-such-dir/ Also these functions use "cd" to first go somewhere else before running a command, but the location the caller wants them to go that is given as an argument to them should not be affected by CDPATH variable the users may have set for their interactive session. To fix both of these, wrap the body of the function in a subshell, unset CDPATH at the beginning of the subshell, and redirect the standard error stream of the subshell to /dev/null. Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
926eb7ba4c
commit
35ba83ccf6
@ -299,9 +299,12 @@ __git_index_file_list_filter ()
|
|||||||
# the second argument.
|
# the second argument.
|
||||||
__git_ls_files_helper ()
|
__git_ls_files_helper ()
|
||||||
{
|
{
|
||||||
# NOTE: $2 is not quoted in order to support multiple options
|
(
|
||||||
cd "$1" && git ls-files --exclude-standard $2
|
test -n "${CDPATH+set}" && unset CDPATH
|
||||||
} 2>/dev/null
|
# NOTE: $2 is not quoted in order to support multiple options
|
||||||
|
cd "$1" && git ls-files --exclude-standard $2
|
||||||
|
) 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Execute git diff-index, returning paths relative to the directory
|
# Execute git diff-index, returning paths relative to the directory
|
||||||
@ -309,8 +312,11 @@ __git_ls_files_helper ()
|
|||||||
# specified in the second argument.
|
# specified in the second argument.
|
||||||
__git_diff_index_helper ()
|
__git_diff_index_helper ()
|
||||||
{
|
{
|
||||||
cd "$1" && git diff-index --name-only --relative "$2"
|
(
|
||||||
} 2>/dev/null
|
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:
|
# __git_index_files accepts 1 or 2 arguments:
|
||||||
# 1: Options to pass to ls-files (required).
|
# 1: Options to pass to ls-files (required).
|
||||||
|
Reference in New Issue
Block a user