2025-04-14 14:47:22 +03:00

83 lines
2.6 KiB
C++

// 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<class ISourceControlOperation, ESPMode::ThreadSafe>& InOperation, const TSharedRef<class IGitSourceControlWorker, ESPMode::ThreadSafe>& 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<FString>& 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;
}