Files
UnrealEngine/Engine/Source/Developer/SourceControl/Public/ISourceControlState.h
2025-05-18 13:04:45 +08:00

259 lines
8.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#if SOURCE_CONTROL_WITH_SLATE
#include "Textures/SlateIcon.h"
#endif //SOURCE_CONTROL_WITH_SLATE
class ISourceControlRevision;
class ISourceControlState;
typedef TSharedRef<class ISourceControlState, ESPMode::ThreadSafe> FSourceControlStateRef;
typedef TSharedPtr<class ISourceControlState, ESPMode::ThreadSafe> FSourceControlStatePtr;
class ISourceControlChangelist;
typedef TSharedRef<class ISourceControlChangelist, ESPMode::ThreadSafe> FSourceControlChangelistRef;
typedef TSharedPtr<class ISourceControlChangelist, ESPMode::ThreadSafe> FSourceControlChangelistPtr;
/**
* An abstraction of the state of a file under source control
*/
class ISourceControlState : public TSharedFromThis<ISourceControlState, ESPMode::ThreadSafe>
{
public:
enum { INVALID_REVISION = -1 };
struct FResolveInfo
{
FString RemoteFile;
FString BaseFile;
FString RemoteRevision;
FString BaseRevision;
bool IsValid() const
{
return !RemoteRevision.IsEmpty() && !RemoteFile.IsEmpty();
}
operator bool() const
{
return IsValid();
}
};
/**
* Virtual destructor
*/
virtual ~ISourceControlState() {}
/**
* Get the size of the history.
* If an FUpdateStatus operation has been called with the ShouldUpdateHistory() set, there
* should be history present if the file has been committed to source control.
* @returns the number of items in the history
*/
virtual int32 GetHistorySize() const = 0;
/**
* Get an item from the history
* @param HistoryIndex the index of the history item
* @returns a history item or NULL if none exist
*/
virtual TSharedPtr<class ISourceControlRevision, ESPMode::ThreadSafe> GetHistoryItem( int32 HistoryIndex ) const = 0;
/**
* Find an item from the history with the specified revision number.
* @param RevisionNumber the revision number to look for
* @returns a history item or NULL if the item could not be found
*/
virtual TSharedPtr<class ISourceControlRevision, ESPMode::ThreadSafe> FindHistoryRevision( int32 RevisionNumber ) const = 0;
/**
* Find an item from the history with the specified revision.
* @param InRevision the revision identifier to look for
* @returns a history item or NULL if the item could not be found
*/
virtual TSharedPtr<class ISourceControlRevision, ESPMode::ThreadSafe> FindHistoryRevision( const FString& InRevision ) const = 0;
/**
* Get the revision that we should use as a base when performing a three way merge, does not refresh source control state
* @returns a revision identifier or NULL if none exist
*/
UE_DEPRECATED(5.3, "Use GetResolveInfo() and FindHistoryRevision() instead")
virtual TSharedPtr<class ISourceControlRevision, ESPMode::ThreadSafe> GetBaseRevForMerge() const final { return FindHistoryRevision(GetResolveInfo().BaseRevision); }
/**
* Get the file and revision number of the base and remote assets considered in a merge resolve
* @returns a valid FResolveInfo if the asset is being resolved, otherwise FResolveInfo::IsValid() will return false
*/
virtual FResolveInfo GetResolveInfo() const {return {};}
/**
* Get the revision that we are currently synced to
* @returns a revision identifier or NULL if none exist
*/
virtual TSharedPtr<class ISourceControlRevision, ESPMode::ThreadSafe> GetCurrentRevision() const = 0;
#if SOURCE_CONTROL_WITH_SLATE
/**
* Gets the icon we should use to display the state in a UI.
*/
virtual FSlateIcon GetIcon() const = 0;
#endif // SOURCE_CONTROL_WITH_SLATE
/**
* Get the name of the icon graphic we should use to display the state in a UI.
* @returns the name of the icon to display
*/
UE_DEPRECATED(5.0, "GetIconName has been replaced by GetIcon.")
virtual FName GetIconName() const { return NAME_None; }
/**
* Get the name of the small icon graphic we should use to display the state in a UI.
* @returns the name of the icon to display
*/
UE_DEPRECATED(5.0, "GetSmallIconName has been replaced by GetIcon.")
virtual FName GetSmallIconName() const { return NAME_None; }
/**
* Get a text representation of the state
* @returns the text to display for this state
*/
virtual FText GetDisplayName() const = 0;
/**
* Get a tooltip to describe this state
* @returns the text to display for this states tooltip
*/
virtual FText GetDisplayTooltip() const = 0;
/**
* Get the local filename that this state represents
* @returns the filename
*/
virtual const FString& GetFilename() const = 0;
/**
* Get the timestamp of the last update that was made to this state.
* @returns the timestamp of the last update
*/
virtual const FDateTime& GetTimeStamp() const = 0;
/** Get whether this file can be checked in. */
virtual bool CanCheckIn() const = 0;
/** Get whether this file can be checked out */
virtual bool CanCheckout() const = 0;
/** Get whether this file is checked out by the current user*/
virtual bool IsCheckedOut() const = 0;
/** Get whether this file is checked out by someone else in the current branch */
virtual bool IsCheckedOutOther(FString* Who = NULL) const = 0;
/** Get whether this file is checked out in a different branch, if no branch is specified defaults to FEngineVerion current branch */
virtual bool IsCheckedOutInOtherBranch(const FString& CurrentBranch = FString()) const = 0;
/** Get whether this file is modified in a different branch, if no branch is specified defaults to FEngineVerion current branch */
virtual bool IsModifiedInOtherBranch(const FString& CurrentBranch = FString()) const = 0;
/** Get whether this file is checked out or modified in a different branch, if no branch is specified defaults to FEngineVerion current branch */
virtual bool IsCheckedOutOrModifiedInOtherBranch(const FString& CurrentBranch = FString()) const = 0;
/** Get the other branches this file is checked out in */
virtual TArray<FString> GetCheckedOutBranches() const = 0;
/** Get the user info for checkouts on other branches */
virtual FString GetOtherUserBranchCheckedOuts() const = 0;
/** Get head modification information for other branches
* @returns true with parameters populated if there is a branch with a newer modification (edit/delete/etc)
*/
virtual bool GetOtherBranchHeadModification(FString& HeadBranchOut, FString& ActionOut, int32& HeadChangeListOut) const = 0;
virtual FSourceControlChangelistPtr GetCheckInIdentifier() const;
/** Get whether this file is up-to-date with the version in source control */
virtual bool IsCurrent() const = 0;
/** Get whether this file is under source control */
virtual bool IsSourceControlled() const = 0;
/** Get whether this file is local to the current user (ie, has never been pushed to anyone else) */
virtual bool IsLocal() const
{
return IsAdded() || !IsSourceControlled() || IsIgnored();
}
/** Get whether this file is marked for add */
virtual bool IsAdded() const = 0;
/** Get whether this file is marked for delete */
virtual bool IsDeleted() const = 0;
/** Get whether this file is ignored by source control */
virtual bool IsIgnored() const = 0;
/** Get whether source control allows this file to be edited */
virtual bool CanEdit() const = 0;
/** Get whether source control allows this file to be deleted. */
virtual bool CanDelete() const = 0;
/** Get whether we know anything about this files source control state */
virtual bool IsUnknown() const = 0;
/** Get whether this file is modified compared to the version we have from source control */
virtual bool IsModified() const = 0;
/**
* Get whether this file can be added to source control (i.e. is part of the directory
* structure currently under source control)
*/
virtual bool CanAdd() const = 0;
/** Get whether this file is in a conflicted state */
virtual bool IsConflicted() const
{
return GetResolveInfo().IsValid();
}
/** Get whether this file can be reverted, i.e. its changes are discarded and the file will no longer be checked-out. */
virtual bool CanRevert() const = 0;
/** Gets the warnings messages associated with this state, if any. Ex 'checkout by other', 'out of date', etc). */
virtual TOptional<FText> GetWarningText() const
{
TOptional<FText> WarningText;
if (IsConflicted() ||
!IsCurrent() ||
IsCheckedOutOther() ||
(!IsCheckedOut() && (IsCheckedOutInOtherBranch() || IsModifiedInOtherBranch())))
{
WarningText.Emplace(GetDisplayTooltip()); // The tooltip text usually describe well enough the warning.
}
return WarningText;
}
/** Gets the status message associated with this state, if any. This is a superset of the GetWarningText that also includes IsCheckedOut. */
virtual TOptional<FText> GetStatusText() const
{
TOptional<FText> StatusText = GetWarningText();
if (!StatusText.IsSet() && IsCheckedOut())
{
StatusText.Emplace(GetDisplayTooltip());
}
return StatusText;
}
};
inline FSourceControlChangelistPtr ISourceControlState::GetCheckInIdentifier() const
{
return {};
}