Skip to content

Commit

Permalink
Always use "." for cd
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
faho committed Mar 26, 2019
1 parent eeec6cc commit b862009
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion sphinx_doc_src/cmds/cd.rst
Expand Up @@ -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 ``/``).

Expand Down
5 changes: 2 additions & 3 deletions src/path.cpp
Expand Up @@ -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()) {
Expand Down
3 changes: 3 additions & 0 deletions tests/cd.err
Expand Up @@ -7,3 +7,6 @@

####################
# Virtual PWD inheritance

####################
# CDPATH
10 changes: 10 additions & 0 deletions tests/cd.in
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions tests/cd.out
Expand Up @@ -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

0 comments on commit b862009

Please sign in to comment.