mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 13:23:09 +00:00
path: Make path real "work" with nonexistent paths
This just goes back until it finds an existent path, resolves that, and adds the normalized rest on top. So if you try /bin/foo/bar////../baz and /bin exists as a symlink to /usr/bin, it would resolve that, and normalize the rest, giving /usr/bin/foo/baz (note: We might want to add this to realpath as well?)
This commit is contained in:
parent
4fced3ef5a
commit
479fde27d7
2 changed files with 33 additions and 1 deletions
|
@ -631,7 +631,28 @@ static int path_real(parser_t &parser, io_streams_t &streams, int argc, const wc
|
|||
auto real = wrealpath(*arg);
|
||||
|
||||
if (!real) {
|
||||
continue;
|
||||
// The path doesn't exist, so we go up until we find
|
||||
// something that does.
|
||||
wcstring next = *arg;
|
||||
// First add $PWD if we're relative
|
||||
if (!next.empty() && next[0] != L'/') {
|
||||
next = wgetcwd() + L"/" + next;
|
||||
}
|
||||
auto rest = wbasename(next);
|
||||
while(!next.empty() && next != L"/") {
|
||||
next = wdirname(next);
|
||||
real = wrealpath(next);
|
||||
if (real) {
|
||||
next.push_back(L'/');
|
||||
next.append(rest);
|
||||
real = normalize_path(next, false);
|
||||
break;
|
||||
}
|
||||
rest = wbasename(next) + L'/' + rest;
|
||||
}
|
||||
if (!real) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Return 0 if we found a realpath.
|
||||
|
|
|
@ -110,3 +110,14 @@ path real bin//sh | string match -r -- 'bin/bash$'
|
|||
# The "//" is squashed, and the symlink is resolved.
|
||||
# sh here is bash
|
||||
# CHECK: bin/bash
|
||||
|
||||
# `path real` with nonexistent paths
|
||||
set -l path (path real foo/bar)
|
||||
string match -rq "^"(string escape --style=regex -- $PWD)'/' -- $path
|
||||
and echo It matches pwd!
|
||||
# CHECK: It matches pwd!
|
||||
string replace -r "^"(string escape --style=regex -- $PWD)'/' "" -- $path
|
||||
# CHECK: foo/bar
|
||||
|
||||
path real /banana//terracota/terracota/booooo/../pie
|
||||
# CHECK: /banana/terracota/terracota/pie
|
||||
|
|
Loading…
Reference in a new issue