mirror of https://github.com/djcb/mu.git
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:
parent
6537de1116
commit
b465c1f779
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue