From: Matthieu Gallien Date: Thu, 27 Oct 2022 15:29:02 +0000 (+0200) Subject: do not skip folder deletion if BlacklistedError during propagation X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~11^2~155^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=402d959caea89c461366a232e807dced2c712034;p=nextcloud-desktop.git do not skip folder deletion if BlacklistedError during propagation in case some propgation actions ends up with a BlacklistedError, we would skip the deletions of local folders (even though they have been deleted from server) let's not skip them but rather keep track of the error status and properly report them Signed-off-by: Matthieu Gallien --- diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index 198f1b73b..cb3734e17 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -594,7 +594,7 @@ void OwncloudPropagator::start(SyncFileItemVector &&items) } foreach (PropagatorJob *it, directoriesToRemove) { - _rootJob->_dirDeletionJobs.appendJob(it); + _rootJob->appendDirDeletionJob(it); } connect(_rootJob.data(), &PropagatorJob::finished, this, &OwncloudPropagator::emitFinished); @@ -1292,6 +1292,11 @@ qint64 PropagateRootDirectory::committedDiskSpace() const return _subJobs.committedDiskSpace() + _dirDeletionJobs.committedDiskSpace(); } +void PropagateRootDirectory::appendDirDeletionJob(PropagatorJob *job) +{ + _dirDeletionJobs.appendJob(job); +} + bool PropagateRootDirectory::scheduleSelfOrChild() { qCInfo(lcRootDirectory()) << "scheduleSelfOrChild" << _state << "pending uploads" << propagator()->delayedTasks().size() << "subjobs state" << _subJobs._state; @@ -1327,6 +1332,7 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status) if (status != SyncFileItem::Success && status != SyncFileItem::Restoration + && status != SyncFileItem::BlacklistedError && status != SyncFileItem::Conflict) { if (_state != Finished) { // Synchronously abort @@ -1338,11 +1344,37 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status) return; } + if (_errorStatus == SyncFileItem::NoStatus) { + switch (status) { + case SyncFileItem::NoStatus: + case SyncFileItem::FatalError: + case SyncFileItem::NormalError: + case SyncFileItem::SoftError: + case SyncFileItem::Conflict: + case SyncFileItem::FileIgnored: + case SyncFileItem::FileLocked: + case SyncFileItem::Restoration: + case SyncFileItem::FileNameInvalid: + case SyncFileItem::FileNameClash: + case SyncFileItem::DetailError: + case SyncFileItem::Success: + break; + case SyncFileItem::BlacklistedError: + _errorStatus = SyncFileItem::BlacklistedError; + break; + } + } + propagator()->scheduleNextJob(); } void PropagateRootDirectory::slotDirDeletionJobsFinished(SyncFileItem::Status status) { + if (_errorStatus != SyncFileItem::NoStatus && status == SyncFileItem::Success) { + qCInfo(lcPropagator) << "PropagateRootDirectory::slotDirDeletionJobsFinished" << "reporting previous error" << _errorStatus; + status = _errorStatus; + } + _state = Finished; qCInfo(lcPropagator) << "PropagateRootDirectory::slotDirDeletionJobsFinished" << "emit finished" << status; emit finished(status); diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index 87e695afc..95fe4e743 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -365,8 +365,6 @@ class OWNCLOUDSYNC_EXPORT PropagateRootDirectory : public PropagateDirectory { Q_OBJECT public: - PropagatorCompositeJob _dirDeletionJobs; - explicit PropagateRootDirectory(OwncloudPropagator *propagator); bool scheduleSelfOrChild() override; @@ -375,6 +373,9 @@ public: [[nodiscard]] qint64 committedDiskSpace() const override; +public slots: + void appendDirDeletionJob(PropagatorJob *job); + private slots: void slotSubJobsFinished(SyncFileItem::Status status) override; void slotDirDeletionJobsFinished(SyncFileItem::Status status); @@ -382,6 +383,10 @@ private slots: private: bool scheduleDelayedJobs(); + + PropagatorCompositeJob _dirDeletionJobs; + + SyncFileItem::Status _errorStatus = SyncFileItem::Status::NoStatus; }; /**