index: make lazy check less lazy

We got many reports where the 'lazy check' didn't work too well for
people... so make it a bit less lazy, so it'll just work for more
people.

In practice, never skip _directories_ unless they're leaf directories;
this avoids the mtime-does-not-bubble-up problem.
This commit is contained in:
Dirk-Jan C. Binnema 2021-08-12 17:56:00 +03:00
parent 6537de1116
commit b465c1f779
3 changed files with 20 additions and 10 deletions

View File

@ -115,12 +115,16 @@ Indexer::Private::handler (const std::string& fullpath, struct stat *statbuf,
Scanner::HandleType htype)
{
switch (htype) {
case Scanner::HandleType::EnterDir: {
case Scanner::HandleType::EnterDir:
case Scanner::HandleType::EnterNewCur: {
// in lazy-mode, we ignore this dir if its dirstamp suggest it
// is up-to-date (this is _not_ always true; hence we call it
// lazy-mode)
// lazy-mode); only for actual message dirs, since the dir
// tstamps may not bubble up.
dirstamp_ = store_.dirstamp(fullpath);
if (conf_.lazy_check && dirstamp_ == statbuf->st_mtime) {
if (conf_.lazy_check &&
dirstamp_ == statbuf->st_mtime &&
htype == Scanner::HandleType::EnterNewCur) {
g_debug("skip %s (seems up-to-date)", fullpath.c_str());
return false;
}

View File

@ -96,14 +96,15 @@ Scanner::Private::process_dentry (const std::string& path, struct dirent *dentry
}
if (S_ISDIR(statbuf.st_mode)) {
const auto res = handler_(fullpath, &statbuf, Scanner::HandleType::EnterDir);
if (!res) {
//g_debug ("skipping dir %s", fullpath.c_str());
const auto new_cur = is_new_cur(dentry->d_name);
const auto htype = new_cur ?
Scanner::HandleType::EnterNewCur :
Scanner::HandleType::EnterDir;
const auto res = handler_(fullpath, &statbuf, htype);
if (!res)
return true; // skip
}
process_dir (fullpath, is_new_cur(dentry->d_name));
process_dir (fullpath, new_cur);
return handler_(fullpath, &statbuf, Scanner::HandleType::LeaveDir);

View File

@ -42,7 +42,12 @@ namespace Mu {
///
class Scanner {
public:
enum struct HandleType { File, EnterDir, LeaveDir };
enum struct HandleType {
File,
EnterNewCur, /* cur/ or new/ */
EnterDir, /* some other directory */
LeaveDir
};
/// Prototype for a handler function
using Handler = std::function<bool(const std::string& fullpath,