// Copyright (c) 2014-2023 Sebastien Rombauts (sebastien.rombauts@gmail.com) // // Distributed under the MIT License (MIT) (See accompanying file LICENSE.txt // or copy at http://opensource.org/licenses/MIT) #include "GitSourceControlCommand.h" #include "Modules/ModuleManager.h" #include "GitSourceControlModule.h" #include "GitSourceControlUtils.h" FGitSourceControlCommand::FGitSourceControlCommand(const TSharedRef& InOperation, const TSharedRef& InWorker, const FSourceControlOperationComplete& InOperationCompleteDelegate) : Operation(InOperation) , Worker(InWorker) , OperationCompleteDelegate(InOperationCompleteDelegate) , bExecuteProcessed(0) , bCancelled(0) , bCommandSuccessful(false) , bAutoDelete(true) , Concurrency(EConcurrency::Synchronous) { // cache the providers settings here const FGitSourceControlModule& GitSourceControl = FGitSourceControlModule::Get(); const FGitSourceControlProvider& Provider = GitSourceControl.GetProvider(); PathToGitBinary = Provider.GetGitBinaryPath(); bUsingGitLfsLocking = Provider.UsesCheckout(); PathToRepositoryRoot = Provider.GetPathToRepositoryRoot(); PathToGitRoot = Provider.GetPathToGitRoot(); } void FGitSourceControlCommand::UpdateRepositoryRootIfSubmodule(const TArray& AbsoluteFilePaths) { PathToRepositoryRoot = GitSourceControlUtils::ChangeRepositoryRootIfSubmodule(AbsoluteFilePaths, PathToRepositoryRoot); } bool FGitSourceControlCommand::DoWork() { bCommandSuccessful = Worker->Execute(*this); FPlatformAtomics::InterlockedExchange(&bExecuteProcessed, 1); return bCommandSuccessful; } void FGitSourceControlCommand::Abandon() { FPlatformAtomics::InterlockedExchange(&bExecuteProcessed, 1); } void FGitSourceControlCommand::DoThreadedWork() { Concurrency = EConcurrency::Asynchronous; DoWork(); } void FGitSourceControlCommand::Cancel() { FPlatformAtomics::InterlockedExchange(&bCancelled, 1); } bool FGitSourceControlCommand::IsCanceled() const { return bCancelled != 0; } ECommandResult::Type FGitSourceControlCommand::ReturnResults() { // Save any messages that have accumulated for (const auto& String : ResultInfo.InfoMessages) { Operation->AddInfoMessge(FText::FromString(String)); } for (const auto& String : ResultInfo.ErrorMessages) { Operation->AddErrorMessge(FText::FromString(String)); } // run the completion delegate if we have one bound ECommandResult::Type Result = bCancelled ? ECommandResult::Cancelled : (bCommandSuccessful ? ECommandResult::Succeeded : ECommandResult::Failed); OperationCompleteDelegate.ExecuteIfBound(Operation, Result); return Result; }