mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-28 07:54:49 +03:00
Ignores: Force a remote discovery after ignore list change #3172
The problem was that the modified ignore pattern was not applied to the parts of the remote tree we simply retrieve from the db because the folder etag didn't change. Even worse, if one removed an ignore pattern, the un-ignored files would not be synced correctly. With this change, a modification to the ignore list always results in a full remote discovery. This guarantees that we find un-ignored files.
This commit is contained in:
parent
9a9897ea1e
commit
deb5e68e15
4 changed files with 49 additions and 8 deletions
|
@ -398,6 +398,18 @@ void AccountSettings::slotSelectiveSync()
|
|||
}
|
||||
}
|
||||
|
||||
void AccountSettings::slotForceRemoteDiscoveryOnFolders()
|
||||
{
|
||||
FolderMan* folders = FolderMan::instance();
|
||||
foreach (Folder* folder, folders->map()) {
|
||||
if (folder->accountState() != _accountState) {
|
||||
continue;
|
||||
}
|
||||
|
||||
folder->journalDb()->forceRemoteDiscoveryNextSync();
|
||||
}
|
||||
}
|
||||
|
||||
void AccountSettings::slotDoubleClicked( const QModelIndex& indx )
|
||||
{
|
||||
if( ! indx.isValid() ) return;
|
||||
|
@ -777,6 +789,7 @@ void AccountSettings::slotIgnoreFilesEditor()
|
|||
_ignoreEditor = new IgnoreListEditor(this);
|
||||
_ignoreEditor->setAttribute( Qt::WA_DeleteOnClose, true );
|
||||
_ignoreEditor->open();
|
||||
connect(_ignoreEditor, SIGNAL(accepted()), SLOT(slotForceRemoteDiscoveryOnFolders()));
|
||||
} else {
|
||||
ownCloudGui::raiseDialog(_ignoreEditor);
|
||||
}
|
||||
|
|
|
@ -83,6 +83,7 @@ protected slots:
|
|||
void slotOpenAccountWizard();
|
||||
void slotHideProgress();
|
||||
void slotSelectiveSync();
|
||||
void slotForceRemoteDiscoveryOnFolders();
|
||||
|
||||
private:
|
||||
QString shortenFilename( const QString& folder, const QString& file ) const;
|
||||
|
|
|
@ -331,14 +331,7 @@ bool SyncJournalDb::checkConnect()
|
|||
* In 1.8.1 we had a fix to re-get the data, but this one here is better
|
||||
*/
|
||||
if (forceRemoteDiscovery) {
|
||||
qDebug() << "Forcing remote re-discovery by deleting folder Etags";
|
||||
SqlQuery deleteRemoteFolderEtagsQuery(_db);
|
||||
deleteRemoteFolderEtagsQuery.prepare("UPDATE metadata SET md5='_invalid_' WHERE type=2;");
|
||||
if( !deleteRemoteFolderEtagsQuery.exec() ) {
|
||||
qDebug() << "ERROR: Query failed" << deleteRemoteFolderEtagsQuery.error();
|
||||
} else {
|
||||
qDebug() << "Cleared" << deleteRemoteFolderEtagsQuery.numRowsAffected() << "folder ETags";
|
||||
}
|
||||
forceRemoteDiscoveryNextSyncLocked();
|
||||
}
|
||||
|
||||
_getFileRecordQuery.reset(new SqlQuery(_db));
|
||||
|
@ -1295,6 +1288,30 @@ void SyncJournalDb::avoidReadFromDbOnNextSync(const QString& fileName)
|
|||
_avoidReadFromDbOnNextSyncFilter.append(fileName);
|
||||
}
|
||||
|
||||
void SyncJournalDb::forceRemoteDiscoveryNextSync()
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
|
||||
if( !checkConnect() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
forceRemoteDiscoveryNextSyncLocked();
|
||||
}
|
||||
|
||||
void SyncJournalDb::forceRemoteDiscoveryNextSyncLocked()
|
||||
{
|
||||
qDebug() << "Forcing remote re-discovery by deleting folder Etags";
|
||||
SqlQuery deleteRemoteFolderEtagsQuery(_db);
|
||||
deleteRemoteFolderEtagsQuery.prepare("UPDATE metadata SET md5='_invalid_' WHERE type=2;");
|
||||
if( !deleteRemoteFolderEtagsQuery.exec() ) {
|
||||
qDebug() << "ERROR: Query failed" << deleteRemoteFolderEtagsQuery.error();
|
||||
} else {
|
||||
qDebug() << "Cleared" << deleteRemoteFolderEtagsQuery.numRowsAffected() << "folder ETags";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SyncJournalDb::commit(const QString& context, bool startTrans)
|
||||
{
|
||||
QMutexLocker lock(&_mutex);
|
||||
|
|
|
@ -97,6 +97,13 @@ public:
|
|||
*/
|
||||
void avoidReadFromDbOnNextSync(const QString& fileName);
|
||||
|
||||
/**
|
||||
* Ensures full remote discovery happens on the next sync.
|
||||
*
|
||||
* Equivalent to calling avoidReadFromDbOnNextSync() for all files.
|
||||
*/
|
||||
void forceRemoteDiscoveryNextSync();
|
||||
|
||||
bool postSyncCleanup(const QSet<QString>& filepathsToKeep,
|
||||
const QSet<QString>& prefixesToKeep);
|
||||
|
||||
|
@ -124,6 +131,9 @@ private:
|
|||
QStringList tableColumns( const QString& table );
|
||||
bool checkConnect();
|
||||
|
||||
// Same as forceRemoteDiscoveryNextSync but without acquiring the lock
|
||||
void forceRemoteDiscoveryNextSyncLocked();
|
||||
|
||||
SqlDatabase _db;
|
||||
QString _dbFile;
|
||||
QMutex _mutex; // Public functions are protected with the mutex.
|
||||
|
|
Loading…
Reference in a new issue