From: Hannah von Reth Date: Mon, 16 Dec 2019 15:33:41 +0000 (+0100) Subject: Don't ignore file sync notification after an unlock X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~21^2~468^2~147 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=edb51abdfd9ba4a9c95c48d54b280007d3a26509;p=nextcloud-desktop.git Don't ignore file sync notification after an unlock For a usual file sync event we check for actual changes in the local file, after an unlock the local file might be unchanged so we need to sync it anyhow. Fixes: owncloud/enterprise#3609 --- diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index b77abe387..e513bce40 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -536,7 +536,7 @@ int Folder::slotWipeErrorBlacklist() return _journal.wipeErrorBlacklist(); } -void Folder::slotWatchedPathChanged(const QString &path) +void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason) { if (!path.startsWith(this->path())) { qCDebug(lcFolder) << "Changed path is not contained in folder, ignoring:" << path; @@ -567,27 +567,29 @@ void Folder::slotWatchedPathChanged(const QString &path) } #endif - // Check that the mtime/size actually changed or there was - // an attribute change (pin state) that caused the notification - bool spurious = false; + SyncJournalFileRecord record; - if (_journal.getFileRecord(relativePathBytes, &record) - && record.isValid() - && !FileSystem::fileChanged(path, record._fileSize, record._modtime)) { - spurious = true; - - if (auto pinState = _vfs->pinState(relativePath.toString())) { - if (*pinState == PinState::AlwaysLocal && record.isVirtualFile()) - spurious = false; - if (*pinState == PinState::OnlineOnly && record.isFile()) - spurious = false; + _journal.getFileRecord(relativePathBytes, &record); + if (reason != ChangeReason::UnLock) { + // Check that the mtime/size actually changed or there was + // an attribute change (pin state) that caused the notification + bool spurious = false; + if (record.isValid() + && !FileSystem::fileChanged(path, record._fileSize, record._modtime)) { + spurious = true; + + if (auto pinState = _vfs->pinState(relativePath.toString())) { + if (*pinState == PinState::AlwaysLocal && record.isVirtualFile()) + spurious = false; + if (*pinState == PinState::OnlineOnly && record.isFile()) + spurious = false; + } + } + if (spurious) { + qCInfo(lcFolder) << "Ignoring spurious notification for file" << relativePath; + return; // probably a spurious notification } } - if (spurious) { - qCInfo(lcFolder) << "Ignoring spurious notification for file" << relativePath; - return; // probably a spurious notification - } - warnOnNewExcludedItem(record, relativePath); emit watchedFileChangedExternally(path); @@ -1219,7 +1221,7 @@ void Folder::registerFolderWatcher() _folderWatcher.reset(new FolderWatcher(this)); connect(_folderWatcher.data(), &FolderWatcher::pathChanged, - this, &Folder::slotWatchedPathChanged); + this, [this](const QString &path) { slotWatchedPathChanged(path, Folder::ChangeReason::Other); }); connect(_folderWatcher.data(), &FolderWatcher::lostChanges, this, &Folder::slotNextSyncFullLocalDiscovery); connect(_folderWatcher.data(), &FolderWatcher::becameUnreliable, diff --git a/src/gui/folder.h b/src/gui/folder.h index 92ad664cc..0686b119b 100644 --- a/src/gui/folder.h +++ b/src/gui/folder.h @@ -107,6 +107,12 @@ class Folder : public QObject Q_OBJECT public: + enum class ChangeReason { + Other, + UnLock + }; + Q_ENUM(ChangeReason) + /** Create a new Folder */ Folder(const FolderDefinition &definition, AccountState *accountState, std::unique_ptr vfs, QObject *parent = nullptr); @@ -330,7 +336,7 @@ public slots: * changes. Needs to check whether this change should trigger a new * sync run to be scheduled. */ - void slotWatchedPathChanged(const QString &path); + void slotWatchedPathChanged(const QString &path, ChangeReason reason); /** * Mark a virtual file as being requested for download, and start a sync. diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 0427fa995..081e6724c 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -894,7 +894,7 @@ void FolderMan::slotWatchedFileUnlocked(const QString &path) { if (Folder *f = folderForPath(path)) { // Treat this equivalently to the file being reported by the file watcher - f->slotWatchedPathChanged(path); + f->slotWatchedPathChanged(path, Folder::ChangeReason::UnLock); } }