2012-04-12 01:57:03 +04:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2012 Felipe Contreras
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='test bash completion'
|
|
|
|
|
2012-05-09 04:44:32 +04:00
|
|
|
. ./lib-bash.sh
|
2012-04-12 01:57:03 +04:00
|
|
|
|
|
|
|
complete ()
|
|
|
|
{
|
|
|
|
# do nothing
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2013-01-25 03:08:37 +04:00
|
|
|
# Be careful when updating this list:
|
|
|
|
#
|
|
|
|
# (1) The build tree may have build artifact from different branch, or
|
|
|
|
# the user's $PATH may have a random executable that may begin
|
|
|
|
# with "git-check" that are not part of the subcommands this build
|
|
|
|
# will ship, e.g. "check-ignore". The tests for completion for
|
|
|
|
# subcommand names tests how "check" is expanded; we limit the
|
|
|
|
# possible candidates to "checkout" and "check-attr" to make sure
|
|
|
|
# "check-attr", which is known by the filter function as a
|
|
|
|
# subcommand to be thrown out, while excluding other random files
|
|
|
|
# that happen to begin with "check" to avoid letting them get in
|
|
|
|
# the way.
|
|
|
|
#
|
|
|
|
# (2) A test makes sure that common subcommands are included in the
|
|
|
|
# completion for "git <TAB>", and a plumbing is excluded. "add",
|
|
|
|
# "filter-branch" and "ls-files" are listed for this.
|
|
|
|
|
|
|
|
GIT_TESTING_COMMAND_COMPLETION='add checkout check-attr filter-branch ls-files'
|
|
|
|
|
2012-04-12 01:57:03 +04:00
|
|
|
. "$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 )
|
2013-08-22 00:49:32 +04:00
|
|
|
test "${1: -1}" = ' ' && _words[${#_words[@]}+1]=''
|
2012-04-12 01:57:03 +04:00
|
|
|
(( _cword = ${#_words[@]} - 1 ))
|
2012-06-13 12:08:50 +04:00
|
|
|
__git_wrap__git_main && print_comp
|
2012-04-12 01:57:03 +04:00
|
|
|
}
|
|
|
|
|
2012-11-11 18:35:53 +04:00
|
|
|
# Test high-level completion
|
|
|
|
# Arguments are:
|
|
|
|
# 1: typed text so far (cur)
|
|
|
|
# 2: expected completion
|
2012-04-12 01:57:03 +04:00
|
|
|
test_completion ()
|
|
|
|
{
|
2012-11-11 18:35:56 +04:00
|
|
|
if test $# -gt 1
|
|
|
|
then
|
|
|
|
printf '%s\n' "$2" >expected
|
|
|
|
else
|
|
|
|
sed -e 's/Z$//' >expected
|
|
|
|
fi &&
|
2012-11-11 18:35:53 +04:00
|
|
|
run_completion "$1" &&
|
2012-04-12 01:57:03 +04:00
|
|
|
test_cmp expected out
|
|
|
|
}
|
|
|
|
|
2012-11-11 18:35:57 +04:00
|
|
|
# Test __gitcomp.
|
|
|
|
# The first argument is the typed text so far (cur); the rest are
|
|
|
|
# passed to __gitcomp. Expected output comes is read from the
|
|
|
|
# standard input, like test_completion().
|
|
|
|
test_gitcomp ()
|
2012-09-27 01:47:51 +04:00
|
|
|
{
|
2012-11-11 18:35:58 +04:00
|
|
|
local -a COMPREPLY &&
|
2012-11-11 18:35:57 +04:00
|
|
|
sed -e 's/Z$//' >expected &&
|
2017-02-03 05:48:11 +03:00
|
|
|
local cur="$1" &&
|
2012-11-11 18:35:58 +04:00
|
|
|
shift &&
|
|
|
|
__gitcomp "$@" &&
|
|
|
|
print_comp &&
|
2012-04-17 14:27:15 +04:00
|
|
|
test_cmp expected out
|
2012-09-27 01:47:51 +04:00
|
|
|
}
|
|
|
|
|
2013-04-10 10:57:54 +04:00
|
|
|
# Test __gitcomp_nl
|
|
|
|
# Arguments are:
|
|
|
|
# 1: current word (cur)
|
|
|
|
# -: the rest are passed to __gitcomp_nl
|
|
|
|
test_gitcomp_nl ()
|
|
|
|
{
|
|
|
|
local -a COMPREPLY &&
|
|
|
|
sed -e 's/Z$//' >expected &&
|
2017-02-03 05:48:11 +03:00
|
|
|
local cur="$1" &&
|
2013-04-10 10:57:54 +04:00
|
|
|
shift &&
|
|
|
|
__gitcomp_nl "$@" &&
|
|
|
|
print_comp &&
|
|
|
|
test_cmp expected out
|
|
|
|
}
|
|
|
|
|
|
|
|
invalid_variable_name='${foo.bar}'
|
|
|
|
|
2013-06-17 22:31:51 +04:00
|
|
|
actual="$TRASH_DIRECTORY/actual"
|
|
|
|
|
2017-02-03 05:48:12 +03:00
|
|
|
if test_have_prereq MINGW
|
|
|
|
then
|
|
|
|
ROOT="$(pwd -W)"
|
|
|
|
else
|
|
|
|
ROOT="$(pwd)"
|
|
|
|
fi
|
|
|
|
|
2013-06-17 22:31:51 +04:00
|
|
|
test_expect_success 'setup for __gitdir tests' '
|
|
|
|
mkdir -p subdir/subsubdir &&
|
|
|
|
git init otherrepo
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - from command line (through $__git_dir)' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
2013-06-17 22:31:51 +04:00
|
|
|
(
|
2017-02-03 05:48:12 +03:00
|
|
|
__git_dir="$ROOT/otherrepo/.git" &&
|
2013-06-17 22:31:51 +04:00
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - repo as argument' '
|
|
|
|
echo "otherrepo/.git" >expected &&
|
|
|
|
__gitdir "otherrepo" >"$actual" &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - remote as argument' '
|
|
|
|
echo "remote" >expected &&
|
|
|
|
__gitdir "remote" >"$actual" &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - .git directory in cwd' '
|
|
|
|
echo ".git" >expected &&
|
|
|
|
__gitdir >"$actual" &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - .git directory in parent' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/.git" >expected &&
|
2013-06-17 22:31:51 +04:00
|
|
|
(
|
|
|
|
cd subdir/subsubdir &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - cwd is a .git directory' '
|
|
|
|
echo "." >expected &&
|
|
|
|
(
|
|
|
|
cd .git &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - parent is a .git directory' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/.git" >expected &&
|
2013-06-17 22:31:51 +04:00
|
|
|
(
|
|
|
|
cd .git/refs/heads &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - $GIT_DIR set while .git directory in cwd' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
2013-06-17 22:31:51 +04:00
|
|
|
(
|
2017-02-03 05:48:12 +03:00
|
|
|
GIT_DIR="$ROOT/otherrepo/.git" &&
|
2013-06-17 22:31:51 +04:00
|
|
|
export GIT_DIR &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - $GIT_DIR set while .git directory in parent' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
2013-06-17 22:31:51 +04:00
|
|
|
(
|
2017-02-03 05:48:12 +03:00
|
|
|
GIT_DIR="$ROOT/otherrepo/.git" &&
|
2013-06-17 22:31:51 +04:00
|
|
|
export GIT_DIR &&
|
|
|
|
cd subdir &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
completion: respect 'git -C <path>'
'git -C <path>' option(s) on the command line should be taken into
account during completion, because
- like '--git-dir=<path>', it can lead us to a different repository,
- a few git commands executed in the completion script do care about
in which directory they are executed, and
- the command for which we are providing completion might care about
in which directory it will be executed.
However, unlike '--git-dir=<path>', the '-C <path>' option can be
specified multiple times and their effect is cumulative, so we can't
just store a single '<path>' in a variable. Nor can we simply
concatenate a path from '-C <path1> -C <path2> ...', because e.g. (in
an arguably pathological corner case) a relative path might be
followed by an absolute path.
Instead, store all '-C <path>' options word by word in the
$__git_C_args array in the main git completion function, and pass this
array, if present, to 'git rev-parse --absolute-git-dir' when
discovering the repository in __gitdir(), and let it take care of
multiple options, relative paths, absolute paths and everything.
Also pass all '-C <path> options via the $__git_C_args array to those
git executions which require a worktree and for which it matters from
which directory they are executed from. There are only three such
cases:
- 'git diff-index' and 'git ls-files' in __git_ls_files_helper()
used for git-aware filename completion, and
- the 'git ls-tree' used for completing the 'ref:path' notation.
The other git commands executed in the completion script don't need
these '-C <path>' options, because __gitdir() already took those
options into account. It would not hurt them, either, but let's not
induce unnecessary code churn.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:24 +03:00
|
|
|
test_expect_success '__gitdir - from command line while "git -C"' '
|
|
|
|
echo "$ROOT/.git" >expected &&
|
|
|
|
(
|
|
|
|
__git_dir="$ROOT/.git" &&
|
|
|
|
__git_C_args=(-C otherrepo) &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - relative dir from command line and "git -C"' '
|
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
|
|
|
(
|
|
|
|
cd subdir &&
|
|
|
|
__git_dir="otherrepo/.git" &&
|
|
|
|
__git_C_args=(-C ..) &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - $GIT_DIR set while "git -C"' '
|
|
|
|
echo "$ROOT/.git" >expected &&
|
|
|
|
(
|
|
|
|
GIT_DIR="$ROOT/.git" &&
|
|
|
|
export GIT_DIR &&
|
|
|
|
__git_C_args=(-C otherrepo) &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - relative dir in $GIT_DIR and "git -C"' '
|
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
|
|
|
(
|
|
|
|
cd subdir &&
|
|
|
|
GIT_DIR="otherrepo/.git" &&
|
|
|
|
export GIT_DIR &&
|
|
|
|
__git_C_args=(-C ..) &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - "git -C" while .git directory in cwd' '
|
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
|
|
|
(
|
|
|
|
__git_C_args=(-C otherrepo) &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - "git -C" while cwd is a .git directory' '
|
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
|
|
|
(
|
|
|
|
cd .git &&
|
|
|
|
__git_C_args=(-C .. -C otherrepo) &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - "git -C" while .git directory in parent' '
|
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
|
|
|
(
|
|
|
|
cd subdir &&
|
|
|
|
__git_C_args=(-C .. -C otherrepo) &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - non-existing path in "git -C"' '
|
|
|
|
(
|
|
|
|
__git_C_args=(-C non-existing) &&
|
|
|
|
test_must_fail __gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
|
|
|
'
|
|
|
|
|
2017-02-03 05:48:15 +03:00
|
|
|
test_expect_success '__gitdir - non-existing path in $__git_dir' '
|
|
|
|
(
|
|
|
|
__git_dir="non-existing" &&
|
|
|
|
test_must_fail __gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
|
|
|
'
|
|
|
|
|
2013-06-17 22:31:51 +04:00
|
|
|
test_expect_success '__gitdir - non-existing $GIT_DIR' '
|
|
|
|
(
|
2017-02-03 05:48:12 +03:00
|
|
|
GIT_DIR="$ROOT/non-existing" &&
|
2013-06-17 22:31:51 +04:00
|
|
|
export GIT_DIR &&
|
2017-02-03 05:48:13 +03:00
|
|
|
test_must_fail __gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
2013-06-17 22:31:51 +04:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - gitfile in cwd' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
|
|
|
echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
|
2013-06-17 22:31:51 +04:00
|
|
|
test_when_finished "rm -f subdir/.git" &&
|
|
|
|
(
|
|
|
|
cd subdir &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - gitfile in parent' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
|
|
|
echo "gitdir: $ROOT/otherrepo/.git" >subdir/.git &&
|
2013-06-17 22:31:51 +04:00
|
|
|
test_when_finished "rm -f subdir/.git" &&
|
|
|
|
(
|
|
|
|
cd subdir/subsubdir &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success SYMLINKS '__gitdir - resulting path avoids symlinks' '
|
2017-02-03 05:48:12 +03:00
|
|
|
echo "$ROOT/otherrepo/.git" >expected &&
|
2013-06-17 22:31:51 +04:00
|
|
|
mkdir otherrepo/dir &&
|
|
|
|
test_when_finished "rm -rf otherrepo/dir" &&
|
|
|
|
ln -s otherrepo/dir link &&
|
|
|
|
test_when_finished "rm -f link" &&
|
|
|
|
(
|
|
|
|
cd link &&
|
|
|
|
__gitdir >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitdir - not a git repository' '
|
2017-02-03 05:48:13 +03:00
|
|
|
nongit test_must_fail __gitdir >"$actual" &&
|
|
|
|
test_must_be_empty "$actual"
|
2013-06-17 22:31:51 +04:00
|
|
|
'
|
|
|
|
|
2012-04-17 14:27:15 +04:00
|
|
|
test_expect_success '__gitcomp - trailing space - options' '
|
2012-11-11 18:35:57 +04:00
|
|
|
test_gitcomp "--re" "--dry-run --reuse-message= --reedit-message=
|
|
|
|
--reset-author" <<-EOF
|
2012-04-17 14:27:15 +04:00
|
|
|
--reuse-message=Z
|
|
|
|
--reedit-message=Z
|
|
|
|
--reset-author Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp - trailing space - config keys' '
|
2012-11-11 18:35:57 +04:00
|
|
|
test_gitcomp "br" "branch. branch.autosetupmerge
|
|
|
|
branch.autosetuprebase browser." <<-\EOF
|
2012-04-17 14:27:15 +04:00
|
|
|
branch.Z
|
|
|
|
branch.autosetupmerge Z
|
|
|
|
branch.autosetuprebase Z
|
|
|
|
browser.Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp - option parameter' '
|
2012-11-11 18:35:57 +04:00
|
|
|
test_gitcomp "--strategy=re" "octopus ours recursive resolve subtree" \
|
|
|
|
"" "re" <<-\EOF
|
2012-04-17 14:27:15 +04:00
|
|
|
recursive Z
|
|
|
|
resolve Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp - prefix' '
|
2012-11-11 18:35:57 +04:00
|
|
|
test_gitcomp "branch.me" "remote merge mergeoptions rebase" \
|
|
|
|
"branch.maint." "me" <<-\EOF
|
2012-04-17 14:27:15 +04:00
|
|
|
branch.maint.merge Z
|
|
|
|
branch.maint.mergeoptions Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp - suffix' '
|
2012-11-11 18:35:57 +04:00
|
|
|
test_gitcomp "branch.me" "master maint next pu" "branch." \
|
|
|
|
"ma" "." <<-\EOF
|
2012-04-17 14:27:15 +04:00
|
|
|
branch.master.Z
|
|
|
|
branch.maint.Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2013-04-10 10:57:55 +04:00
|
|
|
test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '
|
2013-04-10 10:57:54 +04:00
|
|
|
__gitcomp "$invalid_variable_name"
|
|
|
|
'
|
|
|
|
|
|
|
|
read -r -d "" refs <<-\EOF
|
|
|
|
maint
|
|
|
|
master
|
|
|
|
next
|
|
|
|
pu
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp_nl - trailing space' '
|
|
|
|
test_gitcomp_nl "m" "$refs" <<-EOF
|
|
|
|
maint Z
|
|
|
|
master Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp_nl - prefix' '
|
|
|
|
test_gitcomp_nl "--fixup=m" "$refs" "--fixup=" "m" <<-EOF
|
|
|
|
--fixup=maint Z
|
|
|
|
--fixup=master Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp_nl - suffix' '
|
|
|
|
test_gitcomp_nl "branch.ma" "$refs" "branch." "ma" "." <<-\EOF
|
|
|
|
branch.maint.Z
|
|
|
|
branch.master.Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__gitcomp_nl - no suffix' '
|
|
|
|
test_gitcomp_nl "ma" "$refs" "" "ma" "" <<-\EOF
|
|
|
|
maintZ
|
|
|
|
masterZ
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2013-04-10 10:57:55 +04:00
|
|
|
test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name' '
|
2013-04-10 10:57:54 +04:00
|
|
|
__gitcomp_nl "$invalid_variable_name"
|
|
|
|
'
|
|
|
|
|
2015-03-04 17:10:28 +03:00
|
|
|
test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from config file' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
remote_from_file_1
|
|
|
|
remote_from_file_2
|
|
|
|
remote_in_config_1
|
|
|
|
remote_in_config_2
|
|
|
|
EOF
|
|
|
|
test_when_finished "rm -rf .git/remotes" &&
|
|
|
|
mkdir -p .git/remotes &&
|
|
|
|
>.git/remotes/remote_from_file_1 &&
|
|
|
|
>.git/remotes/remote_from_file_2 &&
|
|
|
|
test_when_finished "git remote remove remote_in_config_1" &&
|
|
|
|
git remote add remote_in_config_1 git://remote_1 &&
|
|
|
|
test_when_finished "git remote remove remote_in_config_2" &&
|
|
|
|
git remote add remote_in_config_2 git://remote_2 &&
|
|
|
|
__git_remotes >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-02-03 05:48:18 +03:00
|
|
|
test_expect_success '__git_is_configured_remote' '
|
|
|
|
test_when_finished "git remote remove remote_1" &&
|
|
|
|
git remote add remote_1 git://remote_1 &&
|
|
|
|
test_when_finished "git remote remove remote_2" &&
|
|
|
|
git remote add remote_2 git://remote_2 &&
|
|
|
|
verbose __git_is_configured_remote remote_2 &&
|
|
|
|
test_must_fail __git_is_configured_remote non-existent
|
|
|
|
'
|
|
|
|
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
test_expect_success 'setup for ref completion' '
|
|
|
|
git commit --allow-empty -m initial &&
|
|
|
|
git branch matching-branch &&
|
|
|
|
git tag matching-tag &&
|
|
|
|
(
|
|
|
|
cd otherrepo &&
|
|
|
|
git commit --allow-empty -m initial &&
|
|
|
|
git branch -m master master-in-other &&
|
|
|
|
git branch branch-in-other &&
|
|
|
|
git tag tag-in-other
|
|
|
|
) &&
|
|
|
|
git remote add other "$ROOT/otherrepo/.git" &&
|
|
|
|
git fetch --no-tags other &&
|
|
|
|
rm -f .git/FETCH_HEAD &&
|
|
|
|
git init thirdrepo
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - simple' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
master
|
|
|
|
matching-branch
|
|
|
|
other/branch-in-other
|
|
|
|
other/master-in-other
|
|
|
|
matching-tag
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - full refs' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
refs/heads/master
|
|
|
|
refs/heads/matching-branch
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur=refs/heads/ &&
|
|
|
|
__git_refs >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - repo given on the command line' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
branch-in-other
|
|
|
|
master-in-other
|
|
|
|
tag-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
__git_dir="$ROOT/otherrepo/.git" &&
|
|
|
|
cur= &&
|
|
|
|
__git_refs >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - remote on local file system' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
branch-in-other
|
|
|
|
master-in-other
|
|
|
|
tag-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs otherrepo >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - remote on local file system - full refs' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
refs/heads/branch-in-other
|
|
|
|
refs/heads/master-in-other
|
|
|
|
refs/tags/tag-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur=refs/ &&
|
|
|
|
__git_refs otherrepo >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - configured remote' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
branch-in-other
|
|
|
|
master-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs other >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - configured remote - full refs' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
refs/heads/branch-in-other
|
|
|
|
refs/heads/master-in-other
|
|
|
|
refs/tags/tag-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur=refs/ &&
|
|
|
|
__git_refs other >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
2017-02-03 05:48:17 +03:00
|
|
|
test_expect_success '__git_refs - configured remote - repo given on the command line' '
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
branch-in-other
|
|
|
|
master-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cd thirdrepo &&
|
|
|
|
__git_dir="$ROOT/.git" &&
|
|
|
|
cur= &&
|
|
|
|
__git_refs other >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
2017-02-03 05:48:17 +03:00
|
|
|
test_expect_success '__git_refs - configured remote - full refs - repo given on the command line' '
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
cat >expected <<-EOF &&
|
|
|
|
refs/heads/branch-in-other
|
|
|
|
refs/heads/master-in-other
|
|
|
|
refs/tags/tag-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cd thirdrepo &&
|
|
|
|
__git_dir="$ROOT/.git" &&
|
|
|
|
cur=refs/ &&
|
|
|
|
__git_refs other >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
2017-02-03 05:48:18 +03:00
|
|
|
test_expect_success '__git_refs - configured remote - remote name matches a directory' '
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
branch-in-other
|
|
|
|
master-in-other
|
|
|
|
EOF
|
|
|
|
mkdir other &&
|
|
|
|
test_when_finished "rm -rf other" &&
|
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs other >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
completion: list short refs from a remote given as a URL
e832f5c09680 (completion: avoid ls-remote in certain scenarios,
2013-05-28) turned a 'git ls-remote <remote>' query into a 'git
for-each-ref refs/remotes/<remote>/' to improve responsiveness of
remote refs completion by avoiding potential network communication.
However, it inadvertently made impossible to complete short refs from
a remote given as a URL, e.g. 'git fetch git://server.com/repo.git
<TAB>', because there is, of course, no such thing as
'refs/remotes/git://server.com/repo.git'.
Since the previous commit we tell apart configured remotes, i.e. those
that can have a hierarchy under 'refs/remotes/', from others that
don't, including remotes given as URL, so we know when we can't use
the faster 'git for-each-ref'-based approach.
Resurrect the old, pre-e832f5c09680 'git ls-remote'-based code for the
latter case to support listing short refs from remotes given as a URL.
The code is slightly updated from the original to
- take into account the path to the repository given on the command
line (if any), and
- omit 'ORIG_HEAD' from the query, as 'git ls-remote' will never
list it anyway.
When the remote given to __git_refs() doesn't exist, then it will be
handled by this resurrected 'git ls-remote' query. This code path
doesn't list 'HEAD' unconditionally, which has the nice side effect of
fixing two more expected test failures.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:20 +03:00
|
|
|
test_expect_success '__git_refs - URL remote' '
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
branch-in-other
|
|
|
|
master-in-other
|
|
|
|
tag-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs "file://$ROOT/otherrepo/.git" >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - URL remote - full refs' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
refs/heads/branch-in-other
|
|
|
|
refs/heads/master-in-other
|
|
|
|
refs/tags/tag-in-other
|
|
|
|
EOF
|
|
|
|
(
|
|
|
|
cur=refs/ &&
|
|
|
|
__git_refs "file://$ROOT/otherrepo/.git" >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
completion: list short refs from a remote given as a URL
e832f5c09680 (completion: avoid ls-remote in certain scenarios,
2013-05-28) turned a 'git ls-remote <remote>' query into a 'git
for-each-ref refs/remotes/<remote>/' to improve responsiveness of
remote refs completion by avoiding potential network communication.
However, it inadvertently made impossible to complete short refs from
a remote given as a URL, e.g. 'git fetch git://server.com/repo.git
<TAB>', because there is, of course, no such thing as
'refs/remotes/git://server.com/repo.git'.
Since the previous commit we tell apart configured remotes, i.e. those
that can have a hierarchy under 'refs/remotes/', from others that
don't, including remotes given as URL, so we know when we can't use
the faster 'git for-each-ref'-based approach.
Resurrect the old, pre-e832f5c09680 'git ls-remote'-based code for the
latter case to support listing short refs from remotes given as a URL.
The code is slightly updated from the original to
- take into account the path to the repository given on the command
line (if any), and
- omit 'ORIG_HEAD' from the query, as 'git ls-remote' will never
list it anyway.
When the remote given to __git_refs() doesn't exist, then it will be
handled by this resurrected 'git ls-remote' query. This code path
doesn't list 'HEAD' unconditionally, which has the nice side effect of
fixing two more expected test failures.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:20 +03:00
|
|
|
test_expect_success '__git_refs - non-existing remote' '
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs non-existing >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - non-existing remote - full refs' '
|
|
|
|
(
|
|
|
|
cur=refs/ &&
|
|
|
|
__git_refs non-existing >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
|
|
|
'
|
|
|
|
|
completion: list short refs from a remote given as a URL
e832f5c09680 (completion: avoid ls-remote in certain scenarios,
2013-05-28) turned a 'git ls-remote <remote>' query into a 'git
for-each-ref refs/remotes/<remote>/' to improve responsiveness of
remote refs completion by avoiding potential network communication.
However, it inadvertently made impossible to complete short refs from
a remote given as a URL, e.g. 'git fetch git://server.com/repo.git
<TAB>', because there is, of course, no such thing as
'refs/remotes/git://server.com/repo.git'.
Since the previous commit we tell apart configured remotes, i.e. those
that can have a hierarchy under 'refs/remotes/', from others that
don't, including remotes given as URL, so we know when we can't use
the faster 'git for-each-ref'-based approach.
Resurrect the old, pre-e832f5c09680 'git ls-remote'-based code for the
latter case to support listing short refs from remotes given as a URL.
The code is slightly updated from the original to
- take into account the path to the repository given on the command
line (if any), and
- omit 'ORIG_HEAD' from the query, as 'git ls-remote' will never
list it anyway.
When the remote given to __git_refs() doesn't exist, then it will be
handled by this resurrected 'git ls-remote' query. This code path
doesn't list 'HEAD' unconditionally, which has the nice side effect of
fixing two more expected test failures.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:20 +03:00
|
|
|
test_expect_success '__git_refs - non-existing URL remote' '
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs "file://$ROOT/non-existing" >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - non-existing URL remote - full refs' '
|
|
|
|
(
|
|
|
|
cur=refs/ &&
|
|
|
|
__git_refs "file://$ROOT/non-existing" >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
|
|
|
'
|
|
|
|
|
2017-02-03 05:48:19 +03:00
|
|
|
test_expect_success '__git_refs - not in a git repository' '
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
(
|
|
|
|
GIT_CEILING_DIRECTORIES="$ROOT" &&
|
|
|
|
export GIT_CEILING_DIRECTORIES &&
|
|
|
|
cd subdir &&
|
|
|
|
cur= &&
|
|
|
|
__git_refs >"$actual"
|
|
|
|
) &&
|
|
|
|
test_must_be_empty "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_refs - unique remote branches for git checkout DWIMery' '
|
|
|
|
cat >expected <<-EOF &&
|
|
|
|
HEAD
|
|
|
|
master
|
|
|
|
matching-branch
|
|
|
|
other/ambiguous
|
|
|
|
other/branch-in-other
|
|
|
|
other/master-in-other
|
|
|
|
remote/ambiguous
|
|
|
|
remote/branch-in-remote
|
|
|
|
matching-tag
|
|
|
|
branch-in-other
|
|
|
|
branch-in-remote
|
|
|
|
master-in-other
|
|
|
|
EOF
|
|
|
|
for remote_ref in refs/remotes/other/ambiguous \
|
|
|
|
refs/remotes/remote/ambiguous \
|
|
|
|
refs/remotes/remote/branch-in-remote
|
|
|
|
do
|
|
|
|
git update-ref $remote_ref master &&
|
|
|
|
test_when_finished "git update-ref -d $remote_ref"
|
|
|
|
done &&
|
|
|
|
(
|
|
|
|
cur= &&
|
|
|
|
__git_refs "" 1 >"$actual"
|
|
|
|
) &&
|
|
|
|
test_cmp expected "$actual"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'teardown after ref completion' '
|
|
|
|
git branch -d matching-branch &&
|
|
|
|
git tag -d matching-tag &&
|
|
|
|
git remote remove other
|
|
|
|
'
|
|
|
|
|
2015-05-10 15:50:18 +03:00
|
|
|
test_expect_success '__git_get_config_variables' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
name-1
|
|
|
|
name-2
|
|
|
|
EOF
|
|
|
|
test_config interesting.name-1 good &&
|
|
|
|
test_config interesting.name-2 good &&
|
|
|
|
test_config subsection.interesting.name-3 bad &&
|
|
|
|
__git_get_config_variables interesting >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2015-05-10 15:50:17 +03:00
|
|
|
test_expect_success '__git_pretty_aliases' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
author
|
|
|
|
hash
|
|
|
|
EOF
|
|
|
|
test_config pretty.author "%an %ae" &&
|
|
|
|
test_config pretty.hash %H &&
|
|
|
|
__git_pretty_aliases >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '__git_aliases' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
ci
|
|
|
|
co
|
|
|
|
EOF
|
|
|
|
test_config alias.ci commit &&
|
|
|
|
test_config alias.co checkout &&
|
|
|
|
__git_aliases >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2012-04-12 01:57:03 +04:00
|
|
|
test_expect_success 'basic' '
|
2013-04-10 10:57:51 +04:00
|
|
|
run_completion "git " &&
|
2012-04-12 01:57:03 +04:00
|
|
|
# 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' '
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git --" <<-\EOF
|
2012-04-12 01:57:03 +04:00
|
|
|
--paginate Z
|
|
|
|
--no-pager Z
|
|
|
|
--git-dir=
|
|
|
|
--bare Z
|
|
|
|
--version Z
|
|
|
|
--exec-path Z
|
2012-04-15 23:44:19 +04:00
|
|
|
--exec-path=
|
2012-04-12 01:57:03 +04:00
|
|
|
--html-path Z
|
2013-06-22 15:25:18 +04:00
|
|
|
--man-path Z
|
2012-04-15 23:44:18 +04:00
|
|
|
--info-path Z
|
2012-04-12 01:57:03 +04:00
|
|
|
--work-tree=
|
|
|
|
--namespace=
|
2012-04-15 23:44:18 +04:00
|
|
|
--no-replace-objects Z
|
2012-04-12 01:57:03 +04:00
|
|
|
--help Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'double dash "git checkout"' '
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git checkout --" <<-\EOF
|
2012-04-12 01:57:03 +04:00
|
|
|
--quiet Z
|
|
|
|
--ours Z
|
|
|
|
--theirs Z
|
|
|
|
--track Z
|
|
|
|
--no-track Z
|
|
|
|
--merge Z
|
|
|
|
--conflict=
|
|
|
|
--orphan Z
|
|
|
|
--patch Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2012-04-15 23:44:18 +04:00
|
|
|
test_expect_success 'general options' '
|
|
|
|
test_completion "git --ver" "--version " &&
|
|
|
|
test_completion "git --hel" "--help " &&
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git --exe" <<-\EOF &&
|
2012-04-15 23:44:19 +04:00
|
|
|
--exec-path Z
|
|
|
|
--exec-path=
|
|
|
|
EOF
|
2012-04-15 23:44:18 +04:00
|
|
|
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 "
|
|
|
|
'
|
completion: fix completion after 'git --option <TAB>'
The bash completion doesn't work when certain options to git itself are
specified, e.g. 'git --no-pager <TAB>' errors out with
error: invalid key: alias.--no-pager
The main _git() completion function finds out the git command name by
looping through all the words on the command line and searching for
the first word that is not a known option for the git command.
Unfortunately the list of known git options was not updated in a long
time, and newer options are not skipped but mistaken for a git command.
Such a misrecognized "command" is then passed to __git_aliased_command(),
which in turn passes it to a 'git config' query, hence the error.
Currently the following options are misrecognized for a git command:
-c --no-pager --exec-path --html-path --man-path --info-path
--no-replace-objects --work-tree= --namespace=
To fix this we could just update the list of options to be skipped,
but the same issue will likely arise, if the git command learns a new
option in the future. Therefore, to make it more future proof against
new options, this patch changes that loop to skip all option-looking
words, i.e. words starting with a dash.
We also have to handle the '-c' option specially, because it takes a
configutation parameter in a separate word, which must be skipped,
too.
[fc: added tests]
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-15 23:44:20 +04:00
|
|
|
|
|
|
|
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 --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 " &&
|
completion: fix completion after 'git -C <path>'
The main completion function finds the name of the git command by
iterating through all the words on the command line in search for the
first non-option-looking word. As it is not aware of 'git -C's
mandatory path argument, if the '-C <path>' option is present, 'path'
will be the first such word and it will be mistaken for a git command.
This breaks completion in various ways:
- If 'path' happens to match one of the commands supported by the
completion script, then options of that command will be offered.
- If 'path' doesn't match a supported command and doesn't contain any
characters not allowed in Bash identifier names, then the
completion script does basically nothing and Bash in turn falls
back to filename completion for all subsequent words.
- Otherwise, if 'path' does contain such an unallowed character, then
it leads to a more or less ugly error message in the middle of the
command line. The standard '/' directory separator is such a
character, and it happens to trigger one of the uglier errors:
$ git -C some/path <TAB>sh.exe": declare: `_git_some/path': not a valid identifier
error: invalid key: alias.some/path
Fix this by skipping 'git -C's mandatory path argument while iterating
over the words on the command line. Extend the relevant test with
this case and, while at it, with cases that needed similar treatment
in the past ('--git-dir', '-c', '--work-tree' and '--namespace').
Additionally, silence the standard error of the 'declare' builtins
looking for the completion function associated with the git command
and of the 'git config' query for the aliased command. So if git ever
learns a new option with a mandatory argument in the future, then,
though the completion script will again misbehave, at least the
command line will not be utterly disrupted by those error messages.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:22 +03:00
|
|
|
test_completion "git --no-replace-objects check" "checkout " &&
|
|
|
|
test_completion "git --git-dir some/path check" "checkout " &&
|
|
|
|
test_completion "git -c conf.var=value check" "checkout " &&
|
|
|
|
test_completion "git -C some/path check" "checkout " &&
|
|
|
|
test_completion "git --work-tree some/path check" "checkout " &&
|
|
|
|
test_completion "git --namespace name/space check" "checkout "
|
completion: fix completion after 'git --option <TAB>'
The bash completion doesn't work when certain options to git itself are
specified, e.g. 'git --no-pager <TAB>' errors out with
error: invalid key: alias.--no-pager
The main _git() completion function finds out the git command name by
looping through all the words on the command line and searching for
the first word that is not a known option for the git command.
Unfortunately the list of known git options was not updated in a long
time, and newer options are not skipped but mistaken for a git command.
Such a misrecognized "command" is then passed to __git_aliased_command(),
which in turn passes it to a 'git config' query, hence the error.
Currently the following options are misrecognized for a git command:
-c --no-pager --exec-path --html-path --man-path --info-path
--no-replace-objects --work-tree= --namespace=
To fix this we could just update the list of options to be skipped,
but the same issue will likely arise, if the git command learns a new
option in the future. Therefore, to make it more future proof against
new options, this patch changes that loop to skip all option-looking
words, i.e. words starting with a dash.
We also have to handle the '-c' option specially, because it takes a
configutation parameter in a separate word, which must be skipped,
too.
[fc: added tests]
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-15 23:44:20 +04:00
|
|
|
'
|
|
|
|
|
2013-01-25 03:08:37 +04:00
|
|
|
test_expect_success 'git --help completion' '
|
|
|
|
test_completion "git --help ad" "add " &&
|
|
|
|
test_completion "git --help core" "core-tutorial "
|
|
|
|
'
|
|
|
|
|
completion tests: add tests for the __git_refs() helper function
Check how __git_refs() lists refs in different scenarios, i.e.
- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.
Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:
- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:14 +03:00
|
|
|
test_expect_success 'setup for integration tests' '
|
2012-09-27 01:47:51 +04:00
|
|
|
echo content >file1 &&
|
|
|
|
echo more >file2 &&
|
2017-02-03 05:48:10 +03:00
|
|
|
git add file1 file2 &&
|
2012-09-27 01:47:51 +04:00
|
|
|
git commit -m one &&
|
|
|
|
git branch mybranch &&
|
|
|
|
git tag mytag
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'checkout completes ref names' '
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git checkout m" <<-\EOF
|
2012-11-11 18:35:54 +04:00
|
|
|
master Z
|
|
|
|
mybranch Z
|
|
|
|
mytag Z
|
2012-09-27 01:47:51 +04:00
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
completion: respect 'git -C <path>'
'git -C <path>' option(s) on the command line should be taken into
account during completion, because
- like '--git-dir=<path>', it can lead us to a different repository,
- a few git commands executed in the completion script do care about
in which directory they are executed, and
- the command for which we are providing completion might care about
in which directory it will be executed.
However, unlike '--git-dir=<path>', the '-C <path>' option can be
specified multiple times and their effect is cumulative, so we can't
just store a single '<path>' in a variable. Nor can we simply
concatenate a path from '-C <path1> -C <path2> ...', because e.g. (in
an arguably pathological corner case) a relative path might be
followed by an absolute path.
Instead, store all '-C <path>' options word by word in the
$__git_C_args array in the main git completion function, and pass this
array, if present, to 'git rev-parse --absolute-git-dir' when
discovering the repository in __gitdir(), and let it take care of
multiple options, relative paths, absolute paths and everything.
Also pass all '-C <path> options via the $__git_C_args array to those
git executions which require a worktree and for which it matters from
which directory they are executed from. There are only three such
cases:
- 'git diff-index' and 'git ls-files' in __git_ls_files_helper()
used for git-aware filename completion, and
- the 'git ls-tree' used for completing the 'ref:path' notation.
The other git commands executed in the completion script don't need
these '-C <path>' options, because __gitdir() already took those
options into account. It would not hurt them, either, but let's not
induce unnecessary code churn.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-03 05:48:24 +03:00
|
|
|
test_expect_success 'git -C <path> checkout uses the right repo' '
|
|
|
|
test_completion "git -C subdir -C subsubdir -C .. -C ../otherrepo checkout b" <<-\EOF
|
|
|
|
branch-in-other Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2012-09-27 01:47:51 +04:00
|
|
|
test_expect_success 'show completes all refs' '
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git show m" <<-\EOF
|
2012-11-11 18:35:54 +04:00
|
|
|
master Z
|
|
|
|
mybranch Z
|
|
|
|
mytag Z
|
2012-09-27 01:47:51 +04:00
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '<ref>: completes paths' '
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git show mytag:f" <<-\EOF
|
2012-11-11 18:35:54 +04:00
|
|
|
file1 Z
|
|
|
|
file2 Z
|
2012-09-27 01:47:51 +04:00
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2012-09-27 01:51:06 +04:00
|
|
|
test_expect_success 'complete tree filename with spaces' '
|
|
|
|
echo content >"name with spaces" &&
|
2017-02-03 05:48:10 +03:00
|
|
|
git add "name with spaces" &&
|
2012-09-27 01:51:06 +04:00
|
|
|
git commit -m spaces &&
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git show HEAD:nam" <<-\EOF
|
2012-11-11 18:35:54 +04:00
|
|
|
name with spaces Z
|
2012-09-27 01:51:06 +04:00
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2013-04-10 10:57:55 +04:00
|
|
|
test_expect_success 'complete tree filename with metacharacters' '
|
2012-09-27 01:51:06 +04:00
|
|
|
echo content >"name with \${meta}" &&
|
2017-02-03 05:48:10 +03:00
|
|
|
git add "name with \${meta}" &&
|
2012-09-27 01:51:06 +04:00
|
|
|
git commit -m meta &&
|
2012-11-11 18:35:56 +04:00
|
|
|
test_completion "git show HEAD:nam" <<-\EOF
|
2012-11-11 18:35:54 +04:00
|
|
|
name with ${meta} Z
|
|
|
|
name with spaces Z
|
2012-09-27 01:51:06 +04:00
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2012-10-16 04:21:50 +04:00
|
|
|
test_expect_success 'send-email' '
|
|
|
|
test_completion "git send-email --cov" "--cover-letter " &&
|
|
|
|
test_completion "git send-email ma" "master "
|
|
|
|
'
|
|
|
|
|
2013-04-28 00:09:59 +04:00
|
|
|
test_expect_success 'complete files' '
|
|
|
|
git init tmp && cd tmp &&
|
|
|
|
test_when_finished "cd .. && rm -rf tmp" &&
|
|
|
|
|
|
|
|
echo "expected" > .gitignore &&
|
|
|
|
echo "out" >> .gitignore &&
|
|
|
|
|
|
|
|
git add .gitignore &&
|
|
|
|
test_completion "git commit " ".gitignore" &&
|
|
|
|
|
|
|
|
git commit -m ignore &&
|
|
|
|
|
|
|
|
touch new &&
|
|
|
|
test_completion "git add " "new" &&
|
|
|
|
|
|
|
|
git add new &&
|
|
|
|
git commit -a -m new &&
|
|
|
|
test_completion "git add " "" &&
|
|
|
|
|
|
|
|
git mv new modified &&
|
|
|
|
echo modify > modified &&
|
|
|
|
test_completion "git add " "modified" &&
|
|
|
|
|
|
|
|
touch untracked &&
|
|
|
|
|
|
|
|
: TODO .gitignore should not be here &&
|
|
|
|
test_completion "git rm " <<-\EOF &&
|
|
|
|
.gitignore
|
|
|
|
modified
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_completion "git clean " "untracked" &&
|
|
|
|
|
|
|
|
: TODO .gitignore should not be here &&
|
|
|
|
test_completion "git mv " <<-\EOF &&
|
|
|
|
.gitignore
|
|
|
|
modified
|
|
|
|
EOF
|
|
|
|
|
|
|
|
mkdir dir &&
|
|
|
|
touch dir/file-in-dir &&
|
|
|
|
git add dir/file-in-dir &&
|
|
|
|
git commit -m dir &&
|
|
|
|
|
|
|
|
mkdir untracked-dir &&
|
|
|
|
|
|
|
|
: TODO .gitignore should not be here &&
|
|
|
|
test_completion "git mv modified " <<-\EOF &&
|
|
|
|
.gitignore
|
|
|
|
dir
|
|
|
|
modified
|
|
|
|
untracked
|
|
|
|
untracked-dir
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_completion "git commit " "modified" &&
|
|
|
|
|
|
|
|
: TODO .gitignore should not be here &&
|
2015-03-20 13:06:15 +03:00
|
|
|
test_completion "git ls-files " <<-\EOF &&
|
2013-04-28 00:09:59 +04:00
|
|
|
.gitignore
|
|
|
|
dir
|
|
|
|
modified
|
|
|
|
EOF
|
|
|
|
|
|
|
|
touch momified &&
|
|
|
|
test_completion "git add mom" "momified"
|
|
|
|
'
|
|
|
|
|
2014-06-12 22:49:29 +04:00
|
|
|
test_expect_success "completion uses <cmd> completion for alias: !sh -c 'git <cmd> ...'" '
|
|
|
|
test_config alias.co "!sh -c '"'"'git checkout ...'"'"'" &&
|
|
|
|
test_completion "git co m" <<-\EOF
|
|
|
|
master Z
|
|
|
|
mybranch Z
|
|
|
|
mytag Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'completion uses <cmd> completion for alias: !f () { VAR=val git <cmd> ... }' '
|
|
|
|
test_config alias.co "!f () { VAR=val git checkout ... ; } f" &&
|
|
|
|
test_completion "git co m" <<-\EOF
|
|
|
|
master Z
|
|
|
|
mybranch Z
|
|
|
|
mytag Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'completion used <cmd> completion for alias: !f() { : git <cmd> ; ... }' '
|
|
|
|
test_config alias.co "!f() { : git checkout ; if ... } f" &&
|
|
|
|
test_completion "git co m" <<-\EOF
|
|
|
|
master Z
|
|
|
|
mybranch Z
|
|
|
|
mytag Z
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
2013-04-28 00:10:00 +04:00
|
|
|
test_expect_failure 'complete with tilde expansion' '
|
|
|
|
git init tmp && cd tmp &&
|
|
|
|
test_when_finished "cd .. && rm -rf tmp" &&
|
|
|
|
|
|
|
|
touch ~/tmp/file &&
|
|
|
|
|
|
|
|
test_completion "git add ~/tmp/" "~/tmp/file"
|
|
|
|
'
|
|
|
|
|
2012-04-12 01:57:03 +04:00
|
|
|
test_done
|