Skip to content

Commit 3314261

Browse files
committed
[ZH] Generate git version information and print it in the Game Window title, Main Menu and Options Menu
1 parent a8c703f commit 3314261

File tree

11 files changed

+661
-97
lines changed

11 files changed

+661
-97
lines changed

Core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ target_include_directories(corei_libraries_source_wwvegas_wwlib INTERFACE "Libra
1212
target_link_libraries(corei_always INTERFACE
1313
core_utility
1414
corei_libraries_include
15+
resources
1516
)
1617

1718
# Set where the build results will end up

GeneralsMD/Code/GameEngine/Include/Common/version.h

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#ifndef __VERSION_H__
3232
#define __VERSION_H__
3333

34+
#include <time.h>
35+
3436
/**
3537
* The Version class formats the version number into integer and string
3638
* values for different parts of the game.
@@ -40,16 +42,26 @@ class Version
4042
{
4143
public:
4244
Version();
43-
UnsignedInt getVersionNumber( void ); ///< Return a 4-byte integer suitable for WOLAPI
44-
AsciiString getAsciiVersion( void ); ///< Return a human-readable version number
45-
UnicodeString getUnicodeVersion( void ); ///< Return a human-readable version number
46-
UnicodeString getFullUnicodeVersion( void ); ///< Return a human-readable version number
47-
AsciiString getAsciiBuildTime( void ); ///< Return a formated date/time string for build time
48-
UnicodeString getUnicodeBuildTime( void ); ///< Return a formated date/time string for build time
49-
AsciiString getAsciiBuildLocation( void ); ///< Return a string with the build location
50-
UnicodeString getUnicodeBuildLocation( void ); ///< Return a string with the build location
51-
AsciiString getAsciiBuildUser( void ); ///< Return a string with the build user
52-
UnicodeString getUnicodeBuildUser( void ); ///< Return a string with the build user
45+
46+
UnsignedInt getVersionNumber( void ) const; ///< Return a 4-byte integer suitable for WOLAPI
47+
AsciiString getAsciiVersion( void ) const; ///< Return a human-readable version number
48+
UnicodeString getUnicodeVersion( void ) const; ///< Return a human-readable version number
49+
AsciiString getAsciiBuildTime( void ) const; ///< Return a formated date/time string for build time
50+
UnicodeString getUnicodeBuildTime( void ) const; ///< Return a formated date/time string for build time
51+
AsciiString getAsciiBuildLocation( void ) const; ///< Return a string with the build location
52+
UnicodeString getUnicodeBuildLocation( void ) const; ///< Return a string with the build location
53+
AsciiString getAsciiBuildUser( void ) const; ///< Return a string with the build user
54+
UnicodeString getUnicodeBuildUser( void ) const; ///< Return a string with the build user
55+
56+
static Int getGitRevision();
57+
static time_t getGitCommitTime();
58+
AsciiString getAsciiGitRevision( void ) const { return m_asciiGitRevision; }
59+
AsciiString getAsciiGitVersion( void ) const { return m_asciiGitVersion; }
60+
AsciiString getAsciiGitCommitTime( void ) const { return m_asciiGitCommitTime; }
61+
UnicodeString getUnicodeGitRevision( void ) const { return m_unicodeGitRevision; }
62+
UnicodeString getUnicodeGitVersion( void ) const { return m_unicodeGitVersion; }
63+
UnicodeString getUnicodeGitCommitTime( void ) const { return m_unicodeGitCommitTime; }
64+
UnicodeString getUnicodeGameAndGitVersion( void ) const;
5365

5466
Bool showFullVersion( void ) { return m_showFullVersion; }
5567
void setShowFullVersion( Bool val ) { m_showFullVersion = val; }
@@ -58,6 +70,14 @@ class Version
5870
Int localBuildNum, AsciiString user, AsciiString location,
5971
AsciiString buildTime, AsciiString buildDate); ///< Set version info
6072

73+
private:
74+
static AsciiString buildAsciiGitRevision();
75+
static AsciiString buildAsciiGitVersion();
76+
static AsciiString buildAsciiGitCommitTime();
77+
static UnicodeString buildUnicodeGitRevision();
78+
static UnicodeString buildUnicodeGitVersion();
79+
static UnicodeString buildUnicodeGitCommitTime();
80+
6181
private:
6282
Int m_major;
6383
Int m_minor;
@@ -67,6 +87,12 @@ class Version
6787
AsciiString m_buildUser;
6888
AsciiString m_buildTime;
6989
AsciiString m_buildDate;
90+
AsciiString m_asciiGitRevision;
91+
AsciiString m_asciiGitVersion;
92+
AsciiString m_asciiGitCommitTime;
93+
UnicodeString m_unicodeGitRevision;
94+
UnicodeString m_unicodeGitVersion;
95+
UnicodeString m_unicodeGitCommitTime;
7096
Bool m_showFullVersion;
7197
};
7298

GeneralsMD/Code/GameEngine/Source/Common/version.cpp

Lines changed: 117 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include "GameClient/GameText.h"
3232
#include "Common/version.h"
3333

34+
#include "gitinfo.h"
35+
3436
Version *TheVersion = NULL; ///< The Version singleton
3537

3638
Version::Version()
@@ -39,8 +41,14 @@ Version::Version()
3941
m_minor = 0;
4042
m_buildNum = 0;
4143
m_localBuildNum = 0;
42-
m_buildUser = AsciiString("somebody");
43-
m_buildLocation = AsciiString("somewhere");
44+
m_buildUser = "somebody";
45+
m_buildLocation = "somewhere";
46+
m_asciiGitRevision = buildAsciiGitRevision();
47+
m_asciiGitVersion = buildAsciiGitVersion();
48+
m_asciiGitCommitTime = buildAsciiGitCommitTime();
49+
m_unicodeGitRevision = buildUnicodeGitRevision();
50+
m_unicodeGitVersion = buildUnicodeGitVersion();
51+
m_unicodeGitCommitTime = buildUnicodeGitCommitTime();
4452
#if defined RTS_DEBUG || defined RTS_INTERNAL
4553
m_showFullVersion = TRUE;
4654
#else
@@ -62,12 +70,12 @@ void Version::setVersion(Int major, Int minor, Int buildNum,
6270
m_buildDate = buildDate;
6371
}
6472

65-
UnsignedInt Version::getVersionNumber( void )
73+
UnsignedInt Version::getVersionNumber( void ) const
6674
{
6775
return m_major << 16 | m_minor;
6876
}
6977

70-
AsciiString Version::getAsciiVersion( void )
78+
AsciiString Version::getAsciiVersion( void ) const
7179
{
7280
AsciiString version;
7381
#if defined RTS_DEBUG || defined RTS_INTERNAL
@@ -83,19 +91,22 @@ AsciiString Version::getAsciiVersion( void )
8391
return version;
8492
}
8593

86-
UnicodeString Version::getUnicodeVersion( void )
94+
UnicodeString Version::getUnicodeVersion( void ) const
8795
{
8896
UnicodeString version;
8997

90-
#if defined RTS_DEBUG || defined RTS_INTERNAL
91-
if (!m_localBuildNum)
92-
version.format(TheGameText->fetch("Version:Format3").str(), m_major, m_minor, m_buildNum);
98+
if (m_showFullVersion)
99+
{
100+
if (!m_localBuildNum)
101+
version.format(TheGameText->fetch("Version:Format3").str(), m_major, m_minor, m_buildNum);
102+
else
103+
version.format(TheGameText->fetch("Version:Format4").str(), m_major, m_minor, m_buildNum, m_localBuildNum,
104+
m_buildUser.getCharAt(0), m_buildUser.getCharAt(1));
105+
}
93106
else
94-
version.format(TheGameText->fetch("Version:Format4").str(), m_major, m_minor, m_buildNum, m_localBuildNum,
95-
m_buildUser.getCharAt(0), m_buildUser.getCharAt(1));
96-
#else // defined RTS_DEBUG || defined RTS_INTERNAL
97-
version.format(TheGameText->fetch("Version:Format2").str(), m_major, m_minor);
98-
#endif // defined RTS_DEBUG || defined RTS_INTERNAL
107+
{
108+
version.format(TheGameText->fetch("Version:Format2").str(), m_major, m_minor);
109+
}
99110

100111
#ifdef RTS_DEBUG
101112
version.concat(UnicodeString(L" Debug"));
@@ -108,36 +119,15 @@ UnicodeString Version::getUnicodeVersion( void )
108119
return version;
109120
}
110121

111-
UnicodeString Version::getFullUnicodeVersion( void )
112-
{
113-
UnicodeString version;
114-
115-
if (!m_localBuildNum)
116-
version.format(TheGameText->fetch("Version:Format3").str(), m_major, m_minor, m_buildNum);
117-
else
118-
version.format(TheGameText->fetch("Version:Format4").str(), m_major, m_minor, m_buildNum, m_localBuildNum,
119-
m_buildUser.getCharAt(0), m_buildUser.getCharAt(1));
120-
121-
#ifdef RTS_DEBUG
122-
version.concat(UnicodeString(L" Debug"));
123-
#endif
124-
125-
#ifdef RTS_INTERNAL
126-
version.concat(UnicodeString(L" Internal"));
127-
#endif
128-
129-
return version;
130-
}
131-
132-
AsciiString Version::getAsciiBuildTime( void )
122+
AsciiString Version::getAsciiBuildTime( void ) const
133123
{
134124
AsciiString timeStr;
135125
timeStr.format("%s %s", m_buildDate.str(), m_buildTime.str());
136126

137127
return timeStr;
138128
}
139129

140-
UnicodeString Version::getUnicodeBuildTime( void )
130+
UnicodeString Version::getUnicodeBuildTime( void ) const
141131
{
142132
UnicodeString build;
143133
UnicodeString dateStr;
@@ -150,34 +140,117 @@ UnicodeString Version::getUnicodeBuildTime( void )
150140
return build;
151141
}
152142

153-
AsciiString Version::getAsciiBuildLocation( void )
143+
AsciiString Version::getAsciiBuildLocation( void ) const
154144
{
155-
return AsciiString(m_buildLocation);
145+
return m_buildLocation;
156146
}
157147

158-
UnicodeString Version::getUnicodeBuildLocation( void )
148+
UnicodeString Version::getUnicodeBuildLocation( void ) const
159149
{
160150
UnicodeString build;
161151
UnicodeString machine;
162152

163-
machine.translate(AsciiString(m_buildLocation));
153+
machine.translate(m_buildLocation);
164154
build.format(TheGameText->fetch("Version:BuildMachine").str(), machine.str());
165155

166156
return build;
167157
}
168158

169-
AsciiString Version::getAsciiBuildUser( void )
159+
AsciiString Version::getAsciiBuildUser( void ) const
170160
{
171-
return AsciiString(m_buildUser);
161+
return m_buildUser;
172162
}
173163

174-
UnicodeString Version::getUnicodeBuildUser( void )
164+
UnicodeString Version::getUnicodeBuildUser( void ) const
175165
{
176166
UnicodeString build;
177167
UnicodeString user;
178168

179-
user.translate(AsciiString(m_buildUser));
169+
user.translate(m_buildUser);
180170
build.format(TheGameText->fetch("Version:BuildUser").str(), user.str());
181171

182172
return build;
183173
}
174+
175+
Int Version::getGitRevision()
176+
{
177+
return GitRevision;
178+
}
179+
180+
time_t Version::getGitCommitTime()
181+
{
182+
return GitCommitTimeStamp;
183+
}
184+
185+
UnicodeString Version::getUnicodeGameAndGitVersion( void ) const
186+
{
187+
UnicodeString str;
188+
if (m_showFullVersion)
189+
{
190+
str.format(L"%s %s %s",
191+
getUnicodeVersion().str(),
192+
getUnicodeGitRevision().str(),
193+
getUnicodeGitVersion().str());
194+
}
195+
else
196+
{
197+
str.format(L"%s %s",
198+
getUnicodeVersion().str(),
199+
getUnicodeGitRevision().str());
200+
}
201+
return str;
202+
}
203+
204+
AsciiString Version::buildAsciiGitRevision()
205+
{
206+
AsciiString str;
207+
str.format("R %s%d",
208+
GitUncommittedChanges ? "~" : "",
209+
GitRevision);
210+
return str;
211+
}
212+
213+
AsciiString Version::buildAsciiGitVersion()
214+
{
215+
AsciiString str;
216+
str.format("%s%s",
217+
GitUncommittedChanges ? "~" : "",
218+
GitTag[0] ? GitTag : GitShortSHA1);
219+
return str;
220+
}
221+
222+
AsciiString Version::buildAsciiGitCommitTime()
223+
{
224+
const Int len = 19;
225+
AsciiString str;
226+
Char* buf = str.getBufferForRead(len);
227+
tm* time = gmtime(&GitCommitTimeStamp);
228+
strftime(buf, len+1, "%Y-%m-%d %H:%M:%S", time);
229+
return str;
230+
}
231+
232+
UnicodeString Version::buildUnicodeGitRevision()
233+
{
234+
UnicodeString str;
235+
str.format(L"R %s%d",
236+
GitUncommittedChanges ? L"~" : L"",
237+
GitRevision);
238+
return str;
239+
}
240+
241+
UnicodeString Version::buildUnicodeGitVersion()
242+
{
243+
UnicodeString str;
244+
str.translate(buildAsciiGitVersion());
245+
return str;
246+
}
247+
248+
UnicodeString Version::buildUnicodeGitCommitTime()
249+
{
250+
const Int len = 19;
251+
UnicodeString str;
252+
WideChar* buf = str.getBufferForRead(len);
253+
tm* time = gmtime(&GitCommitTimeStamp);
254+
wcsftime(buf, len+1, L"%Y-%m-%d %H:%M:%S", time);
255+
return str;
256+
}

GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,36 @@ GameWindow *win = NULL;
447447
win->winHide(TRUE);
448448

449449
}
450+
451+
// TheSuperHackers @tweak Now prints version information in an optional version label.
452+
// Originally this label does not exist in the Main Menu. It can be copied from the Options Menu.
453+
static void initLabelVersion()
454+
{
455+
NameKeyType versionID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:LabelVersion") );
456+
GameWindow *labelVersion = TheWindowManager->winGetWindowFromId( NULL, versionID );
457+
458+
if (labelVersion)
459+
{
460+
if (TheVersion && TheGlobalData)
461+
{
462+
UnicodeString version;
463+
version.format(
464+
L"%s %s exe:%08X ini:%08X %s",
465+
TheVersion->getUnicodeGameAndGitVersion().str(),
466+
TheVersion->getUnicodeGitCommitTime().str(),
467+
TheGlobalData->m_exeCRC,
468+
TheGlobalData->m_iniCRC,
469+
TheVersion->getUnicodeBuildUser().str()
470+
);
471+
GadgetStaticTextSetText( labelVersion, version );
472+
}
473+
else
474+
{
475+
labelVersion->winHide( TRUE );
476+
}
477+
}
478+
}
479+
450480
//-------------------------------------------------------------------------------------------------
451481
/** Initialize the main menu */
452482
//-------------------------------------------------------------------------------------------------
@@ -476,7 +506,6 @@ void MainMenuInit( WindowLayout *layout, void *userData )
476506
exitID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:ButtonExit") );
477507
motdID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:ButtonMOTD") );
478508
worldBuilderID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:ButtonWorldBuilder") );
479-
// NameKeyType versionID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:LabelVersion") );
480509
getUpdateID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:ButtonGetUpdate") );
481510
// buttonTRAININGID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:ButtonTRAINING") );
482511
buttonChallengeID = TheNameKeyGenerator->nameToKey( AsciiString("MainMenu.wnd:ButtonChallenge") );
@@ -526,9 +555,6 @@ void MainMenuInit( WindowLayout *layout, void *userData )
526555
buttonHard = TheWindowManager->winGetWindowFromId( parentMainMenu, buttonHardID );
527556
buttonDiffBack = TheWindowManager->winGetWindowFromId( parentMainMenu, buttonDiffBackID );
528557

529-
530-
// GameWindow *labelVersion = TheWindowManager->winGetWindowFromId( parentMainMenu, versionID );
531-
532558
getUpdate = TheWindowManager->winGetWindowFromId( parentMainMenu, getUpdateID );
533559
// buttonTRAINING = TheWindowManager->winGetWindowFromId( parentMainMenu, buttonTRAININGID );
534560
buttonChallenge = TheWindowManager->winGetWindowFromId( parentMainMenu, buttonChallengeID );
@@ -578,22 +604,10 @@ void MainMenuInit( WindowLayout *layout, void *userData )
578604
25, 54,
579605
180, 26,
580606
&instData, NULL, TRUE );
581-
582-
// if (TheVersion)
583-
// {
584-
// UnicodeString version;
585-
// version.format(L"%s\n%s", TheVersion->getUnicodeVersion().str(), TheVersion->getUnicodeBuildTime().str());
586-
// GadgetStaticTextSetText( labelVersion, version );
587-
// }
588-
// else
589-
// {
590-
// labelVersion->winHide( TRUE );
591-
// }
592-
//#else
593-
594-
// GadgetStaticTextSetText( labelVersion, TheVersion->getUnicodeVersion() );
595607
#endif
596608

609+
initLabelVersion();
610+
597611
//TheShell->registerWithAnimateManager(buttonCampaign, WIN_ANIMATION_SLIDE_LEFT, TRUE, 800);
598612
//TheShell->registerWithAnimateManager(buttonSkirmish, WIN_ANIMATION_SLIDE_LEFT, TRUE, 600);
599613
// TheShell->registerWithAnimateManager(buttonSinglePlayer, WIN_ANIMATION_SLIDE_LEFT, TRUE, 400);

0 commit comments

Comments
 (0)