mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-25 12:23:09 +00:00
14c7cfa84b
Someone running fish in an unusual locale reported that an `assert()` was firing when they typed `pkill c`. I traced it to two bugs. First, the __fish_make_completion_signals command was producing a weird result. Second, the builtin `complete` command wasn't adequately verifying its arguments. Fixes #3129
115 lines
3.5 KiB
Fish
115 lines
3.5 KiB
Fish
# vim: set filetype=fish:
|
|
|
|
# Regression test for issue #3129. In previous versions these statements would
|
|
# cause an `assert()` to fire thus killing the shell.
|
|
complete -c pkill -o ''
|
|
complete -c pkill -d ''
|
|
complete -c pkill -l ''
|
|
complete -c pkill -s ''
|
|
|
|
# Test that conditions that add or remove completions don't deadlock, etc.
|
|
# We actually encountered some case that was effectively like this (Issue 2 in github)
|
|
|
|
complete --command AAAA -l abcd --condition 'complete -c AAAA -l efgh'
|
|
echo "AAAA:"
|
|
complete -C'AAAA -' | sort
|
|
echo "AAAA:"
|
|
complete -C'AAAA -' | sort
|
|
|
|
complete --command BBBB -l abcd --condition 'complete -e --command BBBB -l abcd'
|
|
echo "BBBB:"
|
|
complete -C'BBBB -'
|
|
echo "BBBB:"
|
|
complete -C'BBBB -'
|
|
|
|
# Test that erasing completions works correctly
|
|
echo
|
|
|
|
function sort
|
|
# GNU sort is really stupid, a non-C locale seems to make it assume --dictionary-order
|
|
# If I wanted --dictionary-order, I would have specified --dictionary-order!
|
|
env LC_ALL=C sort $argv
|
|
end
|
|
|
|
complete -c CCCC -l bar
|
|
complete -c CCCC -l baz
|
|
complete -c CCCC -o bar
|
|
complete -c CCCC -o foo
|
|
complete -c CCCC -s a
|
|
complete -c CCCC -s b
|
|
echo "CCCC:"
|
|
complete -C'CCCC -' | sort
|
|
complete -c CCCC -l bar -e
|
|
echo "CCCC:"
|
|
complete -C'CCCC -' | sort
|
|
complete -c CCCC -o foo -e
|
|
echo "CCCC:"
|
|
complete -C'CCCC -' | sort
|
|
complete -c CCCC -s a -e
|
|
echo "CCCC:"
|
|
complete -C'CCCC -' | sort
|
|
complete -c CCCC -e
|
|
echo "CCCC:"
|
|
complete -C'CCCC -' | sort
|
|
|
|
# Test that directory completions work correctly
|
|
if begin; rm -rf test6.tmp.dir; and mkdir test6.tmp.dir; end
|
|
pushd test6.tmp.dir
|
|
set -l dir (mktemp -d XXXXXXXX)
|
|
if complete -C$dir | grep "^$dir/.*Directory" >/dev/null
|
|
echo "implicit cd complete works"
|
|
else
|
|
echo "no implicit cd complete"
|
|
end
|
|
if complete -C"command $dir" | grep "^$dir/.*Directory" >/dev/null
|
|
echo "implicit cd complete incorrect after 'command'"
|
|
else
|
|
echo "no implicit cd complete after 'command'"
|
|
end
|
|
popd
|
|
if begin
|
|
set -l PATH $PWD/test6.tmp.dir $PATH ^/dev/null
|
|
complete -C$dir | grep "^$dir/.*Directory" >/dev/null
|
|
end
|
|
echo "incorrect implicit cd from PATH"
|
|
else
|
|
echo "PATH does not cause incorrect implicit cd"
|
|
end
|
|
rm -rf test6.tmp.dir
|
|
else
|
|
echo "error: could not create temp environment" >&2
|
|
end
|
|
|
|
# Test command expansion with parened PATHs (#952)
|
|
begin
|
|
set -l parened_path $PWD/'test6.tmp2.(paren).dir'
|
|
set -l parened_subpath $parened_path/subdir
|
|
if not begin
|
|
rm -rf $parened_path
|
|
and mkdir $parened_path
|
|
and mkdir $parened_subpath
|
|
and ln -s /bin/ls $parened_path/'__test6_(paren)_command'
|
|
and ln -s /bin/ls $parened_subpath/'__test6_subdir_(paren)_command'
|
|
end
|
|
echo "error: could not create command expansion temp environment" >&2
|
|
end
|
|
|
|
# Verify that we can expand commands when PATH has parens
|
|
set -l PATH $parened_path $PATH
|
|
set -l completed (complete -C__test6_ | cut -f 1 -d \t)
|
|
if test "$completed" = '__test6_(paren)_command'
|
|
echo "Command completion with parened PATHs test passed"
|
|
else
|
|
echo "Command completion with parened PATHs test failed. Expected __test6_(paren)_command, got $completed" >&2
|
|
end
|
|
|
|
# Verify that commands with intermediate slashes do NOT expand with respect to PATH
|
|
set -l completed (complete -Csubdir/__test6_subdir)
|
|
if test -z "$completed"
|
|
echo "Command completion with intermediate slashes passed"
|
|
else
|
|
echo "Command completion with intermediate slashes: should output nothing, instead got $completed" >&2
|
|
end
|
|
|
|
rm -rf $parened_path
|
|
end
|