From: Kevin Ottens Date: Thu, 8 Oct 2020 13:54:32 +0000 (+0200) Subject: Add KeepBothVersions as a possible solution to ConflictSolver X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~22^2~95^2~6 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=67e81fcd0f97e89752237ea5e030cf2b4dbbfa5f;p=nextcloud-desktop.git Add KeepBothVersions as a possible solution to ConflictSolver Signed-off-by: Kevin Ottens --- diff --git a/src/gui/conflictsolver.cpp b/src/gui/conflictsolver.cpp index 578d15a54..6a1de573c 100644 --- a/src/gui/conflictsolver.cpp +++ b/src/gui/conflictsolver.cpp @@ -17,6 +17,7 @@ #include #include +#include "common/utility.h" #include "filesystem.h" namespace OCC { @@ -46,6 +47,8 @@ bool ConflictSolver::exec(ConflictSolver::Solution solution) return overwriteRemoteVersion(); case KeepRemoteVersion: return deleteLocalVersion(); + case KeepBothVersions: + return renameLocalVersion(); } Q_UNREACHABLE(); return false; @@ -95,6 +98,44 @@ bool ConflictSolver::deleteLocalVersion() } } +bool ConflictSolver::renameLocalVersion() +{ + if (_localVersionFilename.isEmpty()) { + return false; + } + + QFileInfo info(_localVersionFilename); + if (!info.exists()) { + return false; + } + + const auto renamePattern = [=] { + auto result = QString::fromUtf8(OCC::Utility::conflictFileBaseNameFromPattern(_localVersionFilename.toUtf8())); + const auto dotIndex = result.lastIndexOf('.'); + return QString(result.left(dotIndex) + "_%1" + result.mid(dotIndex)); + }(); + + const auto targetFilename = [=] { + uint i = 1; + auto result = renamePattern.arg(i); + while (QFileInfo::exists(result)) { + Q_ASSERT(i > 0); + i++; + result = renamePattern.arg(i); + } + return result; + }(); + + QString error; + if (FileSystem::uncheckedRenameReplace(_localVersionFilename, targetFilename, &error)) { + return true; + } else { + qCWarning(lcConflict) << "Rename error:" << error; + QMessageBox::warning(_parentWidget, tr("Error"), tr("Moving file failed:\n\n%1").arg(error)); + return false; + } +} + bool ConflictSolver::overwriteRemoteVersion() { if (_localVersionFilename.isEmpty()) { diff --git a/src/gui/conflictsolver.h b/src/gui/conflictsolver.h index e31e6eb0a..caf4f2286 100644 --- a/src/gui/conflictsolver.h +++ b/src/gui/conflictsolver.h @@ -29,7 +29,8 @@ class ConflictSolver : public QObject public: enum Solution { KeepLocalVersion, - KeepRemoteVersion + KeepRemoteVersion, + KeepBothVersions }; explicit ConflictSolver(QWidget *parent = nullptr); @@ -49,6 +50,7 @@ signals: private: bool deleteLocalVersion(); + bool renameLocalVersion(); bool overwriteRemoteVersion(); QWidget *_parentWidget;