mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-26 23:28:14 +03:00
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:
parent
101d3e5d7d
commit
ef5abac567
3 changed files with 22 additions and 6 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue