LifePlay-Revival/Source/LifePlayEditorTools/LPResavePackagesCommandlet.cpp

97 lines
2.7 KiB
C++
Raw Permalink Normal View History

// Voir LPResavePackagesCommandlet.h
#include "LPResavePackagesCommandlet.h"
#include "Engine/World.h"
#include "LPAssetListUtils.h"
#include "Misc/PackageName.h"
#include "UObject/Package.h"
#include "UObject/SavePackage.h"
DEFINE_LOG_CATEGORY_STATIC(LogLPResave, Log, All);
ULPResavePackagesCommandlet::ULPResavePackagesCommandlet()
{
IsClient = false;
IsServer = false;
IsEditor = true;
LogToConsole = true;
}
int32 ULPResavePackagesCommandlet::Main(const FString& Params)
{
TArray<FString> Tokens, Switches;
TMap<FString, FString> ParamsMap;
ParseCommandLine(*Params, Tokens, Switches, ParamsMap);
const bool bDryRun = Switches.Contains(TEXT("DryRun"));
const TArray<FString> Packages = LPAssetList::Resolve(ParamsMap);
if (Packages.Num() == 0)
{
UE_LOG(LogLPResave, Error, TEXT("Usage : -List=<fichier> [-DryRun]"));
return 1;
}
UE_LOG(LogLPResave, Warning, TEXT("=== Reenregistrement de %d paquet(s)%s ==="), Packages.Num(), bDryRun ? TEXT(" [DRY RUN]") : TEXT(""));
// Tout charger avant de sauvegarder : un paquet de la liste peut en importer un autre.
TArray<UPackage*> Loaded;
int32 LoadFailures = 0;
for (const FString& Name : Packages)
{
UPackage* Package = LoadPackage(nullptr, *Name, LOAD_None);
if (!Package)
{
++LoadFailures;
UE_LOG(LogLPResave, Error, TEXT(" chargement impossible : %s"), *Name);
}
Loaded.Add(Package);
}
if (LoadFailures > 0)
{
UE_LOG(LogLPResave, Error, TEXT("=== %d echec(s) de chargement : rien n'est sauvegarde. ==="), LoadFailures);
return 1;
}
int32 Saved = 0;
int32 SaveFailures = 0;
for (UPackage* Package : Loaded)
{
FString Filename;
if (!FPackageName::DoesPackageExist(Package->GetName(), &Filename))
{
++SaveFailures;
UE_LOG(LogLPResave, Error, TEXT(" fichier introuvable pour %s"), *Package->GetName());
continue;
}
UE_LOG(LogLPResave, Warning, TEXT(" %s -> %s"), *Package->GetName(), *Filename);
if (bDryRun)
{
continue;
}
UWorld* World = UWorld::FindWorldInPackage(Package);
ResetLoaders(Package);
FSavePackageArgs SaveArgs;
SaveArgs.TopLevelFlags = World ? RF_NoFlags : (RF_Public | RF_Standalone);
SaveArgs.SaveFlags = SAVE_None;
SaveArgs.bWarnOfLongFilename = true;
// GWarn et non GError : en commandlet, GError rend toute erreur de save fatale.
SaveArgs.Error = GWarn;
if (UPackage::SavePackage(Package, World, *Filename, SaveArgs))
{
++Saved;
}
else
{
++SaveFailures;
UE_LOG(LogLPResave, Error, TEXT(" ECHEC de sauvegarde de %s"), *Package->GetName());
}
}
UE_LOG(LogLPResave, Warning, TEXT("=== Termine : %d paquet(s), %d sauvegarde(s), %d echec(s) de sauvegarde%s. ==="),
Packages.Num(), Saved, SaveFailures, bDryRun ? TEXT(" [DRY RUN]") : TEXT(""));
return SaveFailures > 0 ? 1 : 0;
}