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>
}
}
+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);
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;
void connectPushNotifications() const;
bool checkPushNotificationsAreReady() const;
+ bool isValueableActivity(const Folder *folder, const SyncFileItemPtr &item) const;
+
private:
AccountStatePtr _account;
bool _isCurrentUser;
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;
}