2019-12-31 14:16:20 -08:00
# RUN: %fish -C 'set -g fish %fish' %s
set -g fish ( realpath $fish )
# Store pwd to later go back before cleaning up
set -l oldpwd ( pwd )
2019-10-17 21:15:43 +02:00
set -l tmp ( mktemp -d )
cd $tmp
# resolve CDPATH (issue 6220)
begin
mkdir -p x
# CHECK: /{{.*}}/x
2019-12-31 14:16:20 -08:00
cd x
pwd
2019-10-17 21:15:43 +02:00
# CHECK: /{{.*}}/x
2019-12-31 14:16:20 -08:00
set -lx CDPATH ..
cd x
pwd
2019-10-17 21:15:43 +02:00
end
2019-12-31 14:16:20 -08:00
cd $oldpwd
2020-01-30 17:34:48 +01:00
rm -rf $tmp
2019-12-31 14:16:20 -08:00
# Create a test directory to store our stuff.
2020-01-25 12:59:18 -08:00
# macOS likes to return symlinks from (mktemp -d), make sure it does not.
set -l base ( realpath ( mktemp -d ) )
set real ( realpath ( mktemp -d ) )
2019-12-31 14:16:20 -08:00
set link $base /link
ln -s $real $link
cd $link
prevd
nextd
test " $PWD " = " $link " || echo "\$PWD != \$link:" \n " \$PWD: $PWD " \n " \$link: $link " \n
test ( pwd ) = " $link " || echo "(pwd) != \$link:" \n "\$PWD: " ( pwd ) \n " \$link: $link " \n
test ( pwd -P ) = " $real " || echo "(pwd -P) != \$real:" \n " \$PWD: $PWD " \n " \$real: $real " \n
test ( pwd -P -L ) = " $link " || echo "(pwd -P -L) != \$link:" \n " \$PWD: $PWD " \n " \$link: $link " \n
# Expect no output on success.
# Create a symlink and verify logical completion.
# create directory $base/through/the/looking/glass
# symlink $base/somewhere/teleport -> $base/through/the/looking/glass
# verify that .. completions work
cd $base
mkdir -p $base /through/the/looking/glass
mkdir -p $base /somewhere
mkdir $base /somewhere/a1
mkdir $base /somewhere/a2
mkdir $base /somewhere/a3
touch $base /through/the/looking/b( seq 1 3 )
mkdir $base /through/the/looking/d1
mkdir $base /through/the/looking/d2
mkdir $base /through/the/looking/d3
ln -s $base /through/the/looking/glass $base /somewhere/rabbithole
cd $base /somewhere/rabbithole
echo "ls:"
complete -C 'ls ../'
#CHECK: ls:
#CHECK: ../b1
#CHECK: ../b2
#CHECK: ../b3
#CHECK: ../d1/
#CHECK: ../d2/
#CHECK: ../d3/
#CHECK: ../glass/
echo "cd:"
complete -C 'cd ../'
#CHECK: cd:
#CHECK: ../a1/
#CHECK: ../a2/
#CHECK: ../a3/
#CHECK: ../rabbithole/
# PWD should be imported and respected by fish
cd $oldpwd
mkdir -p $base /realhome
ln -s $base /realhome $base /linkhome
cd $base /linkhome
set -l real_getcwd ( pwd -P )
env HOME = $base /linkhome $fish -c 'echo PWD is $PWD'
2020-01-25 12:59:18 -08:00
#CHECK: PWD is {{.*}}/linkhome
2019-12-31 14:16:20 -08:00
# Do not inherit a virtual PWD that fails to resolve to getcwd (#5647)
env HOME = $base /linkhome PWD = /tmp $fish -c 'echo $PWD' | read output_pwd
test ( realpath $output_pwd ) = $real_getcwd
and echo "BogusPWD test 1 succeeded"
or echo " BogusPWD test 1 failed: $output_pwd vs $real_getcwd "
#CHECK: BogusPWD test 1 succeeded
env HOME = $base /linkhome PWD = /path/to/nowhere $fish -c 'echo $PWD' | read output_pwd
test ( realpath $output_pwd ) = $real_getcwd
and echo "BogusPWD test 2 succeeded"
or echo " BogusPWD test 2 failed: $output_pwd vs $real_getcwd "
#CHECK: BogusPWD test 2 succeeded
# $CDPATH
set -g CDPATH $base
cd linkhome
test $PWD = $base /linkhome; and echo Gone to linkhome via CDPATH
#CHECK: Gone to linkhome via CDPATH
set -g CDPATH /tmp
cd $base
test $PWD = $base ; and echo Gone to base
#CHECK: Gone to base
cd linkhome
test $PWD = $base /linkhome; and echo Gone to linkhome via implicit . in CDPATH
#CHECK: Gone to linkhome via implicit . in CDPATH
set -g CDPATH ./
cd $base
test $PWD = $base ; and echo No crash with ./ CDPATH
#CHECK: No crash with ./ CDPATH
# test for directories beginning with a hyphen
mkdir $base /-testdir
cd $base
cd -- -testdir
test $PWD = $base /-testdir
echo $status
#CHECK: 0
2020-12-28 22:40:30 +01:00
# test a few error cases - nonexistent directory
set -l old_cdpath $CDPATH
set -l old_path $PWD
cd nonexistent
#CHECKERR: cd: The directory 'nonexistent' does not exist
#CHECKERR: {{.*}}/cd.fish (line {{\d+}}):
#CHECKERR: builtin cd $argv
#CHECKERR: ^
#CHECKERR: in function 'cd' with arguments 'nonexistent'
#CHECKERR: called on line {{\d+}} of file {{.*}}/cd.fish
touch file
cd file
#CHECKERR: cd: 'file' is not a directory
#CHECKERR: {{.*}}/cd.fish (line {{\d+}}):
#CHECKERR: builtin cd $argv
#CHECKERR: ^
#CHECKERR: in function 'cd' with arguments 'file'
#CHECKERR: called on line {{\d+}} of file {{.*}}/cd.fish
# a directory that isn't executable
mkdir bad-perms
chmod -x bad-perms
cd bad-perms
#CHECKERR: cd: Permission denied: 'bad-perms'
#CHECKERR: {{.*}}/cd.fish (line {{\d+}}):
#CHECKERR: builtin cd $argv
#CHECKERR: ^
#CHECKERR: in function 'cd' with arguments 'bad-perms'
#CHECKERR: called on line {{\d+}} of file {{.*}}/cd.fish
cd $old_path
mkdir -p cdpath-dir/bad-perms
mkdir -p cdpath-dir/nonexistent
mkdir -p cdpath-dir/file
set CDPATH $PWD /cdpath-dir $old_cdpath
2021-07-23 17:21:12 +02:00
# See that the completions also check the current directory
complete -C 'cd ' | string match -q cdpath-dir/
and echo cdpath-dir is in
# CHECK: cdpath-dir is in
2020-12-28 22:40:30 +01:00
# A different directory with the same name that is first in $CDPATH works.
cd bad-perms
cd $old_path
cd nonexistent
cd $old_path
cd file
cd $old_path
# Even if the good dirs are later in $CDPATH most errors still aren't a problem
# - they just cause us to keep looking.
cd $old_path
set CDPATH $old_cdpath $PWD /cdpath-dir
cd nonexistent
cd $old_path
cd bad-perms
# Permission errors are still a problem!
#CHECKERR: cd: Permission denied: 'bad-perms'
#CHECKERR: {{.*}}/cd.fish (line {{\d+}}):
#CHECKERR: builtin cd $argv
#CHECKERR: ^
#CHECKERR: in function 'cd' with arguments 'bad-perms'
#CHECKERR: called on line {{\d+}} of file {{.*}}/cd.fish
cd $old_path
cd file
cd $old_path
2019-12-31 14:16:20 -08:00
# cd back before removing the test directory again.
cd $oldpwd
rm -Rf $base
2020-12-28 22:40:30 +01:00
set -g CDPATH ./
2019-12-31 14:16:20 -08:00
# Verify that PWD on-variable events are sent
function __fish_test_changed_pwd --on-variable PWD
echo " Changed to $PWD "
end
cd /
functions --erase __fish_test_changed_pwd
#CHECK: Changed to /
# Verify that cds don't stomp on each other.
function __fish_test_thrash_cd
set -l dir ( mktemp -d )
cd $dir
for i in ( seq 50 )
test ( /bin/pwd) = $dir
and test $PWD = $dir
or echo "cd test failed" 1 > & 2
sleep .002
end
end
__fish_test_thrash_cd |
__fish_test_thrash_cd |
__fish_test_thrash_cd |
__fish_test_thrash_cd |
__fish_test_thrash_cd
2021-07-17 19:00:35 +02:00
cd ""
# CHECKERR: cd: Empty directory '' does not exist
# CHECKERR: {{.*}}/cd.fish (line {{\d+}}):
# CHECKERR: builtin cd $argv
# CHECKERR: ^
# CHECKERR: in function 'cd' with arguments '""'
# CHECKERR: called on line {{\d+}} of file {{.*}}/cd.fish
echo $status
# CHECK: 1
2021-09-05 02:11:21 +02:00
2021-09-24 17:35:45 -07:00
cd ( mktemp -d )
2021-09-05 02:11:21 +02:00
ln -s no/such/directory broken-symbolic-link
begin
set -lx CDPATH
cd broken-symbolic-link
end
# CHECKERR: cd: '{{.*}}/broken-symbolic-link' is a broken symbolic link to 'no/such/directory'
# CHECKERR: {{.*}}/cd.fish (line {{\d+}}):
# CHECKERR: builtin cd $argv
# CHECKERR: ^
# CHECKERR: in function 'cd' with arguments 'broken-symbolic-link'
# CHECKERR: called on line {{\d+}} of file {{.*}}/cd.fish
# Make sure that "broken symlink" is reported over "no such file or directory".
begin
set -lx CDPATH other
cd broken-symbolic-link
end
# CHECKERR: cd: '{{.*}}/broken-symbolic-link' is a broken symbolic link to 'no/such/directory'
# CHECKERR: {{.*}}/cd.fish (line {{\d+}}):
# CHECKERR: builtin cd $argv
# CHECKERR: ^
# CHECKERR: in function 'cd' with arguments 'broken-symbolic-link'
# CHECKERR: called on line {{\d+}} of file {{.*}}/cd.fish
2022-12-10 10:56:17 +01:00
begin
mkdir -p foo/bar/muf
set -lx CDPATH foo/bar
cd muf
echo $PWD | grep -q ^ / && echo '$PWD is absolute'
# CHECK: $PWD is absolute
cd ../../..
end
2023-01-16 10:05:01 +01:00
complete -C 'cd .'
# CHECK: ../
# CHECK: ./