mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-26 06:55:59 +03:00
Merge pull request #6454 from nextcloud/bugfix/fix-crash-syncfolder-remove
Fix crash when deleting a local sync folder during sync.
This commit is contained in:
commit
e5ac6d2935
2 changed files with 37 additions and 13 deletions
|
@ -561,19 +561,21 @@ void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason)
|
|||
|
||||
auto relativePath = path.midRef(this->path().size());
|
||||
|
||||
if (pathIsIgnored(path)) {
|
||||
const auto pinState = _vfs->pinState(relativePath.toString());
|
||||
if (!pinState || *pinState != PinState::Excluded) {
|
||||
if (!_vfs->setPinState(relativePath.toString(), PinState::Excluded)) {
|
||||
qCWarning(lcFolder) << "Could not set pin state of" << relativePath << "to excluded";
|
||||
if (_vfs) {
|
||||
if (pathIsIgnored(path)) {
|
||||
const auto pinState = _vfs->pinState(relativePath.toString());
|
||||
if (!pinState || *pinState != PinState::Excluded) {
|
||||
if (!_vfs->setPinState(relativePath.toString(), PinState::Excluded)) {
|
||||
qCWarning(lcFolder) << "Could not set pin state of" << relativePath << "to excluded";
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
const auto pinState = _vfs->pinState(relativePath.toString());
|
||||
if (pinState && *pinState == PinState::Excluded) {
|
||||
if (!_vfs->setPinState(relativePath.toString(), PinState::Inherited)) {
|
||||
qCWarning(lcFolder) << "Could not switch pin state of" << relativePath << "from" << *pinState << "to inherited";
|
||||
return;
|
||||
} else {
|
||||
const auto pinState = _vfs->pinState(relativePath.toString());
|
||||
if (pinState && *pinState == PinState::Excluded) {
|
||||
if (!_vfs->setPinState(relativePath.toString(), PinState::Inherited)) {
|
||||
qCWarning(lcFolder) << "Could not switch pin state of" << relativePath << "from" << *pinState << "to inherited";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -610,7 +612,7 @@ void Folder::slotWatchedPathChanged(const QString &path, ChangeReason reason)
|
|||
// an attribute change (pin state) that caused the notification
|
||||
bool spurious = false;
|
||||
if (record.isValid()
|
||||
&& !FileSystem::fileChanged(path, record._fileSize, record._modtime)) {
|
||||
&& !FileSystem::fileChanged(path, record._fileSize, record._modtime) && _vfs) {
|
||||
spurious = true;
|
||||
|
||||
if (auto pinState = _vfs->pinState(relativePath.toString())) {
|
||||
|
@ -974,6 +976,8 @@ void Folder::wipeForRemoval()
|
|||
// Delete files that have been partially downloaded.
|
||||
slotDiscardDownloadProgress();
|
||||
|
||||
disconnectFolderWatcher();
|
||||
|
||||
// Unregister the socket API so it does not keep the .sync_journal file open
|
||||
FolderMan::instance()->socketApi()->slotUnregisterPath(alias());
|
||||
_journal.close(); // close the sync journal
|
||||
|
@ -1591,6 +1595,21 @@ void Folder::registerFolderWatcher()
|
|||
_folderWatcher->startNotificatonTest(path() + QLatin1String(".nextcloudsync.log"));
|
||||
}
|
||||
|
||||
void Folder::disconnectFolderWatcher()
|
||||
{
|
||||
if (!_folderWatcher) {
|
||||
return;
|
||||
}
|
||||
disconnect(_folderWatcher.data(), &FolderWatcher::pathChanged, nullptr, nullptr);
|
||||
disconnect(_folderWatcher.data(), &FolderWatcher::lostChanges, this, &Folder::slotNextSyncFullLocalDiscovery);
|
||||
disconnect(_folderWatcher.data(), &FolderWatcher::becameUnreliable, this, &Folder::slotWatcherUnreliable);
|
||||
if (_accountState->account()->capabilities().filesLockAvailable()) {
|
||||
disconnect(_folderWatcher.data(), &FolderWatcher::filesLockReleased, this, &Folder::slotFilesLockReleased);
|
||||
disconnect(_folderWatcher.data(), &FolderWatcher::lockedFilesFound, this, &Folder::slotLockedFilesFound);
|
||||
}
|
||||
disconnect(_folderWatcher.data(), &FolderWatcher::filesLockImposed, this, &Folder::slotFilesLockImposed);
|
||||
}
|
||||
|
||||
bool Folder::virtualFilesEnabled() const
|
||||
{
|
||||
return _definition.virtualFilesMode != Vfs::Off && !isVfsOnOffSwitchPending();
|
||||
|
|
|
@ -400,6 +400,11 @@ public slots:
|
|||
private slots:
|
||||
void slotSyncStarted();
|
||||
void slotSyncFinished(bool);
|
||||
/*
|
||||
* Disconnects all the slots from the FolderWatcher
|
||||
* Needs to be called each time a folder is removed
|
||||
*/
|
||||
void disconnectFolderWatcher();
|
||||
|
||||
/** Adds a error message that's not tied to a specific item.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue