Always use "." for cd

Nobody doesn't want to use $PWD to cd, so if $CDPATH does not include
it that was a mistake.

Bash also appends "." here.

Fixes #4484.
This commit is contained in:
Fabian Homborg 2019-03-26 10:11:36 +01:00
parent eeec6cc2fc
commit b86200938f
6 changed files with 23 additions and 4 deletions

View file

@ -8,6 +8,7 @@
- Add `$pipestatus` support
- macOS Mojave: fish.app can actually run (#5727), 10.14.4's Terminal.app no longer causes an error on launch (#5725)
- fish no longer requires buffering for the last function in a pipeline.
- cd now always checks the current directory, even if $CDPATH does not include it or "." (#4484).
### Syntax changes and new commands
- None yet.

View file

@ -13,7 +13,7 @@ Description
If ``DIRECTORY`` is supplied, it will become the new directory. If no parameter is given, the contents of the ``HOME`` environment variable will be used.
If ``DIRECTORY`` is a relative path, the paths found in the ``CDPATH`` environment variable array will be tried as prefixes for the specified path.
If ``DIRECTORY`` is a relative path, the paths found in the ``CDPATH`` list will be tried as prefixes for the specified path, in addition to $PWD.
Note that the shell will attempt to change directory without requiring ``cd`` if the name of a directory is provided (starting with ``.``, ``/`` or ``~``, or ending with ``/``).

View file

@ -173,9 +173,8 @@ maybe_t<wcstring> path_get_cdpath(const wcstring &dir, const wcstring &wd,
if (auto cdpaths = env_vars.get(L"CDPATH")) {
cdpathsv = cdpaths->as_list();
}
if (cdpathsv.empty()) {
cdpathsv.push_back(L".");
}
// Always append $PWD
cdpathsv.push_back(L".");
for (wcstring next_path : cdpathsv) {
if (next_path.empty()) next_path = L".";
if (next_path == L"." && !wd.empty()) {

View file

@ -7,3 +7,6 @@
####################
# Virtual PWD inheritance
####################
# CDPATH

View file

@ -62,6 +62,16 @@ test (realpath $output_pwd) = $real_getcwd
and echo "BogusPWD test 2 succeeded"
or echo "BogusPWD test 2 failed: $output_pwd vs $real_getcwd"
# $CDPATH
logmsg CDPATH
set -g CDPATH $base
cd linkhome
test $PWD = $base/linkhome; and echo Gone to linkhome via CDPATH
set -g CDPATH /tmp
cd $base
test $PWD = $base; and echo Gone to base
cd linkhome
test $PWD = $base/linkhome; and echo Gone to linkhome via implicit . in CDPATH
# cd back before removing the test directory again.
cd $oldpwd

View file

@ -23,3 +23,9 @@ cd:
PWD is /tmp/cdcomp_test/linkhome
BogusPWD test 1 succeeded
BogusPWD test 2 succeeded
####################
# CDPATH
Gone to linkhome via CDPATH
Gone to base
Gone to linkhome via implicit . in CDPATH