# $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