Quellcode durchsuchen

Fixes #5 Add remove files containing conflicts

isundil vor 9 Monaten
Ursprung
Commit
5044993fd5
4 geänderte Dateien mit 59 neuen und 5 gelöschten Zeilen
  1. 15 0
      Engine/Engine.cpp
  2. 3 0
      Engine/IEngine.h
  3. 32 4
      fakeRaid/conflictModal.cpp
  4. 9 1
      fakeRaid/conflictModal.h

+ 15 - 0
Engine/Engine.cpp

@@ -21,6 +21,9 @@ namespace craftlab::fakeraid
 		FileAndSumListByRepositoryIndex ListFiles() override;
 		void Cd(const std::string& dirName) override;
 
+		void RemoveFiles(const std::vector<std::string>& paths) const override;
+		void RemoveDirs(const std::vector<std::string>& paths) const override;
+
 	private:
 		FileAndSumList ListFiles(const std::string& root, int repositoryIndex);
 		std::string BuildCurrentDirPath(const std::string& root ="") const;
@@ -156,6 +159,18 @@ void Engine::DirExistsOrThrow() const
 	}
 }
 
+void Engine::RemoveFiles(const std::vector<std::string>& paths) const
+{
+	for (const std::string& path: paths)
+		std::filesystem::remove(path);
+}
+
+void Engine::RemoveDirs(const std::vector<std::string>& paths) const
+{
+	for (const std::string& path : paths)
+		std::filesystem::remove_all(path);
+}
+
 IEngine* EngineManager::Open(const std::vector<std::string>& path)
 {
 	return new Engine(path);

+ 3 - 0
Engine/IEngine.h

@@ -18,6 +18,9 @@ namespace craftlab::fakeraid
 		virtual bool SetWorkingDirectory(const std::vector<std::string>& path) =0;
 		virtual FileAndSumListByRepositoryIndex ListFiles() =0;
 		virtual void Cd(const std::string& dirName) =0;
+
+		virtual void RemoveFiles(const std::vector<std::string>& paths) const = 0;
+		virtual void RemoveDirs(const std::vector<std::string>& paths) const = 0;
 	};
 
 	class ENGINEAPI_EXPORT EngineManager

+ 32 - 4
fakeRaid/conflictModal.cpp

@@ -1,5 +1,6 @@
 #include <QListWidgetItem>
 #include <QMessageBox>
+#include <QDir>
 #include "ui_ConflictModal.h"
 #include "conflictModal.h"
 #include "ConflictItemWidget.h"
@@ -7,7 +8,9 @@
 
 using namespace craftlab::fakeraid;
 
-ConflictModal::ConflictModal(const std::vector<std::string>& rootPaths, const DiffResult& _diffResult): diffResult(std::make_unique<DiffResult>(_diffResult)), ui(std::make_unique<Ui_ConflictModal>())
+std::string mergePath(const std::string& a, const QChar& separator, const std::string& b);
+
+ConflictModal::ConflictModal(const std::vector<std::string>& _rootPaths, const DiffResult& _diffResult): rootPaths(_rootPaths), diffResult(std::make_unique<DiffResult>(_diffResult)), ui(std::make_unique<Ui_ConflictModal>())
 {
 	ui->setupUi(this);
 
@@ -59,9 +62,10 @@ void ConflictModal::UpdateProcessButtonStatus()
 	ui->buttonProcess->setEnabled(!pending);
 }
 
-DiffResult ConflictModal::ComputeOutcome() const
+DiffResult ConflictModal::ComputeOutcome(const std::vector<std::string>& rootPaths)
 {
 	DiffResult result;
+
 	result.correctFiles = diffResult->correctFiles;
 	result.FileList = diffResult->FileList;
 	for (const ConflictItemWidget* i : conflicts)
@@ -70,7 +74,26 @@ DiffResult ConflictModal::ComputeOutcome() const
 		if (i->GetAction() == ConflictItemWidget::Action::Copy || i->GetAction() == ConflictItemWidget::Action::UseVersion)
 			result.correctFiles.push_back(originalFile);
 		else if (i->GetAction() == ConflictItemWidget::Action::Remove)
-			;
+		{
+			if (diffResult->differentFiles.find(originalFile.fileName) != diffResult->differentFiles.end())
+			{
+				for (int i = 0; i < diffResult->differentFiles[originalFile.fileName].size(); ++i)
+					if (diffResult->differentFiles[originalFile.fileName][i] > 0)
+						processItems.filesToRemove.push_back(mergePath(rootPaths[i], QDir::separator(), originalFile.fileName));
+			}
+			else if (diffResult->missingFiles.find(originalFile.fileName) != diffResult->missingFiles.end())
+			{
+				for (int i = 0; i < diffResult->missingFiles[originalFile.fileName].size(); ++i)
+					if (!diffResult->missingFiles[originalFile.fileName][i])
+						processItems.filesToRemove.push_back(mergePath(rootPaths[i], QDir::separator(), originalFile.fileName));
+			}
+			else if (diffResult->missingDirs.find(originalFile.fileName) != diffResult->missingDirs.end())
+			{
+				for (int i = 0; i < diffResult->missingDirs[originalFile.fileName].size(); ++i)
+					if (!diffResult->missingDirs[originalFile.fileName][i])
+						processItems.dirsToRemove.push_back(mergePath(rootPaths[i], QDir::separator(), originalFile.fileName));
+			}
+		}
 		else if (i->GetAction() == ConflictItemWidget::Action::Ignore ||
 			i->GetAction() == ConflictItemWidget::Action::Undefined)
 		{
@@ -97,5 +120,10 @@ DiffResult ConflictModal::Display(const IEngine& engine, const DiffResult& diffR
 {
 	ConflictModal dialog(engine.GetRootPaths(), diffResult);
 	dialog.exec();
-	return dialog.ComputeOutcome();
+	const auto result = dialog.ComputeOutcome(engine.GetPaths());
+
+	engine.RemoveFiles(dialog.processItems.filesToRemove);
+	engine.RemoveDirs(dialog.processItems.dirsToRemove);
+
+	return result;
 }

+ 9 - 1
fakeRaid/conflictModal.h

@@ -17,7 +17,7 @@ namespace craftlab::fakeraid
 		~ConflictModal();
 
 		static DiffResult Display(const IEngine& engine, const DiffResult& diffResult);
-		DiffResult ComputeOutcome() const;
+		DiffResult ComputeOutcome(const std::vector<std::string>& rootPaths);
 
 		void reject() override;
 
@@ -34,6 +34,14 @@ namespace craftlab::fakeraid
 
 		void AddConflictingFile(ConflictItemWidget* widget);
 
+		struct ProcessItems
+		{
+			std::vector<std::string> filesToRemove;
+			std::vector<std::string> dirsToRemove;
+		};
+
+		ProcessItems processItems;
+		const std::vector<std::string> rootPaths;
 		std::vector<ConflictItemWidget*> conflicts;
 		std::unique_ptr<DiffResult> diffResult;
 		std::unique_ptr<Ui_ConflictModal> ui;