Make completeDir follow symlinks

Allows completing `nix why-depends /run/cur<Tab>` to /run/current-system
This commit is contained in:
Naïm Favier 2022-02-18 13:26:40 +01:00
parent a6d7cd4183
commit 5461ff532d
No known key found for this signature in database
GPG key ID: 49B07322580B7EE2
3 changed files with 11 additions and 1 deletions

View file

@ -290,7 +290,7 @@ static void _completePath(std::string_view prefix, bool onlyDirs)
if (glob((std::string(prefix) + "*").c_str(), flags, nullptr, &globbuf) == 0) { if (glob((std::string(prefix) + "*").c_str(), flags, nullptr, &globbuf) == 0) {
for (size_t i = 0; i < globbuf.gl_pathc; ++i) { for (size_t i = 0; i < globbuf.gl_pathc; ++i) {
if (onlyDirs) { if (onlyDirs) {
auto st = lstat(globbuf.gl_pathv[i]); auto st = stat(globbuf.gl_pathv[i]);
if (!S_ISDIR(st.st_mode)) continue; if (!S_ISDIR(st.st_mode)) continue;
} }
completions->add(globbuf.gl_pathv[i]); completions->add(globbuf.gl_pathv[i]);

View file

@ -215,6 +215,15 @@ bool isDirOrInDir(std::string_view path, std::string_view dir)
} }
struct stat stat(const Path & path)
{
struct stat st;
if (stat(path.c_str(), &st))
throw SysError("getting status of '%1%'", path);
return st;
}
struct stat lstat(const Path & path) struct stat lstat(const Path & path)
{ {
struct stat st; struct stat st;

View file

@ -77,6 +77,7 @@ bool isInDir(std::string_view path, std::string_view dir);
bool isDirOrInDir(std::string_view path, std::string_view dir); bool isDirOrInDir(std::string_view path, std::string_view dir);
/* Get status of `path'. */ /* Get status of `path'. */
struct stat stat(const Path & path);
struct stat lstat(const Path & path); struct stat lstat(const Path & path);
/* Return true iff the given path exists. */ /* Return true iff the given path exists. */