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)
|
Scanner::HandleType htype)
|
||||||
{
|
{
|
||||||
switch (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
|
// 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
|
// 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);
|
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());
|
g_debug("skip %s (seems up-to-date)", fullpath.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,14 +96,15 @@ Scanner::Private::process_dentry (const std::string& path, struct dirent *dentry
|
||||||
}
|
}
|
||||||
|
|
||||||
if (S_ISDIR(statbuf.st_mode)) {
|
if (S_ISDIR(statbuf.st_mode)) {
|
||||||
|
const auto new_cur = is_new_cur(dentry->d_name);
|
||||||
const auto res = handler_(fullpath, &statbuf, Scanner::HandleType::EnterDir);
|
const auto htype = new_cur ?
|
||||||
if (!res) {
|
Scanner::HandleType::EnterNewCur :
|
||||||
//g_debug ("skipping dir %s", fullpath.c_str());
|
Scanner::HandleType::EnterDir;
|
||||||
|
const auto res = handler_(fullpath, &statbuf, htype);
|
||||||
|
if (!res)
|
||||||
return true; // skip
|
return true; // skip
|
||||||
}
|
|
||||||
|
|
||||||
process_dir (fullpath, is_new_cur(dentry->d_name));
|
process_dir (fullpath, new_cur);
|
||||||
|
|
||||||
return handler_(fullpath, &statbuf, Scanner::HandleType::LeaveDir);
|
return handler_(fullpath, &statbuf, Scanner::HandleType::LeaveDir);
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,12 @@ namespace Mu {
|
||||||
///
|
///
|
||||||
class Scanner {
|
class Scanner {
|
||||||
public:
|
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
|
/// Prototype for a handler function
|
||||||
using Handler = std::function<bool(const std::string& fullpath,
|
using Handler = std::function<bool(const std::string& fullpath,
|
||||||
|
|
Loading…
Reference in New Issue