Merge pull request #6019 from nextcloud/backport/6014/stable-3.10

[stable-3.10] Allow deleting remotely deleted files locally in case of upload errors
This commit is contained in:
allexzander 2023-09-05 15:26:30 +02:00 committed by GitHub
commit 43cd9403e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 4 deletions

View File

@ -227,6 +227,7 @@ void DiscoveryPhase::enqueueDirectoryToDelete(const QString &path, ProcessDirect
void DiscoveryPhase::startJob(ProcessDirectoryJob *job)
{
ENFORCE(!_currentRootJob);
connect(this, &DiscoveryPhase::itemDiscovered, this, &DiscoveryPhase::slotItemDiscovered, Qt::UniqueConnection);
connect(job, &ProcessDirectoryJob::finished, this, [this, job] {
ENFORCE(_currentRootJob == sender());
_currentRootJob = nullptr;
@ -267,6 +268,16 @@ void DiscoveryPhase::scheduleMoreJobs()
}
}
void DiscoveryPhase::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
{
if (item->_instruction == CSYNC_INSTRUCTION_ERROR && item->_direction == SyncFileItem::Up) {
_hasUploadErrorItems = true;
}
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE && item->_direction == SyncFileItem::Down) {
_hasDownloadRemovedItems = true;
}
}
DiscoverySingleLocalDirectoryJob::DiscoverySingleLocalDirectoryJob(const AccountPtr &account, const QString &localPath, OCC::Vfs *vfs, QObject *parent)
: QObject(parent), QRunnable(), _localPath(localPath), _account(account), _vfs(vfs)
{

View File

@ -318,6 +318,9 @@ public:
QStringList _listExclusiveFiles;
bool _hasUploadErrorItems = false;
bool _hasDownloadRemovedItems = false;
signals:
void fatalError(const QString &errorString, const OCC::ErrorCategory errorCategory);
void itemDiscovered(const OCC::SyncFileItemPtr &item);
@ -334,6 +337,9 @@ signals:
void silentlyExcluded(const QString &folderPath);
void addErrorToGui(const SyncFileItem::Status status, const QString &errorMessage, const QString &subject, const OCC::ErrorCategory category);
private slots:
void slotItemDiscovered(const OCC::SyncFileItemPtr &item);
};
/// Implementation of DiscoveryPhase::adjustRenamedPath

View File

@ -510,10 +510,12 @@ void OwncloudPropagator::start(SyncFileItemVector &&items)
} while (index > 0);
}
}
items.erase(std::remove_if(items.begin(), items.end(), [&names](auto i) {
return !names.contains(QStringRef { &i->_file });
}),
items.end());
items.erase(std::remove_if(items.begin(),
items.end(),
[&names](auto i) {
return !names.contains(QStringRef{&i->_file});
}),
items.end());
}
QStringList files;

View File

@ -810,6 +810,15 @@ void SyncEngine::slotDiscoveryFinished()
slotUnscheduleFilesDelayedSync();
}
if (_discoveryPhase->_hasDownloadRemovedItems && _discoveryPhase->_hasUploadErrorItems) {
for (const auto &item : _syncItems) {
if (item->_instruction == CSYNC_INSTRUCTION_ERROR && item->_direction == SyncFileItem::Up) {
item->_instruction = CSYNC_INSTRUCTION_IGNORE;
}
}
_anotherSyncNeeded = ImmediateFollowUp;
}
Q_ASSERT(std::is_sorted(_syncItems.begin(), _syncItems.end()));
qCInfo(lcEngine) << "#### Reconcile (aboutToPropagate) #################################################### " << _stopWatch.addLapTime(QStringLiteral("Reconcile (aboutToPropagate)")) << "ms";