From: Olivier Goffart Date: Fri, 3 Jun 2016 11:06:11 +0000 (+0200) Subject: Folder: Ignore change from the watcher if the file has not changed its mtime or size... X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~1160^2~7 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5a3120bd52d166601e30a3fac471f6253111e4b8;p=nextcloud-desktop.git Folder: Ignore change from the watcher if the file has not changed its mtime or size (#4942) For issue #4927: On Windows 10, we get a notification after the sync is finished for file that were just downloaded. The guard we have against our "own changes" are only working when the sync is running and the OwncloudPropagator still alive. --- diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index 3b36ca48b..518859fe4 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -579,19 +579,10 @@ int Folder::slotWipeErrorBlacklist() 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 @@ -601,14 +592,23 @@ void Folder::slotWatchedPathChanged(const QString& path) 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)