From 4e385c53f5a4dfd3a749f158d0f130c807052b7e Mon Sep 17 00:00:00 2001 From: Eduard Bloch Date: Tue, 8 Oct 2024 21:17:00 +0200 Subject: [PATCH] Explicit blacklisting of menu-xdg subfolders Those folders can contain a zoo of orphaned copies of old .desktop files, added to user's home directories by a faulty tool almost 10 years ago. The issues from the zombie was actually the trigger to recursive/non-recursive mode, so now only filter by blacklist and not by being a sub-folder per-se. --- src/fdomenu.cc | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/fdomenu.cc b/src/fdomenu.cc index 6879c99e8..6c85d4f77 100644 --- a/src/fdomenu.cc +++ b/src/fdomenu.cc @@ -425,12 +425,13 @@ class FsScan { function cb; string sFileNameExtFilter; bool recursive; + set m_dirBlackList; public: FsScan(decltype(FsScan::cb) cb, const string &sFileNameExtFilter = "", - bool recursive = true) - : cb(cb), sFileNameExtFilter(sFileNameExtFilter), recursive(recursive) { - } + set dirBlackList = {}, bool recursive = true) + : cb(cb), sFileNameExtFilter(sFileNameExtFilter), recursive(recursive), + m_dirBlackList(dirBlackList) {} void scan(const string &sStartdir) { proc_dir_rec(sStartdir); } private: @@ -478,13 +479,15 @@ class FsScan { if (recursive && S_ISDIR(stbuf.st_mode)) { process_dir: - // link loop detection - auto prev = make_pair(stbuf.st_ino, stbuf.st_dev); - auto hint = reclog.insert(prev); - if (hint.second) { // we added a new one, otherwise do not - // descend - proc_dir_rec(path + "/" + fname); - reclog.erase(hint.first); + if (m_dirBlackList.find(fname) == m_dirBlackList.end()) { + // link loop detection + auto prev = make_pair(stbuf.st_ino, stbuf.st_dev); + auto hint = reclog.insert(prev); + if (hint.second) { // we added a new one, otherwise do not + // descend + proc_dir_rec(path + "/" + fname); + reclog.erase(hint.first); + } } } @@ -1126,7 +1129,7 @@ int main(int argc, char **argv) { return true; }, - ".desktop"); + ".desktop", {"menu-xdg"}); for (const auto &sdir : sharedirs) { DBGMSG("checkdir: " << sdir); @@ -1174,7 +1177,7 @@ int main(int argc, char **argv) { return true; }, - ".directory", false); + ".directory", {"menu-xdg"}); for (const auto &sdir : sharedirs) { dir_loader.scan(sdir + "/desktop-directories");