summaryrefslogtreecommitdiffhomepage
path: root/packages/kernel/src/file_watcher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/kernel/src/file_watcher.cpp')
-rw-r--r--packages/kernel/src/file_watcher.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/packages/kernel/src/file_watcher.cpp b/packages/kernel/src/file_watcher.cpp
index ae292c2..c747fe4 100644
--- a/packages/kernel/src/file_watcher.cpp
+++ b/packages/kernel/src/file_watcher.cpp
@@ -109,6 +109,19 @@ auto FileWatcher::add(const std::string& path, std::function<void()> on_change,
return FileWatch(this, token);
}
+auto FileWatcher::add_dir(const std::string& dir, std::function<void()> on_change, ExtensionId who)
+ -> FileWatch {
+ if (!ensure_started()) {
+ return FileWatch{};
+ }
+ std::string d = dir.empty() ? std::string(".") : dir;
+ const Token token = ++next_token_;
+ // Empty basename => match ANY file change in `d`.
+ entries_.emplace(token, Entry{std::move(d), std::string{}, std::move(on_change), who});
+ arm_dir(entries_.at(token).dir);
+ return FileWatch(this, token);
+}
+
void FileWatcher::remove_watch(Token token) noexcept {
auto it = entries_.find(token);
if (it == entries_.end()) {
@@ -164,7 +177,9 @@ void FileWatcher::on_readable() {
std::vector<Token> to_fire;
for (const auto& [token, e] : entries_) {
for (const auto& [dir, name] : changed) {
- if (e.dir == dir && e.basename == name) {
+ // A file-specific entry matches its basename; a directory entry
+ // (empty basename) matches ANY file change in its dir.
+ if (e.dir == dir && (e.basename.empty() || e.basename == name)) {
to_fire.push_back(token);
break;
}