public void Run() { Generator = new ModelGen { SourceText = SourceText, SourceFilename = SourceFilename, GenerateEnum = GenerateEnum.GetValueOrDefault(true), GenerateLinq = GenerateLinq.GetValueOrDefault(true), GenerateProperties = GenerateProperties.GetValueOrDefault(true), RootNodeTypeName = RootNodeTypeName, Namespace = Namespace, }; if (OutputFilename == null) { Generator.OutputFilename = SourceFilename.ToFsPath().ChangeExtension(".generated.cs"); } if (Using != null) { Generator.Usings.AddRange(Using); } Generator.Run(); }
private static void DiffCookedContent(ProjectParams Params) { List <TargetPlatformDescriptor> PlatformsToCook = Params.ClientTargetPlatforms; string ProjectPath = Params.RawProjectPath.FullName; var CookedSandboxesPath = CombinePaths(GetDirectoryName(ProjectPath), "Saved", "Cooked"); for (int CookPlatformIndex = 0; CookPlatformIndex < PlatformsToCook.Count; ++CookPlatformIndex) { // temporary directory to save the pak file to (pak file is usually not local and on network drive) var TemporaryPakPath = CombinePaths(GetDirectoryName(ProjectPath), "Saved", "Temp", "LocalPKG"); // extracted files from pak file var TemporaryFilesPath = CombinePaths(GetDirectoryName(ProjectPath), "Saved", "Temp", "LocalFiles"); try { Directory.Delete(TemporaryPakPath, true); } catch (Exception Ex) { if (!(Ex is System.IO.DirectoryNotFoundException)) { Log("Failed deleting temporary directories " + TemporaryPakPath + " continuing. " + Ex.GetType().ToString()); } } try { Directory.Delete(TemporaryFilesPath, true); } catch (Exception Ex) { if (!(Ex is System.IO.DirectoryNotFoundException)) { Log("Failed deleting temporary directories " + TemporaryFilesPath + " continuing. " + Ex.GetType().ToString()); } } try { Directory.CreateDirectory(TemporaryPakPath); Directory.CreateDirectory(TemporaryFilesPath); Platform CurrentPlatform = Platform.Platforms[PlatformsToCook[CookPlatformIndex]]; string SourceCookedContentPath = Params.DiffCookedContentPath; List <string> PakFiles = new List <string>(); string CookPlatformString = CurrentPlatform.GetCookPlatform(false, Params.Client); if (Path.HasExtension(SourceCookedContentPath) && (!SourceCookedContentPath.EndsWith(".pak"))) { // must be a per platform pkg file try this CurrentPlatform.ExtractPackage(Params, Params.DiffCookedContentPath, TemporaryPakPath); // find the pak file PakFiles.AddRange(Directory.EnumerateFiles(TemporaryPakPath, Params.ShortProjectName + "*.pak", SearchOption.AllDirectories)); PakFiles.AddRange(Directory.EnumerateFiles(TemporaryPakPath, "pakchunk*.pak", SearchOption.AllDirectories)); } else if (!Path.HasExtension(SourceCookedContentPath)) { // try find the pak or pkg file string SourceCookedContentPlatformPath = CombinePaths(SourceCookedContentPath, CookPlatformString); foreach (var PakName in Directory.EnumerateFiles(SourceCookedContentPlatformPath, Params.ShortProjectName + "*.pak", SearchOption.AllDirectories)) { string TemporaryPakFilename = CombinePaths(TemporaryPakPath, Path.GetFileName(PakName)); File.Copy(PakName, TemporaryPakFilename); PakFiles.Add(TemporaryPakFilename); } foreach (var PakName in Directory.EnumerateFiles(SourceCookedContentPlatformPath, "pakchunk*.pak", SearchOption.AllDirectories)) { string TemporaryPakFilename = CombinePaths(TemporaryPakPath, Path.GetFileName(PakName)); File.Copy(PakName, TemporaryPakFilename); PakFiles.Add(TemporaryPakFilename); } if (PakFiles.Count <= 0) { Log("No Pak files found in " + SourceCookedContentPlatformPath + " :("); } } else if (SourceCookedContentPath.EndsWith(".pak")) { string TemporaryPakFilename = CombinePaths(TemporaryPakPath, Path.GetFileName(SourceCookedContentPath)); File.Copy(SourceCookedContentPath, TemporaryPakFilename); PakFiles.Add(TemporaryPakFilename); } string FullCookPath = CombinePaths(CookedSandboxesPath, CookPlatformString); var UnrealPakExe = CombinePaths(CmdEnv.LocalRoot, "Engine/Binaries/Win64/UnrealPak.exe"); foreach (var Name in PakFiles) { Log("Extracting pak " + Name + " for comparision to location " + TemporaryFilesPath); string UnrealPakParams = Name + " -Extract " + " " + TemporaryFilesPath; try { RunAndLog(CmdEnv, UnrealPakExe, UnrealPakParams, Options: ERunOptions.Default | ERunOptions.UTF8Output | ERunOptions.LoggingOfRunDuration); } catch (Exception Ex) { Log("Pak failed to extract because of " + Ex.GetType().ToString()); } } const string RootFailedContentDirectory = "\\\\epicgames.net\\root\\Developers\\Daniel.Lamb"; string FailedContentDirectory = CombinePaths(RootFailedContentDirectory, CommandUtils.P4Env.BuildRootP4 + CommandUtils.P4Env.ChangelistString, Params.ShortProjectName, CookPlatformString); Directory.CreateDirectory(FailedContentDirectory); // diff the content List <FileInfo> FileReport = new List <FileInfo>(); List <string> AllFiles = Directory.EnumerateFiles(FullCookPath, "*.uasset", System.IO.SearchOption.AllDirectories).ToList(); AllFiles.AddRange(Directory.EnumerateFiles(FullCookPath, "*.umap", System.IO.SearchOption.AllDirectories).ToList()); foreach (string SourceFilename in AllFiles) { // Filename.StartsWith( CookedSandboxesPath ); string RelativeFilename = SourceFilename.Remove(0, FullCookPath.Length); string DestFilename = TemporaryFilesPath + RelativeFilename; Log("Comparing file " + RelativeFilename); byte[] SourceFile = null; try { SourceFile = File.ReadAllBytes(SourceFilename); } catch (Exception) { Log("Diff cooked content failed to load file " + SourceFilename); } byte[] DestFile = null; try { DestFile = File.ReadAllBytes(DestFilename); } catch (Exception) { Log("Diff cooked content failed to load file " + DestFilename); } if (SourceFile == null || DestFile == null) { Log("Diff cooked content failed on file " + SourceFilename + " when comparing against " + DestFilename + " " + (SourceFile == null?SourceFilename:DestFilename) + " file is missing"); } else if (SourceFile.LongLength == DestFile.LongLength) { /*long FirstByteFailed = -1; * long BytesFailed = 0;*/ FileInfo DiffFileInfo = new FileInfo(SourceFilename); DiffFileInfo.File1Size = DiffFileInfo.File2Size = SourceFile.LongLength; bool bFailedDiff = false; for (long Index = 0; Index < SourceFile.LongLength; ++Index) { if (SourceFile[Index] != DestFile[Index]) { if (DiffFileInfo.FirstByteFailed == -1) { DiffFileInfo.FirstByteFailed = Index; } DiffFileInfo.BytesMismatch += 1; if (bFailedDiff == false) { bFailedDiff = true; Log("Diff cooked content failed on file " + SourceFilename + " when comparing against " + DestFilename + " at offset " + Index.ToString()); string SavedSourceFilename = CombinePaths(FailedContentDirectory, Path.GetFileName(SourceFilename) + "Source"); string SavedDestFilename = CombinePaths(FailedContentDirectory, Path.GetFileName(DestFilename) + "Dest"); Log("Creating directory " + Path.GetDirectoryName(SavedSourceFilename)); try { Directory.CreateDirectory(Path.GetDirectoryName(SavedSourceFilename)); } catch (Exception E) { Log("Failed to create directory " + Path.GetDirectoryName(SavedSourceFilename) + " Exception " + E.ToString()); } Log("Creating directory " + Path.GetDirectoryName(SavedDestFilename)); try { Directory.CreateDirectory(Path.GetDirectoryName(SavedDestFilename)); } catch (Exception E) { Log("Failed to create directory " + Path.GetDirectoryName(SavedDestFilename) + " Exception " + E.ToString()); } File.Copy(SourceFilename, SavedSourceFilename, true); File.Copy(DestFilename, SavedDestFilename, true); Log("Content temporarily saved to " + SavedSourceFilename + " and " + SavedDestFilename + " at offset " + Index.ToString()); } // break; } } if (!bFailedDiff) { Log("Content matches for " + SourceFilename + " and " + DestFilename); } else { FileReport.Add(DiffFileInfo); } } else { Log("Diff cooked content failed on file " + SourceFilename + " when comparing against " + DestFilename + " files are different sizes " + SourceFile.LongLength.ToString() + " " + DestFile.LongLength.ToString()); FileInfo DiffFileInfo = new FileInfo(SourceFilename); DiffFileInfo.File1Size = SourceFile.LongLength; DiffFileInfo.File2Size = DestFile.LongLength; FileReport.Add(DiffFileInfo); } } Log("Mismatching files:"); foreach (var Report in FileReport) { if (Report.FirstByteFailed == -1) { Log("File " + Report.Filename + " size mismatch: " + Report.File1Size + " VS " + Report.File2Size); } else { Log("File " + Report.Filename + " bytes mismatch: " + Report.BytesMismatch + " first byte failed at: " + Report.FirstByteFailed + " file size: " + Report.File1Size); } } } catch (Exception Ex) { Log("Exception " + Ex.ToString()); continue; } } }