aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNaïm Favier <n@monade.li>2022-02-18 13:26:40 +0100
committerNaïm Favier <n@monade.li>2022-03-07 12:01:54 +0100
commit5461ff532d6169be86af703b15cfb49569732cbb (patch)
tree1700965668139ed19e0ce4dc7b22c5714f7ee3a7 /src
parenta6d7cd418385e20feab8d7260a7251f218a0d5bb (diff)
Make completeDir follow symlinks
Allows completing `nix why-depends /run/cur<Tab>` to /run/current-system
Diffstat (limited to 'src')
-rw-r--r--src/libutil/args.cc2
-rw-r--r--src/libutil/util.cc9
-rw-r--r--src/libutil/util.hh1
3 files changed, 11 insertions, 1 deletions
diff --git a/src/libutil/args.cc b/src/libutil/args.cc
index 38c748be0..b60c609a6 100644
--- a/src/libutil/args.cc
+++ b/src/libutil/args.cc
@@ -290,7 +290,7 @@ static void _completePath(std::string_view prefix, bool onlyDirs)
if (glob((std::string(prefix) + "*").c_str(), flags, nullptr, &globbuf) == 0) {
for (size_t i = 0; i < globbuf.gl_pathc; ++i) {
if (onlyDirs) {
- auto st = lstat(globbuf.gl_pathv[i]);
+ auto st = stat(globbuf.gl_pathv[i]);
if (!S_ISDIR(st.st_mode)) continue;
}
completions->add(globbuf.gl_pathv[i]);
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index b833038a9..deaa17a7f 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -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 st;
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 20591952d..94ae8ab7d 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -77,6 +77,7 @@ bool isInDir(std::string_view path, std::string_view dir);
bool isDirOrInDir(std::string_view path, std::string_view dir);
/* Get status of `path'. */
+struct stat stat(const Path & path);
struct stat lstat(const Path & path);
/* Return true iff the given path exists. */