Don't replace tilde for error messages if we have no $HOME

This was an issue with "--no-execute", which has no variables and
therefore no $HOME:

```fish
fish --no-execute /path/to/file
```

would say the error is in `~/path/to/file`.

Instead, since this is just for a message, we simply return the
filename without doing the replacement.

Fixes #10171

Port of e318585021
This commit is contained in:
Fabian Boehm 2023-12-28 10:15:08 +01:00
parent 7008e0eec2
commit 2fe8b5d313
2 changed files with 12 additions and 0 deletions

View file

@ -881,6 +881,9 @@ wcstring replace_home_directory_with_tilde(const wcstring &str, const environmen
if (string_prefixes_string(L"/", result)) {
wcstring home_directory = L"~";
expand_tilde(home_directory, vars);
// If we can't get a home directory, don't replace anything.
// This is the case e.g. with --no-execute.
if (home_directory.empty()) return result;
if (!string_suffixes_string(L"/", home_directory)) {
home_directory.push_back(L'/');
}

View file

@ -23,5 +23,14 @@ echo "begin; echo oops" | $fish -n
echo $status
#CHECK: 127
echo "begin" > broken
$fish -n $PWD/broken
#CHECKERR: /{{.*}}broken (line 1): Missing end to balance this begin
#CHECKERR: begin
#CHECKERR: ^~~~^
#CHECKERR: warning: Error while reading file /{{.*}}broken
rm broken
# Littlecheck assumes a status of 127 means the shebang was invalid.
exit 0