Fix implementation of real_path to handle non-existing directories in /

Fixes #1937
This commit is contained in:
Maxime Coste 2018-03-18 23:23:00 +11:00
parent 7ba4ef897b
commit ac91a79b12
5 changed files with 12 additions and 5 deletions

View File

@ -67,6 +67,7 @@ std::pair<StringView, StringView> split_path(StringView path)
String real_path(StringView filename)
{
kak_assert(not filename.empty());
char buffer[PATH_MAX+1];
StringView existing = filename;
@ -74,22 +75,21 @@ String real_path(StringView filename)
while (true)
{
char* res = realpath(existing.zstr(), buffer);
if (res)
if (char* res = realpath(existing.zstr(), buffer))
{
if (non_existing.empty())
return res;
return format("{}/{}", res, non_existing);
return format("{}{}", res, non_existing);
}
auto it = find(existing.rbegin(), existing.rend(), '/');
auto it = find(existing.rbegin() + 1, existing.rend(), '/');
if (it == existing.rend())
{
char cwd[1024];
return format("{}/{}", getcwd(cwd, 1024), filename);
}
existing = StringView{existing.begin(), it.base()-1};
existing = StringView{existing.begin(), it.base()};
non_existing = StringView{it.base(), filename.end()};
}
}

View File

@ -0,0 +1 @@
"aP

View File

@ -0,0 +1 @@
/kakoune-inexisting-directory/missing-file

View File

@ -0,0 +1,4 @@
eval -draft %{
edit /kakoune-inexisting-directory/missing-file
reg a %val{buffile}
}