96 lines
2.7 KiB
C++
96 lines
2.7 KiB
C++
// 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;
|
|
}
|