From 67e81fcd0f97e89752237ea5e030cf2b4dbbfa5f Mon Sep 17 00:00:00 2001 From: Kevin Ottens Date: Thu, 8 Oct 2020 15:54:32 +0200 Subject: [PATCH] Add KeepBothVersions as a possible solution to ConflictSolver Signed-off-by: Kevin Ottens --- src/gui/conflictsolver.cpp | 41 ++++++++++++++++++++++++++++++++++++++ src/gui/conflictsolver.h | 4 +++- 2 files changed, 44 insertions(+), 1 deletion(-) 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; -- 2.30.2