Files
UnrealEngineUWP/Engine/Source/Programs/AutomationTool/Scripts/StreamCopyDescription.Automation.cs
Joe Barnes e77dc59ccc Copying //UE4/Dev-Console to //UE4/Dev-Main (Source: //UE4/Dev-Console @ 3505701)
#lockdown Nick.Penwarden
#rb none

=====================================
 MAJOR FEATURES + CHANGES
=====================================

Change 3484422 by Daniel.Eldar

	[PS4]

	Playstation Texture lookup code now same as other platform as the PS4 shader compiler now supports switch statements.

	#JIRA UE-39856

Change 3486871 by Daniel.Eldar

	[PS4]

	Added support to visualize the CMask in the vis command in the console.
	(This also adds support for all other UINT8 textures)

Change 3486877 by Daniel.Eldar

	[PS4]

	DBuffer decals optimisation is now fixed on PSVR.

	#JIRA UE-40383

Change 3486935 by Daniel.Eldar

	[General]

	Fixed a small compilation bug in the visualize shader for CL 3486871.

Change 3487400 by Josh.Adams

	- Updated the "merge to main CL description maker" script to split the CLs up into multiple files depending on changes being made to NDA platforms directories

Change 3488955 by Daniel.Eldar

	[General]

	The symbol cache will now be generated for the appropriate platforms.

	#JIRA UE-44718

	#3539

Change 3491593 by Ben.Woodhouse

	[D3D12] Add some additional pixel formats to ComputeBytesPerPixel. In particular,
		case DXGI_FORMAT_R32_TYPELESS:
		case DXGI_FORMAT_R32_FLOAT:

Change 3496287 by Josh.Adams

	- Fixed minor issue where Multi text file would always be opened

Change 3498054 by Keith.Judge

	Make Crash Malloc work if Binned2 is previous Malloc. Fixes callstack issues for non-gamethread crashes.

Change 3498188 by Daniel.Eldar

	[PS4]

	Fixed an ensure which fires when the -norhithread flag is used.

	#JIRA UE-41150

Change 3498358 by Keith.Judge

	Xbox One - Added XboxOnePDBFileUtil.exe to the installed engine filters.

Change 3500276 by Daniel.Eldar

	[PS4]

	Mesh particle systems now bind the previous transform of the particles which removes the asset of "Resource at slot x, was not bound..." when LCUE debug is on.

	#JIRA UE-39093

Change 3500531 by Keith.Judge

	Xbox One - Removed some bad assumptions about GPU memory handing over to the RHI in ContainerAllocationPolicies. Due to how PLATFORM_HAS_UMA is defined, this only affects DX11.x.

	#jira UE-45867

Change 3503080 by Ben.Woodhouse

	Fix for slate postprocess issue reported by SebA (copy/dest were the wrong way around in a TransitionResources call)

	#jira UE-46321

Change 3504554 by Keith.Judge

	Xbox One - Add a TitleID and Service Config ID to QAGame (along with a backend config) so that save/load works in TM-Gameplay

	#jira UE-44814

Change 3505443 by Luke.Thatcher

	[CONSOLE] [!] Fix missing include in LinuxPlatformProcess.cpp

[CL 3505715 by Joe Barnes in Main branch]
2017-06-22 15:56:19 -04:00

223 lines
7.4 KiB
C#

// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Reflection;
using System.Linq;
using AutomationTool;
using UnrealBuildTool;
namespace AutomationTool
{
/// <summary>
/// Generates a changelist description for copying a stream to its parent
/// </summary>
[RequireP4]
public class StreamCopyDescription : BuildCommand
{
/// <summary>
/// Hunts down the list of confidential platforms, based on ConfidentialPlatform.ini in the Engine/Config directory (this way we don't
/// need to hardcode the platform names!)
/// </summary>
/// <returns></returns>
private string[] GetPlatformNames()
{
List<string> Platforms = new List<string>();
// two special platform names (for non-special, and combined CLs that affect multiple confidential platforms)
Platforms.Add("");
Platforms.Add("Multi");
foreach (string Dir in Directory.EnumerateDirectories(Path.Combine(EngineDirectory.FullName, "Config")))
{
if (File.Exists(Path.Combine(Dir, "ConfidentialPlatform.ini")))
{
Platforms.Add(Path.GetFileName(Dir));
}
}
return Platforms.ToArray();
}
/// <summary>
/// Execute the command
/// </summary>
public override void ExecuteBuild()
{
// Get the source and target streams
string Stream = ParseParamValue("Stream", P4Env.BuildRootP4);
string Changes = ParseParamValue("Changes", null);
string Lockdown = ParseParamValue("Lockdown", "Nick.Penwarden");
bool bPlatformSplit = !ParseParam("CombinePlatforms");
// Get changes which haven't been copied up from the current stream
string AllDescriptions;
string SourceStream;
string VerbosityFlag = bPlatformSplit ? "" : "-l";
int LastCl;
string[] Platforms = GetPlatformNames();
StringBuilder[] DescriptionBuilders = new StringBuilder[Platforms.Length];
for (int Index = 0; Index < Platforms.Length; Index++)
{
DescriptionBuilders[Index] = new StringBuilder();
}
if (Changes == null)
{
IProcessResult Result = P4.P4(String.Format("interchanges {0} -S {1}", VerbosityFlag, Stream), AllowSpew: false);
AllDescriptions = Result.Output;
SourceStream = Stream;
// Get the last submitted change in the source stream
List<P4Connection.ChangeRecord> ChangeRecords;
if (!P4.Changes(out ChangeRecords, String.Format("-m1 {0}/...", SourceStream), AllowSpew: false))
{
throw new AutomationException("Couldn't get changes for this branch");
}
LastCl = ChangeRecords[0].CL;
}
else
{
IProcessResult Result = P4.P4(String.Format("changes {0} {1}", VerbosityFlag, Changes), AllowSpew: false);
AllDescriptions = Result.Output;
SourceStream = Regex.Replace(Changes, @"(\/(?:\/[^\/]*){2}).*", "$1");
LastCl = Int32.Parse(Regex.Replace(Changes, ".*,", ""));
}
if (bPlatformSplit)
{
string[] Lines = AllDescriptions.Split("\n".ToCharArray());
foreach (string Line in Lines)
{
// @todo replace with regexes!!
string[] Tokens = Line.Split(" ".ToCharArray());
if (Tokens.Length > 2 && Tokens[0] == "Change")
{
IProcessResult Result = P4.P4(String.Format("describe -s {0}", Tokens[1]), AllowSpew: false);
// Affected files ... is the splitting point
int AffectedFilesPos = Result.Output.IndexOf("Affected files ...");
string Description = Result.Output.Substring(0, AffectedFilesPos);
string Files = Result.Output.Substring(AffectedFilesPos);
// look for the NDA platforms in the list of files (skipping over the "no" and "multi" platforms
int WhichPlatform = 0;
for (int Index = 2; Index < Platforms.Length; Index++)
{
// we search by directory in the form of /Platform/
if (Files.Contains("/" + Platforms[Index] + "/"))
{
// if we contained multiple files, then we put into the Multi file, and someone will have to manually deal with it!!
if (WhichPlatform == 0)
{
WhichPlatform = Index;
}
else
{
WhichPlatform = 1;
}
}
}
// add this description to the proper platform
DescriptionBuilders[WhichPlatform].AppendLine(Description);
}
}
}
else
{
DescriptionBuilders[0].Append(AllDescriptions);
}
for (int PlatformIndex = 0; PlatformIndex < Platforms.Length; PlatformIndex++)
{
string Desc = DescriptionBuilders[PlatformIndex].ToString().Replace("\r\n", "\n");
// Clean any workspace names that may reveal internal information
Desc = Regex.Replace(Desc, "(Change[^@]*)@.*", "$1", RegexOptions.Multiline);
// Remove changes by the build machine
Desc = Regex.Replace(Desc, "[^\n]*buildmachine\n(\n|\t[^\n]*\n)*", "");
// Remove all the tags we don't care about
Desc = Regex.Replace(Desc, "^[ \t]*#(rb|fyi|codereview|lockdown)\\s.*$", "", RegexOptions.Multiline);
// Empty out lines which just contain whitespace
Desc = Regex.Replace(Desc, "^[ \t]+$", "", RegexOptions.Multiline);
// Remove multiple consecutive blank lines
Desc = Regex.Replace(Desc, "\n\n+", "\n\n");
// Only include one newline at the end of each description
Desc = Regex.Replace(Desc, "\n+Change", "\n\nChange");
// Remove merge-only changelists
Desc = Regex.Replace(Desc, "(?<=(^|\\n))Change .*\\s*Merging .* to .*\\s*\\n(?=(Change|$))", "");
if (string.IsNullOrEmpty(Desc))
{
continue;
}
// Figure out the target stream
IProcessResult StreamResult = P4.P4(String.Format("stream -o {0}", Stream), AllowSpew: false);
if (StreamResult.ExitCode != 0)
{
throw new AutomationException("Couldn't get stream description for {0}", Stream);
}
string Target = P4Spec.FromString(StreamResult.Output).GetField("Parent");
if (Target == null)
{
throw new AutomationException("Couldn't get parent stream for {0}", Stream);
}
// Write the output file
string OutputDirName = Path.Combine(CommandUtils.CmdEnv.LocalRoot, "Engine", "Intermediate");
CommandUtils.CreateDirectory(OutputDirName);
string OutputFileName = Path.Combine(OutputDirName, string.Format("Changes{0}.txt", Platforms[PlatformIndex]));
using (StreamWriter Writer = new StreamWriter(OutputFileName))
{
if (PlatformIndex == 1)
{
Writer.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
Writer.WriteLine("CHANGES WITH MULTIPLE PLATFORMS!!! YOU MUST COPY THESE INTO THE OTHER ONES AS MAKES SENSE!!");
Writer.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
Writer.WriteLine();
Writer.WriteLine();
}
else
{
Writer.WriteLine("Copying {0} to {1} (Source: {2} @ {3})", Stream, Target.Trim(), SourceStream, LastCl);
Writer.WriteLine("#lockdown {0}", Lockdown);
Writer.WriteLine();
Writer.WriteLine("=====================================");
Writer.WriteLine("{0} MAJOR FEATURES + CHANGES", Platforms[PlatformIndex]);
Writer.WriteLine("=====================================");
Writer.WriteLine();
}
foreach (string Line in Desc.Split('\n'))
{
Writer.WriteLine(Line);
}
Writer.WriteLine("DONE!");
}
Log("Written {0}.", OutputFileName);
// Open it with the default text editor
Process.Start(OutputFileName);
}
}
}
}