Files
UnrealEngineUWP/Engine/Source/Programs/AutomationTool/Scripts/CodeSurgery.Automation.cs
Peter Sauerbrei dc1d815f84 refactored the logging system for UAT/UBT to be more like UE4
we now use an enum similar to UE4 with Fatal, Error, Warning, Display, Log, Verbose, and VeryVerbose
Log will only go to the log file unless -verbose is passed on the command line
reduced some of the output from UAT to be Log only

[CL 2631062 by Peter Sauerbrei in Main branch]
2015-07-23 14:51:46 -04:00

440 lines
12 KiB
C#

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using AutomationTool;
using UnrealBuildTool;
[Help("custom code to restructure C++ source code for the new stats system.")]
class CodeSurgery : BuildCommand
{
public override void ExecuteBuild()
{
LogConsole("************************* Reworking stats code");
var Wildcards = new List<string>() { "*.h", "*.cpp", "*.inl" };
// @todo: Add support for STATCAT_
var DeclareStrings = new List<string>() { "DECLARE_CYCLE_STAT", "DECLARE_FLOAT_COUNTER_STAT", "DECLARE_DWORD_COUNTER_STAT", "DECLARE_FLOAT_ACCUMULATOR_STAT", "DECLARE_DWORD_ACCUMULATOR_STAT", "DECLARE_MEMORY_STAT", "DECLARE_MEMORY_STAT_POOL", "DECLARE_STATS_GROUP" };
DirectoryInfo DirInfo = new DirectoryInfo(CmdEnv.LocalRoot);
var TopLevelDirs = DirInfo.GetDirectories();
var Dirs = new List<string>();
foreach (var TopLevelDir in TopLevelDirs)
{
if (DirectoryExists_NoExceptions(CombinePaths(TopLevelDir.FullName, "Source")))
{
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Source"));
}
}
var AllFiles = new List<string>();
foreach (var Dir in Dirs)
{
foreach (var Wildcard in Wildcards)
{
foreach (var ThisFile in CommandUtils.FindFiles_NoExceptions(Wildcard, true, Dir))
{
if (
!ThisFile.Contains(@"Runtime\Core\Public\Stats\Stats2") &&
!ThisFile.Contains(@"\ThirdParty\")
)
{
LogConsole("Source File: {0}", ThisFile);
AllFiles.Add(ThisFile);
}
}
}
}
var DeclareFiles = new Dictionary<string, string>();
var DeclareLines = new Dictionary<string, string>();
var EnumFiles = new Dictionary<string, string>();
var EnumLines = new Dictionary<string, string>();
var Broken = new Dictionary<string, string>();
foreach (var ThisFile in AllFiles)
{
var FileText = ReadAllText(ThisFile);
if (FileText.Contains("STAT_") || FileText.Contains("STATGROUP_"))
{
var Lines = ReadAllLines(ThisFile);
foreach (var LineWithWS in Lines)
{
var Line = LineWithWS.Trim();
if (Line.Contains("STAT_") || Line.Contains("STATGROUP_"))
{
string TypeString = "STAT_";
if (!Line.Contains(TypeString) || Line.Contains("DECLARE_STATS_GROUP"))
{
TypeString = "STATGROUP_";
}
bool bDeclareLine = false;
foreach (var DeclareString in DeclareStrings)
{
if (Line.Contains(DeclareString))
{
bDeclareLine = true;
break;
}
}
var Cut = Line;
string Exception = "DECLARE_MEMORY_STAT_POOL";
if (Line.StartsWith(Exception))
{
Cut = Line.Substring(Exception.Length);
}
Cut = Cut.Substring(Cut.IndexOf(TypeString));
int End = Cut.IndexOf(",");
if (End < 0)
{
End = Cut.Length;
}
int EndEq = Cut.IndexOf("=");
int EndParen = Cut.IndexOf(")");
int EndParen2 = Cut.IndexOf("(");
if (EndEq > 0 && EndEq < End)
{
End = EndEq;
}
if (EndParen > 0 && EndParen < End)
{
End = EndParen;
}
if (EndParen2 > 0 && EndParen2 < End)
{
End = EndParen2;
}
string StatName = Cut.Substring(0, End).Trim();
bool bEnumLine = false;
if (!bDeclareLine)
{
if ((Line.EndsWith(",") || Line == StatName) && Line.StartsWith(TypeString))
{
bEnumLine = true;
}
}
if (bEnumLine || bDeclareLine)
{
LogConsole("{0} {1} Line: {2} : {3}", bEnumLine ? "Enum" : "Declare", TypeString, StatName, Line);
if (bEnumLine)
{
if (EnumFiles.ContainsKey(StatName))
{
if (!Broken.ContainsKey(StatName))
{
Broken.Add(StatName, Line);
}
}
else
{
EnumFiles.Add(StatName, ThisFile);
EnumLines.Add(StatName, Line);
}
}
else
{
if (DeclareFiles.ContainsKey(StatName))
{
if (!Broken.ContainsKey(StatName))
{
Broken.Add(StatName, Line);
}
}
else
{
DeclareFiles.Add(StatName, ThisFile);
DeclareLines.Add(StatName, Line);
}
}
}
}
}
}
}
var AllGoodStats = new List<string>();
var AllGoodGroups = new List<string>();
foreach (var DeclareLine in DeclareLines)
{
if (!Broken.ContainsKey(DeclareLine.Key))
{
if (EnumFiles.ContainsKey(DeclareLine.Key))
{
if (DeclareLine.Key.StartsWith("STATGROUP_"))
{
AllGoodGroups.Add(DeclareLine.Key);
}
else
{
AllGoodStats.Add(DeclareLine.Key);
}
}
else
{
Broken.Add(DeclareLine.Key, DeclareLine.Value);
}
}
}
var ToCheckOuts = new HashSet<string>();
LogConsole("Stats *************************");
foreach (var AllGoodStat in AllGoodStats)
{
LogConsole("{0}", AllGoodStat);
ToCheckOuts.Add(DeclareFiles[AllGoodStat]);
ToCheckOuts.Add(EnumFiles[AllGoodStat]);
}
LogConsole("Groups *************************");
foreach (var AllGoodGroup in AllGoodGroups)
{
LogConsole("{0}", AllGoodGroup);
ToCheckOuts.Add(DeclareFiles[AllGoodGroup]);
ToCheckOuts.Add(EnumFiles[AllGoodGroup]);
}
LogConsole("Broken *************************");
foreach (var BrokenItem in Broken)
{
LogConsole("{0}", BrokenItem.Key);
}
LogConsole("*************************");
int WorkingCL = -1;
if (P4Enabled)
{
WorkingCL = P4.CreateChange(P4Env.Client, "Stat code surgery");
LogConsole("Working in {0}", WorkingCL);
}
else
{
throw new AutomationException("this command needs to run with P4.");
}
var CheckedOuts = new HashSet<string>();
foreach (var ToCheckOut in ToCheckOuts)
{
if (P4.Edit_NoExceptions(WorkingCL, ToCheckOut))
{
CheckedOuts.Add(ToCheckOut);
}
}
LogConsole("Checked Out *************************");
foreach (var CheckedOut in CheckedOuts)
{
LogConsole("{0}", CheckedOut);
}
LogConsole("Failed to check out *************************");
foreach (var ToCheckOut in ToCheckOuts)
{
if (!CheckedOuts.Contains(ToCheckOut))
{
LogConsole("{0}", ToCheckOut);
}
}
LogConsole("*************************");
foreach (var AllGoodStat in AllGoodStats)
{
if (EnumFiles[AllGoodStat].EndsWith(".cpp", StringComparison.InvariantCultureIgnoreCase))
{
var DeclareFileText = ReadAllText(DeclareFiles[AllGoodStat]);
DeclareFileText = DeclareFileText.Replace(DeclareLines[AllGoodStat], "");
WriteAllText(DeclareFiles[AllGoodStat], DeclareFileText);
var EnumFileText = ReadAllText(EnumFiles[AllGoodStat]);
EnumFileText = EnumFileText.Replace(EnumLines[AllGoodStat], DeclareLines[AllGoodStat]);
WriteAllText(EnumFiles[AllGoodStat], EnumFileText);
}
else
{
var DeclareFileText = ReadAllText(DeclareFiles[AllGoodStat]);
DeclareFileText = DeclareFileText.Replace(DeclareLines[AllGoodStat], "DEFINE_STAT(" + AllGoodStat + ");");
WriteAllText(DeclareFiles[AllGoodStat], DeclareFileText);
var EnumFileText = ReadAllText(EnumFiles[AllGoodStat]);
var ExternDeclare = DeclareLines[AllGoodStat];
int Paren = ExternDeclare.IndexOf("(");
ExternDeclare = ExternDeclare.Substring(0, Paren) + "_EXTERN" + ExternDeclare.Substring(Paren);
Paren = ExternDeclare.LastIndexOf(")");
ExternDeclare = ExternDeclare.Substring(0, Paren) + ", " + ExternDeclare.Substring(Paren);
EnumFileText = EnumFileText.Replace(EnumLines[AllGoodStat], ExternDeclare);
WriteAllText(EnumFiles[AllGoodStat], EnumFileText);
}
}
foreach (var AllGoodGroup in AllGoodGroups)
{
var DeclareFileText = ReadAllText(DeclareFiles[AllGoodGroup]);
DeclareFileText = DeclareFileText.Replace(DeclareLines[AllGoodGroup], "");
WriteAllText(DeclareFiles[AllGoodGroup], DeclareFileText);
var EnumFileText = ReadAllText(EnumFiles[AllGoodGroup]);
EnumFileText = EnumFileText.Replace(EnumLines[AllGoodGroup], DeclareLines[AllGoodGroup]);
WriteAllText(EnumFiles[AllGoodGroup], EnumFileText);
}
LogConsole("*************************");
}
}
[Help("custom code to modify the copyright in the code.")]
class UpdateCopyright : BuildCommand
{
public override void ExecuteBuild()
{
LogConsole("************************* UpdateCopyright");
var Wildcards = new List<string>() { "*.h", "*.cpp", "*.inl", "*.cs" };
var Dirs = new List<string>();
Dirs.Add(CombinePaths(CmdEnv.LocalRoot, "Engine", "Plugins"));
{
DirectoryInfo DirInfo = new DirectoryInfo(CmdEnv.LocalRoot);
var TopLevelDirs = DirInfo.GetDirectories();
foreach (var TopLevelDir in TopLevelDirs)
{
if (DirectoryExists_NoExceptions(CombinePaths(TopLevelDir.FullName, "Source")))
{
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Source"));
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Build", "Scripts"));
}
}
}
{
DirectoryInfo DirInfo = new DirectoryInfo(CombinePaths(CmdEnv.LocalRoot, "Samples", "SampleGames"));
var TopLevelDirs = DirInfo.GetDirectories();
foreach (var TopLevelDir in TopLevelDirs)
{
if (DirectoryExists_NoExceptions(CombinePaths(TopLevelDir.FullName, "Source")))
{
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Source"));
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Build", "Scripts"));
}
}
}
{
DirectoryInfo DirInfo = new DirectoryInfo(CombinePaths(CmdEnv.LocalRoot, "Samples", "Showcases"));
var TopLevelDirs = DirInfo.GetDirectories();
foreach (var TopLevelDir in TopLevelDirs)
{
if (DirectoryExists_NoExceptions(CombinePaths(TopLevelDir.FullName, "Source")))
{
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Source"));
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Build", "Scripts"));
}
}
}
{
DirectoryInfo DirInfo = new DirectoryInfo(CombinePaths(CmdEnv.LocalRoot, "Templates"));
var TopLevelDirs = DirInfo.GetDirectories();
foreach (var TopLevelDir in TopLevelDirs)
{
if (DirectoryExists_NoExceptions(CombinePaths(TopLevelDir.FullName, "Source")))
{
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Source"));
Dirs.Add(CombinePaths(TopLevelDir.FullName, "Build", "Scripts"));
}
}
}
var AllFiles = new List<string>();
foreach (var Dir in Dirs)
{
foreach (var Wildcard in Wildcards)
{
foreach (var ThisFile in CommandUtils.FindFiles_NoExceptions(Wildcard, true, Dir))
{
if (!ThisFile.Contains(@"\ThirdParty\"))
{
LogConsole("Source File: {0}", ThisFile);
AllFiles.Add(ThisFile);
}
}
}
}
int WorkingCL = -1;
if (P4Enabled)
{
WorkingCL = P4.CreateChange(P4Env.Client, "Stat code surgery");
LogConsole("Working in {0}", WorkingCL);
}
else
{
throw new AutomationException("this command needs to run with P4.");
}
foreach (var ToCheckOut in AllFiles)
{
if (P4.Edit_NoExceptions(WorkingCL, ToCheckOut))
{
LogConsole("Checked out {0}", ToCheckOut);
}
else if (ToCheckOut.Contains("CodeSurgery"))
{
LogConsole("Couldn't check out {0}", ToCheckOut);
}
else
{
P4.RevertAll(WorkingCL);
throw new AutomationException("Couldn't check out {0}", ToCheckOut);
}
}
var Normal = new HashSet<string>();
var Missing = new HashSet<string>();
foreach (var ThisFile in AllFiles)
{
var FileText = ReadAllText(ThisFile);
if (FileText.Contains("2013 Epic Games, Inc. All Rights Reserved."))
{
FileText = FileText.Replace("2013 Epic Games, Inc. All Rights Reserved.", "2014 Epic Games, Inc. All Rights Reserved.");
WriteAllText(ThisFile, FileText);
Normal.Add(ThisFile);
}
else
{
var Lines = new List<string>(ReadAllLines(ThisFile));
Lines.Insert(0, "// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.");
WriteAllLines(ThisFile, Lines.ToArray());
Missing.Add(ThisFile);
}
}
LogConsole("Normal Copyright *************************");
foreach (var ThisFile in Normal)
{
LogConsole(" {0}", ThisFile);
}
LogConsole("Missing Copyright *************************");
foreach (var ThisFile in Missing)
{
LogConsole(" {0}", ThisFile);
}
}
}