mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-12 08:33:45 +08:00
8bf8b10f68
See the changelog additions for user-visible changes. Since we enable/disable terminal protocols whenever we pass terminal ownership, tests can no longer run in parallel on the same terminal. For the same reason, readline shortcuts in the gdb REPL will not work anymore. As a remedy, use gdbserver, or lobby for CSI u support in libreadline. Add sleep to some tests, otherwise they fall (both in CI and locally). There are two weird failures on FreeBSD remaining, disable them for now https://github.com/fish-shell/fish-shell/pull/10359/checks?check_run_id=23330096362 Design and implementation borrows heavily from Kakoune. In future, we should try to implement more of the kitty progressive enhancements. Closes #10359
134 lines
5.1 KiB
Fish
134 lines
5.1 KiB
Fish
# RUN: %fish %s | %filter-ctrlseqs
|
|
# $XDG_DATA_HOME can itself be a relative path. So force it to an absolute
|
|
# path so we can remove it from any resolved paths below. This is needed
|
|
# because the contents of the builtin realpath.out file can't include any $PWD
|
|
# data since $PWD isn't under our control.
|
|
set -l data_home_realpath (builtin realpath $XDG_DATA_HOME)
|
|
|
|
# A bogus absolute path is handled correctly and sets a failure status.
|
|
if not builtin realpath /this/better/be/an/invalid/path
|
|
echo first invalid path handled okay
|
|
# CHECK: first invalid path handled okay
|
|
# CHECKERR: builtin realpath: /this/better/be/an/invalid/path: No such file or directory
|
|
end
|
|
|
|
# A non-existent file relative to $PWD succeeds.
|
|
set -l real_path (builtin realpath nonexistent-file)
|
|
if test "$real_path" = (realpath $PWD)"/nonexistent-file"
|
|
echo nonexistent-file in PWD correctly converted
|
|
# CHECK: nonexistent-file in PWD correctly converted
|
|
end
|
|
|
|
# The simplest absolute path should undergo no transformation.
|
|
builtin realpath /
|
|
# CHECK: /
|
|
|
|
# The second simplest absolute path should undergo no transformation.
|
|
builtin realpath /this-better-not-exist
|
|
# CHECK: /this-better-not-exist
|
|
|
|
# Check that a pathological case is handled correctly (i.e., there is only one
|
|
# leading slash).
|
|
builtin realpath /../../x
|
|
# CHECK: /x
|
|
|
|
# Another pathological corner case. GNU realpath first strips trailing slashes
|
|
# so that "/a//" is converted to "/a" before performing the real path
|
|
# conversion. So, despite appearances, it considers "a" to be the last
|
|
# component in that case.
|
|
builtin realpath /abc/
|
|
# CHECK: /abc
|
|
builtin realpath /def///
|
|
# CHECK: /def
|
|
|
|
# Verify `realpath .` when cwd is a deleted directory gives a no such file or dir error.
|
|
set -l tmpdir (mktemp -d)
|
|
pushd $tmpdir
|
|
# Solaris rmdir tries to protect against deleting $PWD.
|
|
# But that's what we want to test, so we weasel around it.
|
|
sh -c "cd ..; rmdir $tmpdir"
|
|
builtin realpath .
|
|
# CHECKERR: builtin realpath: .: No such file or directory
|
|
popd
|
|
|
|
# A single symlink to a directory is correctly resolved.
|
|
ln -fs fish $XDG_DATA_HOME/fish-symlink
|
|
set -l real_path (builtin realpath $XDG_DATA_HOME/fish-symlink)
|
|
set -l expected_real_path "$data_home_realpath/fish"
|
|
if test "$real_path" = "$expected_real_path"
|
|
echo "fish-symlink handled correctly"
|
|
# CHECK: fish-symlink handled correctly
|
|
else
|
|
echo "fish-symlink not handled correctly: $real_path != $expected_real_path" >&2
|
|
end
|
|
|
|
# With "-s" the symlink is not resolved.
|
|
set -l real_path (builtin realpath -s $data_home_realpath/fish-symlink)
|
|
set -l expected_real_path "$data_home_realpath/fish-symlink"
|
|
if test "$real_path" = "$expected_real_path"
|
|
echo "fish-symlink handled correctly"
|
|
# CHECK: fish-symlink handled correctly
|
|
else
|
|
echo "fish-symlink not handled correctly: $real_path != $expected_real_path" >&2
|
|
end
|
|
|
|
# But the $PWD is still resolved
|
|
set -l oldpwd $PWD
|
|
cd $XDG_DATA_HOME/fish-symlink
|
|
set -l real_path (builtin realpath -s $data_home_realpath/fish-symlink)
|
|
set -l expected_real_path "$data_home_realpath/fish-symlink"
|
|
if test "$real_path" = "$expected_real_path"
|
|
echo "fish-symlink handled correctly"
|
|
# CHECK: fish-symlink handled correctly
|
|
else
|
|
echo "fish-symlink not handled correctly: $real_path != $expected_real_path" >&2
|
|
end
|
|
cd $oldpwd
|
|
|
|
set -l real_path (builtin realpath -s .)
|
|
set -l expected_real_path (pwd -P) # Physical working directory.
|
|
if test "$real_path" = "$expected_real_path"
|
|
echo "relative path correctly handled"
|
|
# CHECK: relative path correctly handled
|
|
else
|
|
echo "relative path not handled correctly: $real_path != $expected_real_path" >&2
|
|
end
|
|
|
|
test (builtin realpath -s /usr/bin/../) = /usr
|
|
or echo builtin realpath -s does not resolve .. or resolves symlink wrong
|
|
|
|
# A nonexistent file relative to a valid symlink to a directory gets converted.
|
|
# This depends on the symlink created by the previous test.
|
|
set -l real_path (builtin realpath $XDG_DATA_HOME/fish-symlink/nonexistent-file-relative-to-a-symlink)
|
|
set -l expected_real_path "$data_home_realpath/fish/nonexistent-file-relative-to-a-symlink"
|
|
if test "$real_path" = "$expected_real_path"
|
|
echo "fish-symlink/nonexistent-file-relative-to-a-symlink correctly converted"
|
|
# CHECK: fish-symlink/nonexistent-file-relative-to-a-symlink correctly converted
|
|
else
|
|
echo "failure nonexistent-file-relative-to-a-symlink: $real_path != $expected_real_path" >&2
|
|
end
|
|
|
|
# We remove leading slashes even with "-s".
|
|
# This is how GNU realpath -s behaves, and also e.g.
|
|
# how bash normalizes its $PWD.
|
|
builtin realpath -s ///bin
|
|
# CHECK: /bin
|
|
|
|
builtin realpath -s //bin
|
|
# CHECK: /bin
|
|
|
|
# A path with two symlinks, first to a directory, second to a file, is correctly resolved.
|
|
ln -fs fish $XDG_DATA_HOME/fish-symlink2
|
|
touch $XDG_DATA_HOME/fish/real_file
|
|
ln -fs real_file $XDG_DATA_HOME/fish/symlink_file
|
|
set -l real_path (builtin realpath $XDG_DATA_HOME/fish-symlink/symlink_file)
|
|
set -l expected_real_path "$data_home_realpath/fish/real_file"
|
|
if test "$real_path" = "$expected_real_path"
|
|
echo "fish-symlink/symlink_file handled correctly"
|
|
# CHECK: fish-symlink/symlink_file handled correctly
|
|
else
|
|
echo "fish-symlink/symlink_file not handled correctly: $real_path != expected_real_path" >&2
|
|
end
|
|
|
|
exit 0
|