void Folder::slotWatchedPathChanged(const QString& path)
{
- // When no sync is running or it's in the prepare phase, we can
- // always schedule a new sync.
- if (! _engine->isSyncRunning() || _syncResult.status() == SyncResult::SyncPrepare) {
- emit watchedFileChangedExternally(path);
- emit scheduleToSync(this);
- return;
- }
-
// The folder watcher fires a lot of bogus notifications during
// a sync operation, both for actual user files and the database
// and log. Therefore we check notifications against operations
// the sync is doing to filter out our own changes.
- bool ownChange = false;
#ifdef Q_OS_MAC
Q_UNUSED(path)
// On OSX the folder watcher does not report changes done by our
const auto maxNotificationDelay = 15*1000;
qint64 time = _engine->timeSinceFileTouched(path);
if (time != -1 && time < maxNotificationDelay) {
- ownChange = true;
+ return;
}
#endif
- if (! ownChange) {
- emit watchedFileChangedExternally(path);
- emit scheduleToSync(this);
+ // Check that the mtime actually changed.
+ if (path.startsWith(this->path())) {
+ auto relativePath = path.mid(this->path().size());
+ auto record = _journal.getFileRecord(relativePath);
+ if (record.isValid() && !FileSystem::fileChanged(path, record._fileSize,
+ Utility::qDateTimeToTime_t(record._modtime))) {
+ qDebug() << "Ignoring spurious notification for file" << relativePath;
+ return; // probably a spurious notification
+ }
}
+
+ emit watchedFileChangedExternally(path);
+ emit scheduleToSync(this);
}
void Folder::slotThreadTreeWalkResult(const SyncFileItemVector& items)