Add Git repository branch name and commit hash injection into generated code module metadata

This commit is contained in:
Wojtek Figat
2026-03-12 14:27:34 +01:00
parent 8318a9c1d0
commit e7016564b1
6 changed files with 88 additions and 3 deletions

View File

@@ -2,6 +2,7 @@
//#define USE_AUTODESK_FBX_SDK
using System.Collections.Generic;
using System.Reflection;
using FlaxEditor.GUI.Dialogs;
using FlaxEngine;
using FlaxEngine.GUI;
@@ -45,9 +46,16 @@ namespace FlaxEditor.Windows
VerticalAlignment = TextAlignment.Center,
Parent = this
};
var assembly = typeof(Editor).Assembly;
var assemblyCopyright = assembly.GetCustomAttribute<AssemblyCopyrightAttribute>();
var assemblyInformationalVersion = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>();
var versionParts = assemblyInformationalVersion.InformationalVersion.Split('+');
string versionInfo = string.Empty;
if (versionParts.Length == 3)
versionInfo = $"\nBranch: {versionParts[1]}+{(versionParts[2].Length == 40 ? versionParts[2].Substring(0, 8) : versionParts[2])}";
new Label(nameLabel.Left, nameLabel.Bottom + 4, nameLabel.Width, 50)
{
Text = string.Format("Version: {0}\nCopyright (c) 2012-2025 Wojciech Figat.\nAll rights reserved.", Globals.EngineVersion),
Text = $"Version: {Globals.EngineVersion}{versionInfo}\n{assemblyCopyright.Copyright.Replace(". ", ".\n")}",
HorizontalAlignment = TextAlignment.Near,
VerticalAlignment = TextAlignment.Near,
Parent = this

View File

@@ -595,7 +595,11 @@ void EngineImpl::InitLog()
#if COMPILE_WITH_DEV_ENV
LOG(Info, "Compiled for Dev Environment");
#endif
#if defined(FLAXENGINE_BRANCH) && defined(FLAXENGINE_COMMIT)
LOG(Info, "Version " FLAXENGINE_VERSION_TEXT ", " FLAXENGINE_BRANCH ", " FLAXENGINE_COMMIT);
#else
LOG(Info, "Version " FLAXENGINE_VERSION_TEXT);
#endif
const Char* cpp = TEXT("?");
if (__cplusplus == 202101L) cpp = TEXT("C++23");
else if (__cplusplus == 202002L) cpp = TEXT("C++20");

View File

@@ -2429,7 +2429,7 @@ namespace Flax.Build.Bindings
contents.AppendLine();
contents.AppendLine($"[assembly: AssemblyTitle(\"{binaryModuleName}\")]");
contents.AppendLine("[assembly: AssemblyDescription(\"\")]");
contents.AppendLine("[assembly: AssemblyConfiguration(\"\")]");
contents.AppendLine($"[assembly: AssemblyConfiguration(\"{buildData.Configuration}\")]");
contents.AppendLine($"[assembly: AssemblyCompany(\"{project.Company}\")]");
contents.AppendLine("[assembly: AssemblyProduct(\"FlaxEngine\")]");
contents.AppendLine($"[assembly: AssemblyCopyright(\"{project.Copyright}\")]");
@@ -2439,6 +2439,7 @@ namespace Flax.Build.Bindings
contents.AppendLine($"[assembly: Guid(\"{id:d}\")]");
contents.AppendLine($"[assembly: AssemblyVersion(\"{project.Version}\")]");
contents.AppendLine($"[assembly: AssemblyFileVersion(\"{project.Version}\")]");
contents.AppendLine($"[assembly: AssemblyInformationalVersion(\"{project.VersionControlInfo}\")]");
#if USE_NETCORE
contents.AppendLine("[assembly: DisableRuntimeMarshalling]");
#endif

View File

@@ -3289,6 +3289,10 @@ namespace Flax.Build.Bindings
contents.AppendLine($"#define {binaryModuleNameUpper}_VERSION_REVISION {version.Revision}");
contents.AppendLine($"#define {binaryModuleNameUpper}_COMPANY \"{project.Company}\"");
contents.AppendLine($"#define {binaryModuleNameUpper}_COPYRIGHT \"{project.Copyright}\"");
if (project.VersionControlBranch.Length != 0)
contents.AppendLine($"#define {binaryModuleNameUpper}_BRANCH \"{project.VersionControlBranch}\"");
if (project.VersionControlCommit.Length != 0)
contents.AppendLine($"#define {binaryModuleNameUpper}_COMMIT \"{project.VersionControlCommit}\"");
contents.AppendLine();
contents.AppendLine("class BinaryModule;");
contents.AppendLine($"extern \"C\" {binaryModuleNameUpper}_API BinaryModule* GetBinaryModule{binaryModuleName}();");

View File

@@ -145,6 +145,7 @@ namespace Flax.Build
public sealed class ProjectInfo
{
private static List<ProjectInfo> _projectsCache;
private string _versionControlCommit, _versionControlBranch;
/// <summary>
/// The project reference.
@@ -232,6 +233,51 @@ namespace Flax.Build
[System.Text.Json.Serialization.JsonConverter(typeof(ConfigurationDictionaryConverter))]
public Dictionary<string, string> Configuration;
/// <summary>
/// Gets the name of the branch from Version Control System (VCS) used by the project. Empty when unused.
/// </summary>
public string VersionControlBranch
{
get
{
if (_versionControlBranch == null)
InitVersionControlInfo();
return _versionControlBranch;
}
}
/// <summary>
/// Gets the commit hash/changeset identifier from Version Control System (VCS) used by the project. Empty when unused.
/// </summary>
public string VersionControlCommit
{
get
{
if (_versionControlCommit == null)
InitVersionControlInfo();
return _versionControlCommit;
}
}
/// <summary>
/// Gets the informative version of the project including any Version Control System (VCS) information such as branch name, commit hash or changeset identifier.
/// </summary>
public string VersionControlInfo
{
get
{
if (_versionControlCommit == null)
InitVersionControlInfo();
var version = Version.ToString();
if (_versionControlBranch.Length != 0)
version += "+" + _versionControlBranch;
if (_versionControlCommit.Length != 0)
version += "+" + _versionControlCommit;
return version;
}
}
/// <summary>
/// True if project is using C#-only and no native toolsets is required to build and use scripts.
/// </summary>
@@ -267,6 +313,26 @@ namespace Flax.Build
});
}
private void InitVersionControlInfo()
{
_versionControlBranch = string.Empty;
_versionControlCommit = string.Empty;
// Git
if (Directory.Exists(Path.Combine(ProjectFolderPath, ".git")))
{
try
{
_versionControlBranch = Utilities.ReadProcessOutput("git", "rev-parse --abbrev-ref HEAD", ProjectFolderPath);
_versionControlCommit = Utilities.ReadProcessOutput("git", "rev-parse HEAD", ProjectFolderPath);
}
catch (Exception)
{
// Ignored
}
}
}
/// <summary>
/// Gets all projects including this project, it's references and their references (any deep level of references).
/// </summary>

View File

@@ -587,8 +587,9 @@ namespace Flax.Build
/// </summary>
/// <param name="filename">The executable file path.</param>
/// <param name="args">The custom arguments.</param>
/// <param name="workspace">The custom folder to run program in it.</param>
/// <returns>Returned process output.</returns>
public static string ReadProcessOutput(string filename, string args = null)
public static string ReadProcessOutput(string filename, string args = null, string workspace = null)
{
Process p = new Process
{
@@ -599,6 +600,7 @@ namespace Flax.Build
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
WorkingDirectory = workspace,
}
};
p.Start();