mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-19 05:13:44 +08:00
1ee57e9244
Illumos/OpenIndiana/SunOS/Solaris has an rm/rmdir that tries to protect the user by not allowing them to delete $PWD. Normally, this would be a good thing as deleting $PWD is a stupid thing to do. Except in this case, we absolutely need to do that. So instead we weasel around it by invoking an sh to cd out of the directory to then invoke an `rmdir` to delete it. That should throw off any attempts at protection (we could also have tried $PWD/. or similar, but that's possibly still protected against). This is the last failing test on Illumos/OpenIndiana/SunOS/Solaris/afunnyquip, so: Fixes #5472.
86 lines
3.4 KiB
Fish
86 lines
3.4 KiB
Fish
# $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
|
|
end
|
|
|
|
# A non-existent file relative to $PWD succeeds.
|
|
set -l real_path (builtin realpath nonexistent-file)
|
|
if test "$real_path" = "$PWD/nonexistent-file"
|
|
echo nonexistent-file in PWD correctly converted
|
|
end
|
|
|
|
# The simplest absolute path should undergo no transformation.
|
|
builtin realpath /
|
|
|
|
# The second simplest absolute path should undergo no transformation.
|
|
builtin realpath /this-better-not-exist
|
|
|
|
# Check that a pathological case is handled correctly (i.e., there is only one
|
|
# leading slash).
|
|
builtin realpath /../../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/
|
|
builtin realpath /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 .
|
|
popd
|
|
|
|
# A single symlink to a directory is correctly resolved.
|
|
ln -s 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"
|
|
else
|
|
echo "fish-symlink not handled correctly: $real_path != $expected_real_path" >&2
|
|
end
|
|
|
|
# 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"
|
|
else
|
|
echo "failure nonexistent-file-relative-to-a-symlink: $real_path != $expected_real_path" >&2
|
|
end
|
|
|
|
# A path with two symlinks, first to a directory, second to a file, is correctly resolved.
|
|
ln -s fish $XDG_DATA_HOME/fish-symlink2
|
|
touch $XDG_DATA_HOME/fish/real_file
|
|
ln -s 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"
|
|
else
|
|
echo "fish-symlink/symlink_file not handled correctly: $real_path != expected_real_path" >&2
|
|
end
|
|
|
|
# The $PWD should undergo no further transformations because it should already
|
|
# be a "realpath".
|
|
set -l real_path (builtin realpath $PWD)
|
|
if test "$real_path" = "$PWD"
|
|
echo "pwd-resolved-to-itself"
|
|
else
|
|
echo "unexpected pwd-resolved-to-itself failure: $real_path != $PWD" >&2
|
|
end
|
|
|
|
exit 0
|