// 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 Tokens, Switches; TMap ParamsMap; ParseCommandLine(*Params, Tokens, Switches, ParamsMap); const bool bDryRun = Switches.Contains(TEXT("DryRun")); const TArray Packages = LPAssetList::Resolve(ParamsMap); if (Packages.Num() == 0) { UE_LOG(LogLPResave, Error, TEXT("Usage : -List= [-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 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; }