static constexpr char notificationRefreshIntervalC[] = "notificationRefreshInterval";
static constexpr char monoIconsC[] = "monoIcons";
static constexpr char promptDeleteC[] = "promptDeleteAllFiles";
+static constexpr char deleteFilesThresholdC[] = "deleteFilesThreshold";
static constexpr char crashReporterC[] = "crashReporter";
static constexpr char optionalServerNotificationsC[] = "optionalServerNotifications";
static constexpr char showCallNotificationsC[] = "showCallNotifications";
static const QString defaultUpdateChannelName = "stable";
static const QStringList enterpriseUpdateChannelsList { QStringLiteral("stable"), QStringLiteral("enterprise") };
static const QString defaultEnterpriseChannel = "enterprise";
+
+static constexpr int deleteFilesThresholdDefaultValue = 100;
}
namespace OCC {
bool ConfigFile::promptDeleteFiles() const
{
QSettings settings(configFile(), QSettings::IniFormat);
- return settings.value(QLatin1String(promptDeleteC), false).toBool();
+ return settings.value(QLatin1String(promptDeleteC), true).toBool();
}
void ConfigFile::setPromptDeleteFiles(bool promptDeleteFiles)
settings.setValue(QLatin1String(promptDeleteC), promptDeleteFiles);
}
+int ConfigFile::deleteFilesThreshold() const
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ return settings.value(QLatin1String(deleteFilesThresholdC), deleteFilesThresholdDefaultValue).toInt();
+}
+
+void ConfigFile::setDeleteFilesThreshold(int thresholdValue)
+{
+ QSettings settings(configFile(), QSettings::IniFormat);
+ settings.setValue(QLatin1String(deleteFilesThresholdC), thresholdValue);
+}
+
bool ConfigFile::monoIcons() const
{
QSettings settings(configFile(), QSettings::IniFormat);
_progressInfo->_status = ProgressInfo::Reconcile;
emit transmissionProgress(*_progressInfo);
- const auto displayDialog = ConfigFile().promptDeleteFiles() && !_syncOptions.isCmd();
- if (!_hasNoneFiles && _hasRemoveFile && displayDialog) {
- qCInfo(lcEngine) << "All the files are going to be changed, asking the user";
- int side = 0; // > 0 means more deleted on the server. < 0 means more deleted on the client
- for (const auto &it : _syncItems) {
- if (it->_instruction == CSYNC_INSTRUCTION_REMOVE) {
- side += it->_direction == SyncFileItem::Down ? 1 : -1;
- }
- }
-
- promptUserBeforePropagation([this, side](auto &&callback){
- emit aboutToRemoveAllFiles(side >= 0 ? SyncFileItem::Down : SyncFileItem::Up, callback);
- });
+ if (handleMassDeletion()) {
return;
}
qCInfo(lcEngine) << "#### Post-Reconcile end #################################################### " << _stopWatch.addLapTime(QStringLiteral("Post-Reconcile Finished")) << "ms";
}
+bool SyncEngine::handleMassDeletion()
+{
+ const auto displayDialog = ConfigFile().promptDeleteFiles() && !_syncOptions.isCmd();
+ const auto allFilesDeleted = !_hasNoneFiles && _hasRemoveFile;
+
+ auto deletionCounter = 0;
+ for (const auto &oneItem : qAsConst(_syncItems)) {
+ if (oneItem->_instruction == CSYNC_INSTRUCTION_REMOVE) {
+ if (oneItem->isDirectory()) {
+ const auto result = _journal->listFilesInPath(oneItem->_file.toUtf8(), [&deletionCounter] (const auto &oneRecord) {
+ if (oneRecord.isFile()) {
+ ++deletionCounter;
+ }
+ });
+ if (!result) {
+ qCDebug(lcEngine()) << "unable to find the number of files within a deleted folder:" << oneItem->_file;
+ }
+ } else {
+ ++deletionCounter;
+ }
+ }
+ }
+ const auto filesDeletedThresholdExceeded = deletionCounter > ConfigFile().deleteFilesThreshold();
+
+ if ((allFilesDeleted || filesDeletedThresholdExceeded) && displayDialog) {
+ qCInfo(lcEngine) << "All the files are going to be changed, asking the user";
+ int side = 0; // > 0 means more deleted on the server. < 0 means more deleted on the client
+ for (const auto &it : qAsConst(_syncItems)) {
+ if (it->_instruction == CSYNC_INSTRUCTION_REMOVE) {
+ side += it->_direction == SyncFileItem::Down ? 1 : -1;
+ }
+ }
+
+ promptUserBeforePropagation([this, side](auto &&callback){
+ emit aboutToRemoveAllFiles(side >= 0 ? SyncFileItem::Down : SyncFileItem::Up, callback);
+ });
+ return true;
+ }
+ return false;
+}
+
void SyncEngine::handleRemnantReadOnlyFolders()
{
promptUserBeforePropagation([this](auto &&callback) {