Fix crashes with conflict dialog

When the client runs and a conflict gets detected, the sync engine runs
two times.

On the first run, the sync engine detects the conflict, marks the
file as a conflict and propagates that to the GUI. This leads to an
error notification with the original filename in the main dialog.

The sync engine runs then a second time. On this second run, the file
that originally caused the conflict is not anymore a conflict
file. Instead, the sync engine detects the conflicted copy and
propagates that file as a conflict to the GUI.

When opening the conflict dialog with the original file name (not the
conflicted copy) a crash happens. Usually, the two sync runs are really
fast, so the user does not notice the first notification. However, a
problem can occur if a conflict gets created while the client is not
running. Since then, the client does not do two sync runs. It does only
run once.

Signed-off-by: Felix Weilbach <felix.weilbach@nextcloud.com>
This commit is contained in:
Felix Weilbach 2021-03-04 15:31:58 +01:00 committed by Felix Weilbach (Rebase PR Action)
parent 101d3e5d7d
commit ef5abac567
3 changed files with 22 additions and 6 deletions

View file

@ -413,6 +413,22 @@ void User::slotAddError(const QString &folderAlias, const QString &message, Erro
}
}
bool User::isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const
{
// Check if we are adding it to the right account and if it is useful information (protocol errors)
const auto isDifferentAccount = folder->accountState() != _account.data();
const auto isConflictFromOriginalFile = item->_status == SyncFileItem::Conflict && !Utility::isConflictFile(item->_file);
if (isDifferentAccount) {
return false;
}
if (isConflictFromOriginalFile) {
return false;
}
return true;
}
void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item)
{
auto folderInstance = FolderMan::instance()->folder(folder);
@ -420,8 +436,7 @@ void User::slotItemCompleted(const QString &folder, const SyncFileItemPtr &item)
if (!folderInstance)
return;
// check if we are adding it to the right account and if it is useful information (protocol errors)
if (folderInstance->accountState() == _account.data()) {
if (isValueableActivity(folderInstance, item)) {
qCWarning(lcActivity) << "Item " << item->_file << " retrieved resulted in " << item->_errorString;
Activity activity;

View file

@ -80,6 +80,8 @@ private:
void connectPushNotifications() const;
bool checkPushNotificationsAreReady() const;
bool isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const;
private:
AccountStatePtr _account;
bool _isCurrentUser;

View file

@ -742,13 +742,12 @@ bool OwncloudPropagator::createConflict(const SyncFileItemPtr &item,
conflictItem->_size = item->_previousSize;
emit newItem(conflictItem);
composite->appendTask(conflictItem);
} else {
// Directories we can't process in one go. The next sync run
// will take care of uploading the conflict dir contents.
_anotherSyncNeeded = true;
}
}
// Need a new sync to detect the created copy of the conflicting file
_anotherSyncNeeded = true;
return true;
}