resolve: Normalize

This means "../" components are cancelled out even after non-existent
paths or files.

(the alternative is to error out, but being able to say `path resolve
/path/to/file/../../` over `path resolve (path dirname
/path/to/file)/../../` seems worth it?)
This commit is contained in:
Fabian Homborg 2022-04-07 15:13:10 +02:00
parent dfded633c6
commit 5cce6d01ad
2 changed files with 9 additions and 0 deletions

View File

@ -675,6 +675,11 @@ static int path_resolve(parser_t &parser, io_streams_t &streams, int argc, const
}
}
// Normalize the path so "../" components are eliminated even after
// nonexistent or non-directory components.
// Otherwise `path resolve foo/../` will be `$PWD/foo/../` if foo is a file.
real = normalize_path(*real, false);
// Return 0 if we found a realpath.
if (opts.quiet) {
return STATUS_CMD_OK;

View File

@ -118,6 +118,10 @@ path resolve bin//sh | string match -r -- 'bin/bash$'
# sh here is bash
# CHECK: bin/bash
# "../" cancels out even files.
path resolve bin//sh/../ | string match -r -- 'bin$'
# CHECK: bin
# `path resolve` with nonexistent paths
set -l path (path resolve foo/bar)
string match -rq "^"(pwd -P | string escape --style=regex)'/' -- $path