completion: respect 'git --git-dir=<path>' when listing remote refs

In __git_refs() the git commands listing refs, both short and full,
from a given remote repository are run without giving them the path to
the git repository which might have been specified on the command line
via 'git --git-dir=<path>'.  This is bad, those git commands should
access the 'refs/remotes/<remote>/' hierarchy or the remote and
credentials configuration in that specified repository.

Use the __gitdir() helper only to find the path to the .git directory
and pass the resulting path to the 'git ls-remote' and 'for-each-ref'
executions that list remote refs.  While modifying that 'for-each-ref'
line, remove the superfluous disambiguating doubledash.

Don't use __gitdir() to check that the given remote is on the file
system: basically it performs only a single if statement for us at the
considerable cost of fork()ing a subshell for a command substitution.
We are better off to perform all the necessary checks of the remote in
__git_refs().

Though __git_refs() was the last remaining callsite that passed a
remote to __gitdir(), don't delete __gitdir()'s remote-handling part
yet, just in case some users' custom completion scriptlets depend on
it.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
SZEDER Gábor 2017-02-03 03:48:17 +01:00 коммит произвёл Junio C Hamano
Родитель 3bcb41f976
Коммит 5c12f642df
2 изменённых файлов: 19 добавлений и 7 удалений

Просмотреть файл

@ -342,9 +342,21 @@ __git_tags ()
# 'git checkout's tracking DWIMery (optional; ignored, if set but empty). # 'git checkout's tracking DWIMery (optional; ignored, if set but empty).
__git_refs () __git_refs ()
{ {
local i hash dir="$(__gitdir "${1-}")" track="${2-}" local i hash dir="$(__gitdir)" track="${2-}"
local list_refs_from=path remote="${1-}"
local format refs pfx local format refs pfx
if [ -d "$dir" ]; then
if [ -n "$remote" ]; then
if [ -d "$remote/.git" ]; then
dir="$remote/.git"
elif [ -d "$remote" ]; then
dir="$remote"
else
list_refs_from=remote
fi
fi
if [ "$list_refs_from" = path ] && [ -d "$dir" ]; then
case "$cur" in case "$cur" in
refs|refs/*) refs|refs/*)
format="refname" format="refname"
@ -381,7 +393,7 @@ __git_refs ()
fi fi
case "$cur" in case "$cur" in
refs|refs/*) refs|refs/*)
git ls-remote "$dir" "$cur*" 2>/dev/null | \ git --git-dir="$dir" ls-remote "$remote" "$cur*" 2>/dev/null | \
while read -r hash i; do while read -r hash i; do
case "$i" in case "$i" in
*^{}) ;; *^{}) ;;
@ -391,8 +403,8 @@ __git_refs ()
;; ;;
*) *)
echo "HEAD" echo "HEAD"
git for-each-ref --format="%(refname:short)" -- \ git --git-dir="$dir" for-each-ref --format="%(refname:short)" \
"refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##" "refs/remotes/$remote/" 2>/dev/null | sed -e "s#^$remote/##"
;; ;;
esac esac
} }

Просмотреть файл

@ -486,7 +486,7 @@ test_expect_success '__git_refs - configured remote - full refs' '
test_cmp expected "$actual" test_cmp expected "$actual"
' '
test_expect_failure '__git_refs - configured remote - repo given on the command line' ' test_expect_success '__git_refs - configured remote - repo given on the command line' '
cat >expected <<-EOF && cat >expected <<-EOF &&
HEAD HEAD
branch-in-other branch-in-other
@ -501,7 +501,7 @@ test_expect_failure '__git_refs - configured remote - repo given on the command
test_cmp expected "$actual" test_cmp expected "$actual"
' '
test_expect_failure '__git_refs - configured remote - full refs - repo given on the command line' ' test_expect_success '__git_refs - configured remote - full refs - repo given on the command line' '
cat >expected <<-EOF && cat >expected <<-EOF &&
refs/heads/branch-in-other refs/heads/branch-in-other
refs/heads/master-in-other refs/heads/master-in-other