bool FGetStateLatentCommand::Update() { FSourceControlStatePtr SourceControlState = ISourceControlModule::Get().GetProvider().GetState(SourceControlHelpers::PackageFilename(Filename), EStateCacheUsage::Use); if(!SourceControlState.IsValid()) { UE_LOG(LogSourceControl, Error, TEXT("Failed to get a valid state for file: %s"), *Filename); } else { if(!SourceControlState->IsCheckedOut()) { UE_LOG(LogSourceControl, Error, TEXT("File '%s' should be checked out, but isnt."), *Filename); } else { if(SourceControlState->GetHistorySize() == 0) { UE_LOG(LogSourceControl, Error, TEXT("Failed to get a valid history for file: %s"), *Filename); } else { TSharedPtr<ISourceControlRevision, ESPMode::ThreadSafe> HistoryItem = SourceControlState->GetHistoryItem(0); if(!HistoryItem.IsValid()) { UE_LOG(LogSourceControl, Error, TEXT("Failed to get a valid history item 0 for file: %s"), *Filename); } } } } return true; }
bool FGetRevisionLatentCommand::Update() { // @todo: for the moment, getting revisions etc. is synchronous. FSourceControlStatePtr SourceControlState = ISourceControlModule::Get().GetProvider().GetState(SourceControlHelpers::PackageFilename(Filename), EStateCacheUsage::Use); if(!SourceControlState.IsValid()) { UE_LOG(LogSourceControl, Error, TEXT("Failed to get a valid state for file: %s"), *Filename); } else { if(SourceControlState->GetHistorySize() == 0) { UE_LOG(LogSourceControl, Error, TEXT("Failed to get a valid history for file: %s"), *Filename); } else { TSharedPtr<ISourceControlRevision, ESPMode::ThreadSafe> HistoryItem = SourceControlState->GetHistoryItem(0); if(!HistoryItem.IsValid()) { UE_LOG(LogSourceControl, Error, TEXT("Failed to get a valid history item 0 for file: %s"), *Filename); } else { FString TempGetFilename; HistoryItem->Get(TempGetFilename); if(TempGetFilename.Len() == 0 || !FPaths::FileExists(TempGetFilename)) { UE_LOG(LogSourceControl, Error, TEXT("Could not get revision of file '%s'"), *Filename); } } } } return true; }
void FLevelCollectionModel::SCCDiffAgainstDepot(const FLevelModelList& InList, UEditorEngine* InEditor) { // Load the asset registry module FAssetToolsModule& AssetToolsModule = FModuleManager::GetModuleChecked<FAssetToolsModule>("AssetTools"); ISourceControlProvider& SourceControlProvider = ISourceControlModule::Get().GetProvider(); // Iterate over each selected asset for (auto It = InList.CreateConstIterator(); It; ++It) { ULevel* Level = (*It)->GetLevelObject(); if (Level == NULL) { return; } UPackage* OriginalPackage = Level->GetOutermost(); FString PackageName = OriginalPackage->GetName(); // Make sure our history is up to date auto UpdateStatusOperation = ISourceControlOperation::Create<FUpdateStatus>(); UpdateStatusOperation->SetUpdateHistory(true); SourceControlProvider.Execute(UpdateStatusOperation, OriginalPackage); // Get the SCC state FSourceControlStatePtr SourceControlState = SourceControlProvider.GetState( OriginalPackage, EStateCacheUsage::Use ); // If the level is in SCC. if (SourceControlState.IsValid() && SourceControlState->IsSourceControlled()) { // Get the file name of package FString RelativeFileName; if(FPackageName::DoesPackageExist(PackageName, NULL, &RelativeFileName)) { if (SourceControlState->GetHistorySize() > 0) { auto Revision = SourceControlState->GetHistoryItem(0); check(Revision.IsValid()); // Get the head revision of this package from source control FString AbsoluteFileName = FPaths::ConvertRelativePathToFull(RelativeFileName); FString TempFileName; if (Revision->Get(TempFileName)) { // Forcibly disable compile on load in case we are loading old blueprints that might try to update/compile TGuardValue<bool> DisableCompileOnLoad(GForceDisableBlueprintCompileOnLoad, true); // Try and load that package FText NotMapReason; UPackage* OldPackage = LoadPackage(NULL, *TempFileName, LOAD_None); if(OldPackage != NULL && InEditor->PackageIsAMapFile(*TempFileName, NotMapReason)) { /* Set the revision information*/ UPackage* Package = OriginalPackage; FRevisionInfo OldRevision; OldRevision.Changelist = Revision->GetCheckInIdentifier(); OldRevision.Date = Revision->GetDate(); OldRevision.Revision = Revision->GetRevision(); FRevisionInfo NewRevision; NewRevision.Revision = TEXT(""); // Dump assets to temp text files FString OldTextFilename = AssetToolsModule.Get().DumpAssetToTempFile(OldPackage); FString NewTextFilename = AssetToolsModule.Get().DumpAssetToTempFile(OriginalPackage); FString DiffCommand = GetDefault<UEditorLoadingSavingSettings>()->TextDiffToolPath.FilePath; AssetToolsModule.Get().CreateDiffProcess(DiffCommand, OldTextFilename, NewTextFilename); AssetToolsModule.Get().DiffAssets(OldPackage, OriginalPackage, OldRevision, NewRevision); } } } } } } }
//------------------------------------------------------------------------------ void SBlueprintRevisionMenu::OnSourceControlQueryComplete(const FSourceControlOperationRef& InOperation, ECommandResult::Type InResult) { check(SourceControlQueryOp == InOperation); // Add pop-out menu for each revision FMenuBuilder MenuBuilder(/*bInShouldCloseWindowAfterMenuSelection =*/true, /*InCommandList =*/NULL); MenuBuilder.BeginSection("AddDiffRevision", LOCTEXT("Revisions", "Revisions")); if (bIncludeLocalRevision) { FText const ToolTip = LOCTEXT("LocalRevisionToolTip", "The current copy you have saved to disk (locally)"); FOnRevisionSelected OnRevisionSelectedDelegate = OnRevisionSelected; auto OnMenuItemSelected = [OnRevisionSelectedDelegate]() { OnRevisionSelectedDelegate.ExecuteIfBound(FRevisionInfo::InvalidRevision()); }; MenuBuilder.AddMenuEntry(LOCTEXT("LocalRevision", "Local"), ToolTip, FSlateIcon(), FUIAction(FExecuteAction::CreateLambda(OnMenuItemSelected))); } if (InResult == ECommandResult::Succeeded) { // get the cached state ISourceControlProvider& SourceControlProvider = ISourceControlModule::Get().GetProvider(); FSourceControlStatePtr SourceControlState = SourceControlProvider.GetState(Filename, EStateCacheUsage::Use); if (SourceControlState.IsValid() && SourceControlState->GetHistorySize() > 0) { // Figure out the highest revision # (so we can label it "Depot") int32 LatestRevision = 0; for (int32 HistoryIndex = 0; HistoryIndex < SourceControlState->GetHistorySize(); HistoryIndex++) { TSharedPtr<ISourceControlRevision, ESPMode::ThreadSafe> Revision = SourceControlState->GetHistoryItem(HistoryIndex); if (Revision.IsValid() && Revision->GetRevisionNumber() > LatestRevision) { LatestRevision = Revision->GetRevisionNumber(); } } for (int32 HistoryIndex = 0; HistoryIndex < SourceControlState->GetHistorySize(); HistoryIndex++) { TSharedPtr<ISourceControlRevision, ESPMode::ThreadSafe> Revision = SourceControlState->GetHistoryItem(HistoryIndex); if (Revision.IsValid()) { FInternationalization& I18N = FInternationalization::Get(); FText Label = FText::Format(LOCTEXT("RevisionNumber", "Revision {0}"), FText::AsNumber(Revision->GetRevisionNumber(), NULL, I18N.GetInvariantCulture())); FFormatNamedArguments Args; Args.Add(TEXT("CheckInNumber"), FText::AsNumber(Revision->GetCheckInIdentifier(), NULL, I18N.GetInvariantCulture())); Args.Add(TEXT("UserName"), FText::FromString(Revision->GetUserName())); Args.Add(TEXT("DateTime"), FText::AsDate(Revision->GetDate())); Args.Add(TEXT("ChanglistDescription"), FText::FromString(Revision->GetDescription())); const FText ToolTip = FText::Format(LOCTEXT("RevisionToolTip", "CL #{CheckInNumber} {UserName} \n{DateTime} \n{ChanglistDescription}"), Args); if (LatestRevision == Revision->GetRevisionNumber()) { Label = LOCTEXT("Depo", "Depot"); } FRevisionInfo RevisionInfo = { Revision->GetRevision(), Revision->GetCheckInIdentifier(), Revision->GetDate() }; FOnRevisionSelected OnRevisionSelectedDelegate = OnRevisionSelected; auto OnMenuItemSelected = [RevisionInfo, OnRevisionSelectedDelegate]() { OnRevisionSelectedDelegate.ExecuteIfBound(RevisionInfo); }; MenuBuilder.AddMenuEntry( TAttribute<FText>(Label), ToolTip, FSlateIcon(), FUIAction(FExecuteAction::CreateLambda(OnMenuItemSelected)) ); } } } else if (!bIncludeLocalRevision) { // Show 'empty' item in toolbar MenuBuilder.AddMenuEntry(LOCTEXT("NoRevisonHistory", "No revisions found"), FText(), FSlateIcon(), FUIAction()); } } else if (!bIncludeLocalRevision) { // Show 'empty' item in toolbar MenuBuilder.AddMenuEntry(LOCTEXT("NoRevisonHistory", "No revisions found"), FText(), FSlateIcon(), FUIAction()); } MenuBuilder.EndSection(); MenuBox->AddSlot() [ MenuBuilder.MakeWidget() ]; SourceControlQueryOp.Reset(); SourceControlQueryState = ESourceControlQueryState::Queried; }