Merge branch 'fc/completion-tests'

By Felipe Contreras (4) and others
* fc/completion-tests:
  completion: fix completion after 'git --option <TAB>'
  completion: avoid trailing space for --exec-path
  completion: add missing general options
  completion: simplify by using $prev
  completion: simplify __gitcomp_1
  tests: add tests for the __gitcomp() completion helper function
  tests: add initial bash completion tests
This commit is contained in:
Junio C Hamano 2012-04-24 14:41:22 -07:00
commit 745ef0625b
2 changed files with 256 additions and 9 deletions

View File

@ -304,16 +304,16 @@ __git_ps1 ()
fi fi
} }
# __gitcomp_1 requires 2 arguments
__gitcomp_1 () __gitcomp_1 ()
{ {
local c IFS=' '$'\t'$'\n' local c IFS=$' \t\n'
for c in $1; do for c in $1; do
case "$c$2" in c="$c$2"
--*=*) printf %s$'\n' "$c$2" ;; case $c in
*.) printf %s$'\n' "$c$2" ;; --*=*|*.) ;;
*) printf %s$'\n' "$c$2 " ;; *) c="$c " ;;
esac esac
printf '%s\n' "$c"
done done
} }
@ -1658,7 +1658,7 @@ _git_notes ()
__gitcomp '--ref' __gitcomp '--ref'
;; ;;
,*) ,*)
case "${words[cword-1]}" in case "$prev" in
--ref) --ref)
__gitcomp_nl "$(__git_refs)" __gitcomp_nl "$(__git_refs)"
;; ;;
@ -1684,7 +1684,7 @@ _git_notes ()
prune,*) prune,*)
;; ;;
*) *)
case "${words[cword-1]}" in case "$prev" in
-m|-F) -m|-F)
;; ;;
*) *)
@ -2623,8 +2623,9 @@ _git ()
case "$i" in case "$i" in
--git-dir=*) __git_dir="${i#--git-dir=}" ;; --git-dir=*) __git_dir="${i#--git-dir=}" ;;
--bare) __git_dir="." ;; --bare) __git_dir="." ;;
--version|-p|--paginate) ;;
--help) command="help"; break ;; --help) command="help"; break ;;
-c) c=$((++c)) ;;
-*) ;;
*) command="$i"; break ;; *) command="$i"; break ;;
esac esac
((c++)) ((c++))
@ -2639,9 +2640,12 @@ _git ()
--bare --bare
--version --version
--exec-path --exec-path
--exec-path=
--html-path --html-path
--info-path
--work-tree= --work-tree=
--namespace= --namespace=
--no-replace-objects
--help --help
" "
;; ;;

243
t/t9902-completion.sh Executable file
View File

@ -0,0 +1,243 @@
#!/bin/sh
#
# Copyright (c) 2012 Felipe Contreras
#
if test -n "$BASH" && test -z "$POSIXLY_CORRECT"; then
# we are in full-on bash mode
true
elif type bash >/dev/null 2>&1; then
# execute in full-on bash mode
unset POSIXLY_CORRECT
exec bash "$0" "$@"
else
echo '1..0 #SKIP skipping bash completion tests; bash not available'
exit 0
fi
test_description='test bash completion'
. ./test-lib.sh
complete ()
{
# do nothing
return 0
}
. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
# We don't need this function to actually join words or do anything special.
# Also, it's cleaner to avoid touching bash's internal completion variables.
# So let's override it with a minimal version for testing purposes.
_get_comp_words_by_ref ()
{
while [ $# -gt 0 ]; do
case "$1" in
cur)
cur=${_words[_cword]}
;;
prev)
prev=${_words[_cword-1]}
;;
words)
words=("${_words[@]}")
;;
cword)
cword=$_cword
;;
esac
shift
done
}
print_comp ()
{
local IFS=$'\n'
echo "${COMPREPLY[*]}" > out
}
run_completion ()
{
local -a COMPREPLY _words
local _cword
_words=( $1 )
(( _cword = ${#_words[@]} - 1 ))
_git && print_comp
}
test_completion ()
{
test $# -gt 1 && echo "$2" > expected
run_completion "$@" &&
test_cmp expected out
}
newline=$'\n'
test_expect_success '__gitcomp - trailing space - options' '
sed -e "s/Z$//" >expected <<-\EOF &&
--reuse-message=Z
--reedit-message=Z
--reset-author Z
EOF
(
local -a COMPREPLY &&
cur="--re" &&
__gitcomp "--dry-run --reuse-message= --reedit-message=
--reset-author" &&
IFS="$newline" &&
echo "${COMPREPLY[*]}" > out
) &&
test_cmp expected out
'
test_expect_success '__gitcomp - trailing space - config keys' '
sed -e "s/Z$//" >expected <<-\EOF &&
branch.Z
branch.autosetupmerge Z
branch.autosetuprebase Z
browser.Z
EOF
(
local -a COMPREPLY &&
cur="br" &&
__gitcomp "branch. branch.autosetupmerge
branch.autosetuprebase browser." &&
IFS="$newline" &&
echo "${COMPREPLY[*]}" > out
) &&
test_cmp expected out
'
test_expect_success '__gitcomp - option parameter' '
sed -e "s/Z$//" >expected <<-\EOF &&
recursive Z
resolve Z
EOF
(
local -a COMPREPLY &&
cur="--strategy=re" &&
__gitcomp "octopus ours recursive resolve subtree
" "" "re" &&
IFS="$newline" &&
echo "${COMPREPLY[*]}" > out
) &&
test_cmp expected out
'
test_expect_success '__gitcomp - prefix' '
sed -e "s/Z$//" >expected <<-\EOF &&
branch.maint.merge Z
branch.maint.mergeoptions Z
EOF
(
local -a COMPREPLY &&
cur="branch.me" &&
__gitcomp "remote merge mergeoptions rebase
" "branch.maint." "me" &&
IFS="$newline" &&
echo "${COMPREPLY[*]}" > out
) &&
test_cmp expected out
'
test_expect_success '__gitcomp - suffix' '
sed -e "s/Z$//" >expected <<-\EOF &&
branch.master.Z
branch.maint.Z
EOF
(
local -a COMPREPLY &&
cur="branch.me" &&
__gitcomp "master maint next pu
" "branch." "ma" "." &&
IFS="$newline" &&
echo "${COMPREPLY[*]}" > out
) &&
test_cmp expected out
'
test_expect_success 'basic' '
run_completion "git \"\"" &&
# built-in
grep -q "^add \$" out &&
# script
grep -q "^filter-branch \$" out &&
# plumbing
! grep -q "^ls-files \$" out &&
run_completion "git f" &&
! grep -q -v "^f" out
'
test_expect_success 'double dash "git" itself' '
sed -e "s/Z$//" >expected <<-\EOF &&
--paginate Z
--no-pager Z
--git-dir=
--bare Z
--version Z
--exec-path Z
--exec-path=
--html-path Z
--info-path Z
--work-tree=
--namespace=
--no-replace-objects Z
--help Z
EOF
test_completion "git --"
'
test_expect_success 'double dash "git checkout"' '
sed -e "s/Z$//" >expected <<-\EOF &&
--quiet Z
--ours Z
--theirs Z
--track Z
--no-track Z
--merge Z
--conflict=
--orphan Z
--patch Z
EOF
test_completion "git checkout --"
'
test_expect_success 'general options' '
test_completion "git --ver" "--version " &&
test_completion "git --hel" "--help " &&
sed -e "s/Z$//" >expected <<-\EOF &&
--exec-path Z
--exec-path=
EOF
test_completion "git --exe" &&
test_completion "git --htm" "--html-path " &&
test_completion "git --pag" "--paginate " &&
test_completion "git --no-p" "--no-pager " &&
test_completion "git --git" "--git-dir=" &&
test_completion "git --wor" "--work-tree=" &&
test_completion "git --nam" "--namespace=" &&
test_completion "git --bar" "--bare " &&
test_completion "git --inf" "--info-path " &&
test_completion "git --no-r" "--no-replace-objects "
'
test_expect_success 'general options plus command' '
test_completion "git --version check" "checkout " &&
test_completion "git --paginate check" "checkout " &&
test_completion "git --git-dir=foo check" "checkout " &&
test_completion "git --bare check" "checkout " &&
test_completion "git --help des" "describe " &&
test_completion "git --exec-path=foo check" "checkout " &&
test_completion "git --html-path check" "checkout " &&
test_completion "git --no-pager check" "checkout " &&
test_completion "git --work-tree=foo check" "checkout " &&
test_completion "git --namespace=foo check" "checkout " &&
test_completion "git --paginate check" "checkout " &&
test_completion "git --info-path check" "checkout " &&
test_completion "git --no-replace-objects check" "checkout "
'
test_done