#include <QFileDialog>
#include <QMessageBox>
+#include "common/utility.h"
#include "filesystem.h"
namespace OCC {
return overwriteRemoteVersion();
case KeepRemoteVersion:
return deleteLocalVersion();
+ case KeepBothVersions:
+ return renameLocalVersion();
}
Q_UNREACHABLE();
return false;
}
}
+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()) {
public:
enum Solution {
KeepLocalVersion,
- KeepRemoteVersion
+ KeepRemoteVersion,
+ KeepBothVersions
};
explicit ConflictSolver(QWidget *parent = nullptr);
private:
bool deleteLocalVersion();
+ bool renameLocalVersion();
bool overwriteRemoteVersion();
QWidget *_parentWidget;